python实现邮件自动推送附件数据

实现案例:

-- coding: utf-8 --

“”"
Created on Tue Mar 31 16:34:03 2020
定时推送财务核算月度数据;
@author: Administrator
“”"

import smtplib
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from openpyxl import load_workbook

#连接impala从数据库中提取所需数据,以EXCEL文件存到指定文件夹中
from impala.dbapi import connect
conn = connect(host=‘服务器IP地址’, port=端口,timeout=3600)

cur = conn.cursor()
sql1 = “select addtime,sum(nums) as tercdbnum from 表名 where addtime>‘2019-12-31’ and status=1 group by addtime;”
cur.execute(sql1)
data_cdb=cur.fetchall()

sql2 = “select substr(cast(balanceday as string),1,7) as mon,sum(buycdbgivebackcnt) as backnum,sum(buycdbgivebackmoney) as backsum from 表名 where balanceday>=‘2020-01-01’ group by substr(cast(balanceday as string),1,7) ;”
cur.execute(sql2)
data_backcdb=cur.fetchall()

#打开本地EXCEL
w = load_workbook(r’F:\12-PYwork\cdbnumbymonth.xlsx’)

#以下逐个sheet写入各维度统计的数据
#初始化第一个sheet,并修改sheet名称,准备写入第一份数据
ws = w[‘Sheet1’]
#ws.title=‘第一份数据’
#填入列明
ws[“A1”] = ‘统计日期’
ws[“B1”] = ‘数据标签’
#将数据写入excel
for col in range(len(data_cdb)):
ws.append(data_cdb[col])
#初始化第二个sheet,并修改sheet名称,准备写入第二份数据
ws = w[‘Sheet2’]
#ws.title=‘第二份数据’
#填入列明
ws[“A1”] = ‘统计月份’
ws[“B1”] = ‘数据标签一’
ws[“C1”] = ‘数据标签二’
#将数据写入excel
for col in range(len(data_backcdb)):
ws.append(data_backcdb[col])

#所有数据写入完后,保存excel
w.save(r’F:\12-PYwork\cdbnumbymonth.xlsx’) #保存变更

##以下开始发送邮件设置
#发件人邮箱
asender=“发件人邮箱地址”
#收件人邮箱
areceiver=“收件人邮箱地址”
#抄送人邮箱
acc = ‘抄送人邮箱地址’
#邮件主题
asubject = ‘这是一份测试邮件’
#发件人地址
from_addr = “发件人邮箱地址”
#邮箱密码(授权码)
password=“腾讯企业邮箱客户端专用密码”
#邮件设置
msg = MIMEMultipart()
msg[‘Subject’] = asubject
msg[‘to’] = areceiver
msg[‘Cc’] = acc
msg[‘from’] = “发件人姓名”
#邮件正文内容
body = “你好!附件中为测试数量,请查收!”
#添加邮件正文:
msg.attach(MIMEText(body, ‘plain’, ‘utf-8’))

#添加附件
#注意这里的文件路径是斜杠
xlsxpart = MIMEApplication(open(r’F:\12-PYwork\cdbnumbymonth.xlsx’, ‘rb’).read())
xlsxpart.add_header(‘Content-Disposition’, ‘attachment’, filename=‘测试数据.xlsx’)
msg.attach(xlsxpart)
#设置邮箱服务器地址以及端口(腾讯企业邮箱)
smtp_server =“smtp.exmail.qq.com”
server = smtplib.SMTP_SSL(smtp_server, 465)
server.set_debuglevel(1)
#登陆邮箱
server.login(from_addr, password)
#发送邮件
server.sendmail(from_addr,
areceiver.split(’,’)+acc.split(’,’), msg.as_string())
#断开服务器链接
server.quit()

– 后续优化方向:封装函数,实现扩展迁移


