这就是一封简单的邮件,包括正文、发件人、收件人、邮件标题等等,下面我们就来实现整个自动化的邮件发送过程
一、构造邮件,email模块
第一步:引用模块
from email.mime.text import MIMEText
#发送纯文本,HTML页面
from email.mime.image import MIMEImage
#发送图片
from email.mime.multipart import MIMEMultipart
#发送多种形式的组合,文本和附件等
第二步:写入内容
MIMEText(msg,type,chartset)
msg:文本内容,可自定义,type:文本类型,默认为plain(纯文本),chartset:文本编码,中文为“utf-8”
from email.mime.text import MIMEText msg = MIMEText('Hello world','plain','utf-8')
第三步:丰富邮件头
from email.header import Header#引用邮件头
msg['From'] = Header(from_addr)#发件人邮箱
msg['To'] = Header(to_addrs)#收件人邮箱
msg['Subject'] = Header('python test')#标题
目前我们要实现的是群发邮件,因此收件人邮箱肯定是多个,你可以采用列表的形式,也可以使用循环,还可以创建一个csv文件来访问等等
对于使用列表来说,需要注意的是:Header接受的第一个参数的数据类型必须要是字符串或者字节,列表不能解码,因此我们需要将to_addrs变成字符串,这里可以使用join函数
to_addrs=[]
msg['to'] = Header(",".join(to_addrs))
二、发送邮件,smtplib模块
import smtplib
server = smtplib.SMTP()
server.connect(host, port)
server.login(from_addr, password)
server.sendmail(from_addr, to_addrs, msg.as_string())
server.quit()
第二行:SMTP(Simple Mail Transfer Protocol)是“简单邮件传输协议”的意思,可以理解为我们需要通过SMTP指定一个服务器,这样才能把邮件送到另一个服务器。
第三行:连接服务器,host是指定连接的邮箱服务器,通过搜索“xx邮箱服务器地址”,就可以找到。port是指定连接的服务器端口,一般SMTP的服务器端口为25
如以QQ邮箱为例
server = smtplib.SMTP() server.connect('smtp.qq.com', 587)注:QQ邮箱一般会默认关闭SMTP服务,记得自行开启,完成之后QQ邮箱会提供给你一个授权码,记得保存好,是用这个授权码作为密码登录,而不是用你的QQ密码
第四行:登录邮箱,from_addr是发件人邮箱,password是授权码
第五行:发送邮件,from_addr是发件人邮箱, to_addrs是收件人邮箱, msg.as_string()将发送的信息msg变字符串类型
第六行:退出服务器,结束SMTP对话
总结:
from email.mime.text import MIMEText
from email.header import Header#引用邮件头
import smtplib
#发件人
from_addr=''
password=''
#收件人
to_addrs=[]
#邮件正文内容
content=''
msg=MIMEText(content,'plain','utf-8')
#邮件头
msg['From'] = Header(from_addr)#邮箱
msg['To'] = Header(",".join(to_addrs))#邮箱
msg['Subject'] = Header('来函')#标题
#发送邮件
server = smtplib.SMTP('smtp.qq.com')#!!!
server.connect('smtp.qq.com', 587)
server.login(from_addr, password)
server.sendmail(from_addr, to_addrs, msg.as_string())
server.quit()
注意我打了!!!的位置,在这里我遇到了报错:ValueError: server_hostname cannot be an empty string or start with a leading dot.
因为Python 3.7修改了ssl.py,导致smtplib.SMTP_SSL也连带产生了问题。
解决方法:
# 在括号内加入host参数 server = smtplib.SMTP_SSL(smtp_server)