PYTHON使用SMTP发送邮件

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章