我们把报表做出来以后一般都是需要发给别人查看,对于一些每天需要发的报表或者是需要一次发送多份的报表,这个时候可以考虑借助Python来自动发送邮件。
一般我们在使用QQ邮箱、163邮箱、126邮箱等这些比较常用的邮箱时,只需要输入账号和密码就可以。但是在使用手机端的企业邮箱的时候,一般都需要配置一下,常规的配置界面如下所示:
就是除了在输入账号密码以外,还需要输入一个服务器链接地址,这个地址每个公司都会不太一样。
下图是outlook中发送一份邮件的界面,主要包含发件人、收件人、抄送人、主题、正文、附件这几部分。这也是一般邮件比较通用的组成部分。
在发送邮件之前首先需要与服务器进行连接,在Python中主要利用smtplib模块来建立服务器连接接、服务器断开的工作。
不同邮箱的服务器链接地址不一样,大家根据自己使用的邮箱设置相应的服务器链接。下表为常见邮箱对应的服务器链接:
邮箱 | 服务器地址 |
---|---|
新浪邮箱 | smtp.sina.com |
搜狐邮箱 | smtp.sohu.com |
126邮箱 | smtp.126.com |
139邮箱 | smtp.139.com |
163网易邮箱 | smtp.163.com |
在与163邮箱服务器进行连接之前,需要先登陆自己的163邮箱进行授权设置,授权码设置如下:
点击设置中的POP3/SMTP/IMAP
,勾选SMTP服务,根据提是进行授权码设置,设置授权成功后,在Python中利用授权码进行登陆,而不是你本来的邮箱密码,如果使用本来的邮箱密码登陆,会报错。
连接设置好以后就可以使用账户密码进行登录了,登录成功以后就可以对邮件内容进行编辑,编辑完成以后就可以点击发送了,发送完成后断开服务器链接。
如下展示了发送一份邮件的简短流程代码:
import smtplib
smtp = smtplib.SMTP()
smtp.connect(host, port) # 与服务器进行连接
smtp.set_debuglevel(1) #显示出交互信息
smtp.login(username, password) # 登陆邮箱
smtp.sendmail(sender, receiver, msg.as_string()) # 发送邮件
smtp.quit() # 断开连接
如下以163邮箱为例,展示了发送一份邮件完整的Python代码:
import smtplib
from email.mime.multipart import MIMEMultipart
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="[email protected]"
#收件人邮箱
areceiver="[email protected]"
#抄送人邮箱
acc = '[email protected]'
#邮件主题
asubject = '这是一份测试邮件'
#发件人地址
from_addr = "[email protected]"
#邮箱密码(授权码)
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()
最后的结果如下图:
关于自动发送邮件还有一些进阶的内容,比如定时发送,正文显示html内容等,大家有兴趣的可以自行上网搜索学习。
如果是需要同时发送多份邮件,可以把收件人整理成一个表格进行循环遍历,挨个进行发送。
比如我们现在需要给销售部门好几百销售人员分别发送本月各自的销售任务,在发送邮件的时候主题需要命名成xxx任务明细,在正文中的称呼也需要改成对应的收件人,附件中需要添加各自的任务明细表,而且需要抄送给各自的直属上级。
根据上述的需要,我们整理了如下收件人信息相关的表格df:
姓名 | 收件人 | 抄送人 |
---|---|---|
张俊红1 | [email protected] | [email protected] |
张俊红2 | [email protected] | [email protected] |
只需要写一个for循环去遍历这个df表格中的信息,然后就可以分别发送出去,具体实现代码如下:
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.application import MIMEApplication
host = "smtp.163.com"
port = 25
username = "[email protected]"
password = "123zjh"
smtp = smtplib.SMTP() #声明一个链接对象
smtp.connect(host, port) # 与服务器进行连接
smtp.set_debuglevel(1) #显示出交互信息
smtp.login(username, password) # 登陆邮箱
sender = username
for i in zip(df["姓名"],df["收件人"],df["抄送人"]):
receiver = i[1] #收件人
acc = i[2] #抄送人
msg = MIMEMultipart() #声明一个邮件对象
msg['from'] = username #发件人
msg['to'] = receiver#收件人
msg['Cc'] = acc #抄送人
msg['Subject'] = i[0] + "任务明细" #主题
# 编写正文
text = MIMEText(i[0]+"您好,这是您这个月的任务明细",'plain', 'utf-8')
msg.attach(text)
# 添加表格附件
f = open('C:/Users/zhangjunhong/Desktop/任务明细/'+ i[0] + '.xlsx', 'rb').read()
filepart = MIMEApplication(f)
filepart.add_header('Content-Disposition','attachment',filename=i[0] + '任务明细.xlsx') #为附件添加一个标题
msg.attach(filepart)
smtp.sendmail(sender, receiver.split(',') + acc.split(','), msg.as_string()) # 发送邮件
smtp.quit() # 断开连接
通过运行上面的代码,就可以达到一次性给表格df中的所有人发送邮件的需求。