使用Python发送邮件附件以定时备份MySQL的教程


Posted in Python onApril 25, 2015

最近迁移了wordpress,系统升级为CentOS 6,很奇怪的一个问题,在原来CentOS 5.8下用的很正常的定时备份数据库并通过邮件发送的脚本不能发送附件,其他都正常,邮件内容也是uuencode生成的文件编码,但是就是不产生附件.而且找不出原因,望有知道的不吝赐教.

为了解决这一问题,我用Python写了一个mail客户端,可以发送附件,是一个命令行程序.废话不多说.贴代码:

#!/usr/bin/env python
#-*- coding: utf8 -*-
'''
#=============================================================================
#   FileName: mail.py
#     Desc: To send email
#    Author: cold
#    Email: wh_linux@126.com
#   HomePage: http://www.linuxzen.com
#   Version: 0.0.1
#  LastChange: 2012-04-21 16:37:20
#   History:
#=============================================================================
'''

'''
用于发送邮件,可以发送附件
命令行程序
'''
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import sys



# 打印帮助信息
def helpinfo():
  print '''
  Useage: pymail -u user@domain -p passwd -h smtp server host -t to who [-a attachment file path] [-n attachment name]
  Useage: email content use . to end
  -h specify smtp server host
  -u which user you login the smtp server,and must with it domain
  -p the password of the smtp user
  -t The email recipient,multiple addresses can use ',' split
  -a Add attachment
  -n Secify attachment name in the email

  Author:cold(wh_linux@126.com)
  Homepge:http://www.linuxzen.com
  '''


# 所有选项
options = ['-t', '-a', '-n', '-h', '-u', '-p', '-s']

# 获取选项长度
argvnum = len(sys.argv)

# 检测命令行参数
for i in range(argvnum):
  if ( i %2 != 0):
    if (sys.argv[i] not in options):
      print 'Unknow option ', sys.argv[i] , ', Please use -h see help!'
      sys.exit(3)

# 如果是-h或者没有命令行参数则显示帮助
try:
  if sys.argv[1] == '-h' or len(sys.argv) == 0:
    helpinfo()
except:
  helpinfo()


# 检测-n参数
if ('-n' in sys.argv) and ('-a' not in sys.argv):
  print 'Error:option "-n" must use after -a'
  sys.exit(2)

# 下面则是获取各个参数内容
try:
  tmpmailto = sys.argv[sys.argv.index('-t') + 1]
  if ',' in tmpmailto:
    mailto = tmpmailto.split(',')
  else:
    mailto = [tmpmailto,]
except ValueError:
  print 'Error: need Mail Recipient'
  sys.exit(1)

haveattr=True

try:
  attrpath = sys.argv[sys.argv.index('-a') + 1]
  try:
    attrname = sys.argv[sys.argv.index('-n') +1 ]
  except ValueError:
    attrname = attrpath.split('/')[-1]
except:
  attrname = None
  haveattr = False
  attrpath = None


try:
  mail_host = sys.argv[sys.argv.index('-h') +1]
except ValueError:
  print 'Waring: No specify smtp server use 127.0.0.1'
  mail_host = '127.0.0.1'


try:
  mail_useremail = sys.argv[sys.argv.index('-u') +1]
except ValueError:
  print 'Waring: No specify user, use root'
  mail_useremail = 'root@localhost'

try:
  mail_sub = sys.argv[sys.argv.index('-s') + 1]
except:
  mail_sub = 'No Subject'

mail_user = mail_useremail.split('@')[0]
mail_postfix = mail_useremail.split('@')[1]

try:
  mail_pass = sys.argv[sys.argv.index('-p') +1]
except ValueError:
  mail_pass = ''