– 邮箱服务器端口配置:
server = smtplib.SMTP_SSL(“smtp.exmail.qq.com”, 465) # 发件人邮箱中的SMTP服务器,端口是465
server.login(my_sender, my_pass) # 括号中对应的是发件人邮箱账号、邮箱密码
server.sendmail(my_sender, my_user, m.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
server.quit() # 关闭连接
– 登录时遇到的问题
提示: 535, b’Error: authentication failed, system busy’
邮箱密码设置错了,不应该是登录邮箱时的密码,而是设置得来的客户端专用密码,设置方式如下:
绑定微信账号-开启安全登录-安全登录-客户端专用密码-生成新密码-记录该密码
开启安全登录后,无法使用原密码登录,网页版需要用微信扫码,客户端要用“客户端专用密码”登录;


– 相关技术 https://www.cnblogs.com/xiongli/p/5790737.html

用python发送邮件,主要借助smtplib和email两个模块,其中smtplib主要用来建立服务器链接、服务器断开的工作,email主要用来设置一些与邮件本身相关的内容,比如收件人、发件人、主题之类的。

不同邮箱的服务器链接地址(端口)不一样,可以根据自己使用的邮箱设置相应的服务器链接。如果是outlook企业邮箱,一般都是mail.xxx.com(xxx是公司名字),具体可以咨询运维同事。

示例:用163邮箱进行发送邮件。
首先,要登陆自己的163邮箱进行授权设置,授权码设置如下:设置-POP3/SMTP/IMAP-勾选几个服务后保存。
设置授权成功后,在python中用授权码进行登陆,而不是本来的邮箱密码,如果用本来的邮箱密码登陆,会报错。

python脚本如下:

import smtplib
from email import encoders
from email.header import Header>>>from email.mime.text import MIMEText>>>from email.utils import parseaddr, formataddr
from email.mime.application import MIMEApplication#发件人邮箱>>>asender=“zhangjunhongdata@163.com”#收件人邮箱>>>areceiver=“zhangjunhong@163.com”#抄送人邮箱>>>acc = ‘zhangjunhong@qq.com’#邮件主题>>>asubject = ‘这是一份测试邮件’
#发件人地址>>>from_addr = “zhangjunhongdata@163.com”#邮箱密码(授权码)>>>password=“123data”#邮件设置>>>msg = MIMEMultipart()>>>msg[‘Subject’] = asubject

msg[‘to’] = areceiver
msg[‘Cc’] = acc
msg[‘from’] = “张俊红”#邮件正文内容>>>body = “你好,这是一份测试邮件”#添加邮件正文:>>>msg.attach(MIMEText(body, ‘plain’, ‘utf-8’))#添加附件#注意这里的文件路径是斜杠>>>xlsxpart = MIMEApplication(open(‘C:/Users/zhangjunhong/Desktop/这是附件.xlsx’, ‘rb’).read())>>>xlsxpart.add_header(‘Content-Disposition’, ‘attachment’, filename=‘这是附件.xlsx’)>>>msg.attach(xlsxpart)
#设置邮箱服务器地址以及端口>>>smtp_server =“smtp.163.com”>>>server = smtplib.SMTP(smtp_server, 25)>>>server.set_debuglevel(1)#登陆邮箱>>>server.login(from_addr, password)#发送邮件>>>server.sendmail(from_addr, >>>areceiver.split(’,’)+acc.split(’,’), msg.as_string())#断开服务器链接
server.quit()

如果需要同时发送多份邮件,可以把上述邮件发送过程定义为一个函数,把收件人及其他内容生成一个列表,然后遍历每一个收件人,最后调用发送邮件函数进行多份邮件发送。

把邮件发送过程封装成一个函数相对比较简单,只需要把上述给单个人发送邮件的内容当成语句块,收件人当作参数即可,下面我们定义了一个名为send_mail的函数:
def send_mail(areceiver):
给单人发送邮件的代码
#多个收件人列表
receivers = [“zhangjunhongdata1@163.com1”,
“zhangjunhongdata2@163.com1”,
“zhangjunhongdata3@163.com1”]
#开始遍历
for r in receivers:
send_mail®

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值