Smtplib模块实现发送邮件的功能,在Python2.3以后Python自带Smtplib模块,无需额外安装。
SMTP(Simple Mail Transfer Protocol)是一个简单的基于文本的协议。在其之上指定了消息的接收者,然后消息文本会被传输。SMTP使用TCP端口25。
MIME(Multipurpose Internet Mail Extensions)是多用途互联网邮件扩展类型,是一个互联网标准,扩展了邮件中所需HTML、图像、声音、附件等新的扩展邮件格式,更多详见 https://docs.python.org/3/library/email.html 。
使用SMTP模块发送
Python对SMTP支持有Smtplib和Email两个模块,Email负责构造邮件,Smtplib负责发送邮件。
如果使用QQ邮箱,设置中需要开启POP3/SMTP服务,此外login的密码不是邮箱密码而是授权码,具体见设置-账户-授权码。
email.mime.text.MIMEText (_text[, _subtype[, _charset]]) :是MIMENonMultipart中的一个子类,创建包含文本数据的邮件体,_text 是包含消息负载的字符串,_subtype 指定文本类型,支持 plain(默认值)或 html类型的字符串。_charset设置字符集,参数接受一个charset实例。
as_string() :返回字符串信息,相当于__str__(),str(msg)
from email.mime.text import MIMEText
msg=MIMEText("First send","plain","utf-8")
from_addr="[email protected]"
password="5uaw" #QQ邮箱此处为授权码
smtp_server="smtp.qq.com" #SMTP服务器地址
to_addr=["[email protected]"] #收件人地址
import smtplib
server=smtplib.SMTP(smtp_server,25) #创建一个SMTP对象。SMTP默认端口为25
server.set_debuglevel(1) #打印SMTP服务器交互的信息
server.login(from_addr,password) #登录服务器
server.sendmail(from_addr,[to_addr],msg.as_string())
server.quit() #断开SMTP服务器链接
完整发送
自定义函数_format_addr()用来格式化邮件地址。注意不能简单地传入name,因为如果包含中文,需要通过Header对象进行编码。
email.utils为附加工具的类。
email.utils.formataddr(pair,charset=‘utf-8’):pair是一个元祖或列表返回分割的标题和地址,如邮箱收件人暱称和邮箱账号
msg[‘To’]接收的是字符串而不是list,如果有多个邮件地址,用,分隔即可。
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr,formataddr
import smtplib
def _formar_addr(s):
name,addr=parseaddr(s)
return formataddr((Header(name,'utf-8').encode(),addr))
from_addr="[email protected]"
password="5uaw" #QQ邮箱此处为授权码
smtp_server="smtp.qq.com" #SMTP服务器地址
to_addr=["[email protected]"] #收件人地址
msg=MIMEText("First send by kuku","plain","utf-8")
msg['From']=_formar_addr('发信人 <%s>' % from_addr)
msg['To']=_formar_addr('收信人 <%s>' % to_addr)
msg['Subject']=Header('SMTP发信应用','utf-8').encode()
server=smtplib.SMTP(smtp_server,25) #SMTP默认端口为25
server.set_debuglevel(1) #打印SMTP服务器交互的信息
server.login(from_addr,password) #登录服务器
server.sendmail(from_addr,[to_addr],msg.as_string())
server.quit()
本文为作者自学廖雪峰老师电子邮件章节时,一些不懂的地方进行摘抄并增加自己解释。
原文详见廖老师网站:https://www.liaoxuefeng.com/wiki/1016959663602400/1017790702398272