Python 2.7.12从mysql数据库导出数据并作为附件发送到邮箱

由于需要从mysql数据库中导出到excel表并发送邮件做的这个,其中参考了网上很多的例子

因为之前是需要做的发送邮件,所以这次就直接合并在一起了。有些应该改的但是我复制过来也就没有去管了

 

# -*- coding: utf-8 -*-
import MySQLdb
import xlsxwriter
import base64
# 这是我连接数据库的查询语句
from HRSystem.classes.api import database
# 这是我发生异常后报的错误
from HRSystem.classes.api import echo
import sys
import smtplib
from email.MIMEText import MIMEText
from email.mime.multipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email import Encoders
from email.Utils import formatdate
from email.Header import Header

reload(sys)
sys.setdefaultencoding('utf-8')
class Aa(object):
# 初始化实例变量;interview是我做的另一个功能,这里偷懒就直接复制过来了是可以替换成任意字符的
def __init__(self, **interview):
self.interview = interview
aa = None
targetHelp = 'email'
actionHelp = {
      # sql是语句,name是文件名,email是发送的邮箱,id_operator是我项目里的权限与本文无关
'email': 'sql,name,id_operator,email',
}
# 发送面试邀请
def email(self):
if not echo.checkParams(['id_operator'], self.interview):
return echo.retMsg(-1, "missing parameter", "")
newfile = str(self.interview['name']) + '.xlsx'
conn = MySQLdb.connect(host='***.***.***.***', user='你的数据库loginuser', passwd='******', db='你的schema', port=3306, charset='utf8')
cursor = conn.cursor()
test_sql = self.interview['sql']
count = cursor.execute(test_sql)
data = cursor.fetchall()
fields = cursor.description
cursor.close()
conn.close()
workbook = xlsxwriter.Workbook(newfile)
worksheet = workbook.add_worksheet('data')
# 表头格式
format1 = workbook.add_format(
{'bold': True, 'font_color': 'red', 'font_size': 11, 'align': 'left', 'font_name': u'宋体'})
# 日期A列区域
format2 = workbook.add_format(
{'font_color': 'black', 'font_size': 9, 'align': 'left', 'num_format': 'yyyy-mm-dd', 'font_name': u'宋体'})
# 除日期A列外数值区域
format3 = workbook.add_format({'font_color': 'black', 'font_size': 9, 'align': 'left', 'font_name': u'宋体'})

    # A列列宽设置能更好的显示
worksheet.set_column("A:A", 9)
# 插入第一行表头标题
for i in range(0, len(fields)):
field = fields[i][0]
worksheet.write(0, i, field.decode('utf-8'), format1)


     # 这里是18/6/15对A列开始一共六行的改进,使得可以根据表头的长度使excel表展开避免了部分感官问题
      # 插入第一行表头标题
     # for i in range(0, len(fields)):
     # field = fields[i][0]
     # init_number = i+1
     # increment = ord('A') - 1
     # shang, yu = divmod(init_number, 26)
     # char = chr(yu + increment)
     # res_char = char * (shang + 1)
     # worksheet.set_column(""+res_char+":"+res_char+"", len(field)+3)
     # worksheet.write(0, i, field.decode('utf-8'), format1)



# 插入15行第一列 订单日期 日期取字符型
for j in range(0, 15):
worksheet.write(j + 1, 0, str(data[j][0]).decode('utf-8'), format2)
# 插入15行第2-len(fields)列 数字取整数
for x in range(0, 15):
for y in range(1, len(fields)):
worksheet.write(x + 1, y, data[x][y], format3)
workbook.close()
print u'写入成功'

# 发送邮件的相关信息,根据你实际情况填写
smtpHost = 'smtp.exmail.qq.com' # 腾讯企业邮箱发送邮件服务器
sslPort = '465' # ssl端口号
fromMail = '***@***.com' # 发件邮箱
toMail = self.interview['email'] # 接收邮箱
username = '***@***.com' # 邮箱名
password = '******.' # 邮箱密码

# 解决中文问题
reload(sys)
sys.setdefaultencoding('utf8')
# 邮件标题和内容
subject = u'标题'
     # 这里并没有区用html格式去写,毕竟不是前端,要我改成html发出来看样子再改就很难受了
body = 'dear,all,\n\n XXXXXXXXXXX'
# 初始化邮件
encoding = 'utf-8'
mail = MIMEMultipart()
mail['Subject'] = Header(subject, encoding)
mail['From'] = fromMail
mail['To'] = toMail
mail['Date'] = formatdate()
mail.attach(MIMEText(body.encode(encoding)))
# 构造附件
part = MIMEBase('application', 'octet-stream')

# 读入文件内容并格式化,此处文件为本地的绝对路径,相对路径我没有去试,应该是可以的
part.set_payload(open('C:\\Users\\Administrator\\Desktop\\python项目名\\mysite\\'+self.interview['name']+'.xlsx', 'rb').read())
Encoders.encode_base64(part)
## 设置附件头
part.add_header('Content-Disposition', 'attachment; filename="'+self.interview['name']+'.xlsx"')
mail.attach(part)
try:
# 纯粹的ssl加密方式,通信过程加密,邮件数据安全
smtp = smtplib.SMTP_SSL(smtpHost, sslPort)
smtp.ehlo()
smtp.login(username, password)
# 发送邮件
smtp.sendmail(fromMail, toMail, mail.as_string())
smtp.close()
except Exception, e:
print 'Error: unable to send email'
print str(e)
actionExec = {
'email':email
}



  最后希望本文能对有需要的朋友能有一点帮助,

  大家一起加油共同进步!

posted on 2018-06-13 13:58  十五岁少年  阅读(241)  评论(0编辑  收藏  举报