# 定义邮件发送函数
def send_mail(to_list, sub, content, haveattr, attrpath, attrname):
  me = mail_user + "<" + mail_user+"@"+mail_postfix +">"

  # 判断是否有附件
  if (haveattr):
    if (not attrpath):
      print 'Error : no input file of attachments'
      return False

    # 有附件则创建一个带附件的实例
    msg = MIMEMultipart()

    # 构造附件
    att = MIMEText(open(attrpath, 'rb').read(),'base64', 'utf8')
    att["Content-Type"] = 'application/octest-stream'
    att["Content-Disposition"] = 'attachment;filename="'+ attrname +'"'
    msg.attach(att)
    msg.attach(MIMEText(content))
  else:
    # 无责创建一个文本的实例
    msg = MIMEText(content)


  # 邮件头
  msg['Subject'] = sub
  msg['From'] = me
  msg['To'] = ";".join(to_list)
  try:
    # 发送邮件
    s = smtplib.SMTP()
    s.connect(mail_host)
    if (mail_host != '127.0.0.1'):
      s.login(mail_user, mail_pass)
    s.sendmail(me, to_list, msg.as_string())
    s.close()
    return True
  except Exception, e:
    print str(e)
    return False

if __name__ == '__main__':

  try:
    content = ''
    while True:
      c = raw_input('')
      if c == '.':
        break
      content += c + '\n'
  except EOFError:
    for line in sys.stdin:
      content += line
  if send_mail(mailto, mail_sub, content, haveattr, attrpath, attrname):
    print "Success"
  else:
    print "Failed"

将这个脚本保存为pymail放到/usr/bin/下,并赋予其执行权限:

chmod +x /usr/bin/pymail

可以使用 -h指定smtp发件服务器,默认认为指定-h需要认证, 所以就需要smtp服务器支持认证,同时需要-u指定用户名(需加"@域名"),-p指定密码. 如果不指定-h就会使用本地smtp服务器,默认不需要认证,所以本地的smtp服务器就不能支持认证,同时不需指定-u,-p参数

-t 指定收件人多个可用,号分割.
-a 指定附件路径
-n 指定附件名(可省略)
-h 显示帮助信息.
-s 指定邮件主题

执行后会要求输入邮件内容,写完用.结束 也可以用管道下面给出几个实例:

#使用本地smtp服务发送
echo 'linuxzen.com backup' | pymail -s "Linuxzen backup" -t 123456@qq.com -a /tmp/linuxzen.tar.gz
# 使用126邮箱发送
echo 'linuxzen.com backup' | pymail -u linuxzen@126.com -p linuxzen.com -h smtp.126.com -s 'Linuxzen backup " -t 123456@qq.com -a /tmp/linuxzen.tar.gz 

# 不使用管道发送
pymail -u linuxzen@126.com -p linuxzen.com -h smtp.126.com -s 'hello world' -t 123456@qq.com -a /tmp/linuxzen.tar.gz
Hello
this is a test mail
.

下面之前使用的mysql定时备份的脚本:

#!/bin/bash
export PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
DATE=`date +%Y%m%d`
mysqldump -u root blogdata > /tmp/blogdate."$DATE".sql
cd /tmp
tar -zcf blogdata."$DATE".sql.tar.gz blogdata."$DATE".sql
uuencode blogdata."$DATE".sql.tar.gz blogdata."$DATE".sql.tar.gz | mail -s 'MySQL Backup' 123456@qq.com

没有命令uuencode安装sharutils包即可

yum -y install sharutils

然后使用crontab调用这个脚本定时执行,前面说了 这个脚本在CentOS5.x下正常工作,但是放到CentOS6下就不带附件,所以使用我们自己编写的python脚本脚本内容如下:
 

#!/bin/bash
export PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
DATE=`date +%Y%m%d`
mysqldump -u root blogdata > /tmp/myblog."$DATE".sql
cd /tmp
tar -zcf blogdata."$DATE".sql.tar.gz myblog."$DATE".sql
echo 'MySQL backup' | pymail -u linuzen@126.com -p linuxzen.com -h smtp.126.com -s 'MySQL backup' -a /tmp/blogdata."$DATE".sql.tar.gz -t 123456@qq.com
我们使用126邮箱来发送 这样就可以把自带的sendmail 停掉:
service sendmail stop
chkonfig --del sendmail

 

