前言
我有个朋友是一个品牌的县级代理,免不了要给自己的上级代理汇报自己区域的销售情况,他不只一次给我抱怨,发送报表的次数太多,领导也太多,有时候一天发邮件就要占用自己不少的时间,问我有没有什么办法能够解放他。
作为他的好基友,我必须帮帮他,刚好我们Python能够实现自动化的发送邮件,非常符合他的需求,脚本写好,他只需要准备好报表,动动手指就可以完成发送了。
邮箱设置
要实现自动化发送邮件,我们首先要对自己的邮箱进行设置,开启SMTP服务,具体步骤如下:
- 登录邮箱之后,点击设置
- 点击账户,开启POP3/SMTP服务,该服务是默认关闭的
- 生成授权码
开启SMTP服务之后,必须要点击生成授权码,该授权码才是使用Python发送邮件时的真正密码。
发送邮件之后,点击我已发送,即可展示授权码,可以将授权码保存下来。
模块介绍
Python自动化发邮件使用到了smtplib和email模块,这两个模块都是Python的内置模块,无需安装可以直接导入。其中,smtplib模块主要负责发送邮件,email模块主要负责构造邮件。
- smtplib模块主要负责发送邮件:是一个发送邮件的动作,连接邮箱服务器,登录邮箱,发送邮件(有发件人,收信人,邮件内容)。
- email模块主要负责构造邮件:指的是邮箱页面显示的一些构造,如发件人,收件人,主题,正文,附件等。
- smtplib模块
smtplib.SMTP() :实例化SMTP()
login(user,password):
- user:登录邮箱的用户名
- password:登录邮箱的密码,即上方生成的授权码
sendmail(from_addr,to_addrs,msg,…):
- from_addr:邮件发送者地址
- to_addrs:邮件接收者地址。字符串列表[‘接收地址1’,‘接收地址2’,‘接收地址3’,…]或’接收地址’
- msg:发送消息:邮件内容。一般是msg.as_string():as_string()是将msg(MIMEText对象或者MIMEMultipart对象)变为str。
quit():用于结束SMTP会话。
- email模块
email模块下有mime包,mime英文全称为“Multipurpose Internet Mail Extensions”,即多用途互联网邮件扩展,是目前互联网电子邮件普遍遵循的邮件技术规范。
我们常用到的有,text,image,multipart三个模块。
导入方式如下:
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
实现邮件发送
完成上述设置,导入模块之后,我们可以开始编写实现自动化发送邮件的代码了,我们先来实现一下纯文字版的邮件发送。代码如下:
from smtplib import SMTP_SSL
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
# smtplib模块主要负责发送邮件:是一个发送邮件的动作,连接邮箱服务器,登录邮箱,发送邮件(有发件人,收信人,邮件内容)。
# email模块主要负责构造邮件:指的是邮箱页面显示的一些构造,如发件人,收件人,主题,正文,附件等。
host_server = 'smtp.qq.com' #qq邮箱smtp服务器
sender_qq = 'xxxxxxxxxx@qq.com' #发件人邮箱
pwd = 'xxxxxxxxxxxx'
receiver = ['xxxxxxxxxx@163.com' ]#收件人邮箱
mail_title = 'theshy' #邮件标题
mail_content = "theshy是英雄联盟历史第一上单" #邮件正文内容
# 初始化一个邮件主体
msg = MIMEMultipart()
msg["Subject"] = Header(mail_title,'utf-8')
msg["From"] = sender_qq
# msg["To"] = Header("测试邮箱",'utf-8')
msg['To'] = ";".join(receiver)
# 邮件正文内容
msg.attach(MIMEText(mail_content,'plain','utf-8'))
smtp = SMTP_SSL(host_server) # ssl登录
# login(user,password):
# user:登录邮箱的用户名。
# password:登录邮箱的密码,像笔者用的是QQ邮箱,QQ邮箱一般是网页版,需要用到客户端密码,需要在网页版的QQ邮箱中生成授权码,该授权码即为自动发送邮件的密码。
smtp.login(sender_qq,pwd)
# sendmail(from_addr,to_addrs,msg,...):
# from_addr:邮件发送者地址
# to_addrs:邮件接收者地址。字符串列表['接收地址1','接收地址2','接收地址3',...]或'接收地址'
# msg:发送消息:邮件内容。一般是msg.as_string():as_string()是将msg(MIMEText对象或者MIMEMultipart对象)变为str。
smtp.sendmail(sender_qq,receiver,msg.as_string())
# quit():用于结束SMTP会话。
smtp.quit()
收到的邮件如下图所示:
实现带附件的邮件发送
我朋友想要发送的邮件肯定不是纯文字版的邮件,而是需要加上Excel文件或者图片的带附件的邮件,实现该需求的代码如下:
import smtplib
import string
from smtplib import SMTP_SSL
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.mime.application import MIMEApplication # 用于添加附件
host_server = 'smtp.qq.com' #qq邮箱smtp服务器
sender_qq = 'xxxxxxx@qq.com' #发件人邮箱
pwd = 'xxxxxxxxxx'
receiver = 'xxxxxxxxxxx@163.com'
mail_title = '2023年2月月度销售报表' #邮件标题
#邮件正文内容
mail_content = "您好,这是xx地区品牌2023年2月月度销售报表,报表见附件,请您查阅"
msg = MIMEMultipart()
msg["Subject"] = Header(mail_title,'utf-8')
msg["From"] = sender_qq
# msg["To"] = Header("测试邮箱","utf-8")
msg.attach(MIMEText(mail_content,'plain','utf-8'))
attachment = MIMEApplication(open('2023年2月月度销售报表.xlsx','rb').read())
attachment["Content-Type"] = 'application/octet-stream'
# 给附件重命名
basename = "2023年2月月度销售报表.xlsx"
attachment.add_header('Content-Dispositon','attachment',filename=('utf-8', '', basename))#注意:此处basename要转换为gbk编码,否则中文会有乱码。
msg.attach(attachment)
try:
smtp = SMTP_SSL(host_server) # ssl登录连接到邮件服务器
smtp.set_debuglevel(1) # 0是关闭,1是开启debug
smtp.ehlo(host_server) # 跟服务器打招呼,告诉它我们准备连接,最好加上这行代码
smtp.login(sender_qq,pwd)
smtp.sendmail(sender_qq,receiver,msg.as_string())
smtp.quit()
print("邮件发送成功")
except smtplib.SMTPException:
print("无法发送邮件")
收到的邮件如下图所示:
总结
本文主要讲解了使用Python实现自动发送邮件的功能,使用Python自动发送邮件可以提升我们的工作效率,减少我们的重复工作,希望这篇文章能够帮到大家!