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

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