Python 相关文章推荐
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
Nov 18 Python
让Python代码更快运行的5种方法
Jun 21 Python
python抓取并保存html页面时乱码问题的解决方法
Jul 01 Python
Python实现的简单读写csv文件操作示例
Jul 12 Python
python之pexpect实现自动交互的例子
Jul 25 Python
Python数据可视化:箱线图多种库画法
Nov 06 Python
python实现身份证实名认证的方法实例
Nov 08 Python
python numpy数组中的复制知识解析
Feb 03 Python
Python requests获取网页常用方法解析
Feb 20 Python
Python sys模块常用方法解析
Feb 20 Python
Python利用PyPDF2库获取PDF文件总页码实例
Apr 03 Python
python爬虫可以爬什么
Jun 16 Python
安装Python的web.py框架并从hello world开始编程
Apr 25 #Python
用Python编写一个基于终端的实现翻译的脚本
Apr 24 #Python
Python的Bottle框架中获取制定cookie的教程
Apr 24 #Python
利用Python的装饰器解决Bottle框架中用户验证问题
Apr 24 #Python
在Python中使用mongoengine操作MongoDB教程
Apr 24 #Python
python使用arp欺骗伪造网关的方法
Apr 24 #Python
python使用wxPython打开并播放wav文件的方法
Apr 24 #Python
You might like
php从数据库查询结果生成树形列表的方法
2015/04/17 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
张孝祥JavaScript学习阶段性总结(2)--(X)HTML学习
2007/02/03 Javascript
JavaScript Chart 插件整理
2010/06/18 Javascript
jQuery学习笔记(4)--Jquery中获取table中某列值的具体思路
2013/04/10 Javascript
javascript中的document.open()方法使用介绍
2013/10/09 Javascript
javascript正则匹配汉字、数字、字母、下划线
2014/04/10 Javascript
Javascript 函数parseInt()转换时出现bug问题
2014/05/20 Javascript
JavaScript实现删除,移动和复制文件的方法
2015/08/05 Javascript
JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题
2016/08/03 Javascript
微信小程序链接传参并跳转新页面
2016/11/29 Javascript
Bootstrap基本样式学习笔记之按钮(4)
2016/12/07 Javascript
JS正则截取两个字符串之间及字符串前后内容的方法
2017/01/06 Javascript
angular.js 路由及页面传参示例
2017/02/24 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
2017/05/03 Javascript
JS实现浏览上传文件的代码
2017/08/23 Javascript
vue2.0+vuex+localStorage代办事项应用实现详解
2018/05/31 Javascript
Vue中Axios从远程/后台读取数据
2019/01/21 Javascript
微信小程序 导入图标实现过程详解
2019/10/11 Javascript
nodejs环境使用Typeorm连接查询Oracle数据
2019/12/05 NodeJs
Python爬虫利用cookie实现模拟登陆实例详解
2017/01/12 Python
win10环境下python3.5安装步骤图文教程
2017/02/03 Python
非递归的输出1-N的全排列实例(推荐)
2017/04/11 Python
python的paramiko模块实现远程控制和传输示例
2017/10/13 Python
Python之多线程爬虫抓取网页图片的示例代码
2018/01/10 Python
在python Numpy中求向量和矩阵的范数实例
2019/08/26 Python
Tensorflow不支持AVX2指令集的解决方法
2020/02/03 Python
详解html2canvas截图不能截取圆角图片的解决方案
2018/01/30 HTML / CSS
2013年保送生自荐信格式
2013/11/20 职场文书
水利公司纪检监察自我鉴定
2014/02/25 职场文书
公司联欢会策划方案
2014/05/19 职场文书
房屋出租委托书格式
2014/09/23 职场文书
领导班子党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
个人创业事迹材料
2014/12/30 职场文书
外贸英文求职信范文
2015/03/19 职场文书
2015年加油站站长工作总结
2015/05/27 职场文书