本次,我们发邮件用到的Python库是smtplib和email。
smtplib库主要是用于负责和邮件服务器进行通讯
email库则主要用于规定编写邮件的头、主体、内容、附件等
发邮件之前我们需要用Python登录smtp服务器,这样才能有发送权限,所以,我们需要去邮箱手动开启smtp服务,然后记住服务器授权码(授权码意思是,你可以不用我的网页邮箱或者邮箱app登录,你可以用邮箱账号+授权码在后台来获取邮箱服务器的内容)
由于本次我们用QQ邮箱发送,你也可以用网易邮箱或者其他邮箱发送,原理都是类似~
如何开启QQ邮箱smtp服务器和获取授权码:详见此链接
下面是我抄写原作者代码并加了点自己的理解:
主要是:
1.修改附件类型时,需要在设置MIMEBase时修改一下类型
比如传word时修改为:
with open(r'cat.docx','rb') as f:
mime=MIMEBase("file","docx",filename='test.docx')
#加上必要的头信息
mime.add_header('Content-Disposition','attachment',filename='test.docx')
2.搞明白了为啥不管是图片还是文档都需要base64编码
因为s.sendmail(sender,to,msg.as_string())这里msg必须是可以用ascii解码的字符串
假如没有这一步
就会是utf-8编码的,ascii无法进行编码,会报错
python代码:
# -*- coding: utf-8 -*-
"""
利用邮箱的授权码
基于此邮箱给其他邮件地址发email
ps:添加附件类型变化时,第29-32行要做相应修改
"""
import smtplib
from email import encoders
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
#发件人邮箱
sender="[email protected]"
#服务器授权码
password="your keys"
#服务器地址,这里是QQsmtp服务器
mail_host='smtp.qq.com'
#收件人地址,可填写多个
receivers=['[email protected]','[email protected]']
#设置email信息
msg=MIMEMultipart()
#邮件主题
msg["Subject"]='test'
msg["From"]=sender
#邮件正文
msg_content="hi,nice to meet you,I'm your tester"
msg.attach(MIMEText(msg_content,'plain','utf-8'))
#添加附件就是加上一个MIMEBase
with open('cat.jpg','rb') as f:
mime=MIMEBase("image","jpg",filename='test.jpg')
#加上必要的头信息
mime.add_header('Content-Disposition','attachment',filename='test.jpg')
mime.add_header('Content-ID','<0>')
mime.add_header('X-Attachment-Id','0')
#把附件内容读进来
mime.set_payload(f.read())
#base64编码
encoders.encode_base64(mime)#无论是不是图片都要进行base64编码,因为msg内容必须是ascii可以编码的字符串
#添加到MIMEMultipart
msg.attach(mime)
#登录并发送邮件
try:
#QQsmtp服务器的端口号为465或者587
s=smtplib.SMTP_SSL('smtp.qq.com',465)
s.set_debuglevel(1)
s.login(sender,password)
#给receivers列表中的地址逐个发邮件
for item in receivers:
msg['To']=to=item
s.sendmail(sender,to,msg.as_string())
print("send to %s has succeed"%item)
s.quit()
print('send to all succeed')
except smtplib.SMTPException as e:
print("failed for %s"%e)
我是觉得还是挺有用的,比如给很多人群发个邮件啥的,特别是带附件的时候