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