Python实现自动发送邮件
1.开启SMTP服务
为了实现自动发送邮件的目的,我们需要在邮箱中开启SMTP服务:
这点很关键,别忘了去开启SMTP, 别忘了去开启SMTP,否则邮件是无法发送成功的 。然后你还需要点击下面生成授权码,这个授权码才是使用Python发送邮件时的真正密码。
2.python发邮件需要掌握两个模块
smtplib和email,这俩模块是python自带的,只需import即可使用。smtplib模块主要负责发送邮件,email模块主要负责构造邮件。
smtplib模块主要负责发送邮件:是一个发送邮件的动作,连接邮箱服务器,登录邮箱,发送邮件(有发件人,收信人,邮件内容)。
email模块主要负责构造邮件:指的是邮箱页面显示的一些构造,如发件人,收件人,主题,正文,附件等。
代码说明:
1)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会话。
2)email模块
email模块下有mime包,mime英文全称为“Multipurpose Internet Mail Extensions”,即多用途互联网邮件扩展,是目前互联网电子邮件普遍遵循的邮件技术规范。
该mime包下常用的有三个模块:text,image,multpart。
导入方法如下:
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
构造一个邮件对象就是一个Message对象,如果构造一个MIMEText对象,就表示一个文本邮件对象,如果构造一个MIMEImage对象,就表示一个作为附件的图片,要把多个对象组合起来,就用MIMEMultipart对象,而MIMEBase可以表示任何对象。它们的继承关系如下:
Message
+- MIMEBase+- MIMEMultipart+- MIMENonMultipart+- MIMEMessage+- MIMEText+- MIMEImage
1、自动发送普通的文字邮件代码实现如下:
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 = '9156393@qq.com' #发件人邮箱
pwd = '你的授权码'
receiver = ['910393@qq.com','824864@qq.com' ]#收件人邮箱
#receiver = '913@qq.com'
mail_title = 'Python自动发送的邮件' #邮件标题
mail_content = "您好,这是使用python登录QQ邮箱发送邮件的测试——zep" #邮件正文内容
# 初始化一个邮件主体
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:登录邮箱的密码,像笔者用的是网易邮箱,网易邮箱一般是网页版,需要用到客户端密码,需要在网页版的网易邮箱中设置授权码,该授权码即为客户端密码。
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()
2、发送html格式邮件
import smtplib
from smtplib import SMTP_SSL
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Headerhost_server = 'smtp.qq.com' #qq邮箱smtp服务器
sender_qq = '91693@qq.com' #发件人邮箱
pwd = '你的授权码'
receiver = '96393@qq.com'
mail_title = 'Python自动发送html格式的邮件' #邮件标题#邮件正文内容
mail_content = "您好,<p>这是使用python登录QQ邮箱发送HTNL格式邮件的测试:</p> <p><a href='https://blog.csdn.net/weixin_44827418?spm=1000.2115.3001.5113'>CSDN个人主页</a></p>"msg = MIMEMultipart()
msg["Subject"] = Header(mail_title,'utf-8')
msg["From"] = sender_qq
msg["To"] = Header("测试邮箱","utf-8")msg.attach(MIMEText(mail_content,'html'))try:smtp = SMTP_SSL(host_server) # ssl登录连接到邮件服务器smtp.set_debuglevel(1) # 0是关闭,1是开启debugsmtp.ehlo(host_server) # 跟服务器打招呼,告诉它我们准备连接,最好加上这行代码smtp.login(sender_qq,pwd)smtp.sendmail(sender_qq,receiver,msg.as_string())smtp.quit()print("邮件发送成功")
except smtplib.SMTPException:print("无法发送邮件")
3、发送带附件的邮件
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 = '91393@qq.com' #发件人邮箱
pwd = '你的授权码'
receiver = '9193@qq.com'
mail_title = 'Python自动发送html格式的邮件' #邮件标题#邮件正文内容
mail_content = "您好,<p>这是使用python登录QQ邮箱发送HTNL格式邮件的测试:</p> <p><a href='https://blog.csdn.net/weixin_44827418?spm=1000.2115.3001.5113'>CSDN个人主页</a></p>"msg = MIMEMultipart()
msg["Subject"] = Header(mail_title,'utf-8')
msg["From"] = sender_qq
msg["To"] = Header("测试邮箱","utf-8")msg.attach(MIMEText(mail_content,'html'))
attachment = MIMEApplication(open('./test.xlsx','rb').read())
attachment["Content-Type"] = 'application/octet-stream'
# 给附件重命名
basename = "test.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是开启debugsmtp.ehlo(host_server) # 跟服务器打招呼,告诉它我们准备连接,最好加上这行代码smtp.login(sender_qq,pwd)smtp.sendmail(sender_qq,receiver,msg.as_string())smtp.quit()print("邮件发送成功")
except smtplib.SMTPException:print("无法发送邮件")
3.使用zmail模块读取邮件
首先需要在cmd命令行安装zmail模块,输入pip install zmail
安装即可
import zmailserver = zmail.server('9193@qq.com','你的授权码')
mail = server.get_latest()
zmail.show(mail)
import zmailserver = zmail.server('993@qq.com','你的授权码')
mail = server.get_latest()
# zmail.show(mail)
print(mail['subject'])
print(mail['id'])
print(mail['from'])
print(mail['to'])
print(mail['content_text'])
print(mail['content_html'])# 用来保存附件
# target_path为None则默认保存在当前目录下
# overwrite=True 是指如果出现同名文件则进行覆盖
zmail.save_attachment(mail,target_path=None,overwrite=True)