本文實(shí)例講述了Python基于SMTP協(xié)議實(shí)現(xiàn)發(fā)送郵件功能。分享給大家供大家參考,具體如下:
SMTP(Simple Mail Transfer Protocol),即簡單郵件傳輸協(xié)議,它是一組由源地址到目的地址傳送郵件的規(guī)則,由它來控制信件的中轉(zhuǎn)方式。Python內(nèi)置對(duì)SMTP的支持,可以發(fā)送純文本郵件、HTML郵件以及帶附件的郵件。
Python對(duì)SMTP支持有smtplib
和email
兩個(gè)模塊,email
負(fù)責(zé)構(gòu)造郵件,smtplib
負(fù)責(zé)發(fā)送郵件。
Python創(chuàng)建SMTP語法如下:
import smtplibsmtpObj = mstplib.SMTP(host,port)
創(chuàng)建具有SSL協(xié)議的SMTP:
import smtplibsmtpObj = mstplib.SMTP_SSL(host,port)
使用SMTP對(duì)象發(fā)送郵件:
# from_addr:發(fā)送者郵箱# to_addrs:接收者郵箱,list# msg:消息體smtpObj.sendmail(from_addr, to_addrs, msg, mail_options=[], rcpt_options=[])
接下來的示例都是以網(wǎng)易郵箱作為郵箱服務(wù)器來寫的,網(wǎng)易163免費(fèi)郵箱相關(guān)服務(wù)器信息如下:
使用網(wǎng)易郵箱作為發(fā)送者郵箱時(shí)應(yīng)注意,郵箱密碼并非為郵箱的登錄密碼,而是客戶端授權(quán)密碼。
發(fā)送純文本郵件
首先,我們需要構(gòu)造一個(gè)消息體:
from email.header import Headerfrom email.mime.text import MIMEText# 第一個(gè)參數(shù)為郵件正文,第二個(gè)參數(shù)為MINE的subtype,傳入‘plain',最終的MINE就是‘text/plain',最后參數(shù)為編碼msg = MIMEText('hello email','palin','utf-8')def _format_addr(s): name,addr = parseaddr(s) return formataddr((Header(name,'utf-8').encode(),addr.encode('utf-8') if isinstance(addr,unicode) else addr))# 發(fā)送者昵稱msg['From'] = _format_addr('發(fā)送者昵稱 <%s>'%from_addr) # 接收者昵稱msg['To'] = _format_addr('接收者昵稱 <%s>'%to_addr)# 標(biāo)題msg['Subject'] = Header('標(biāo)題','utf-8').encode()
此時(shí)就構(gòu)造了一個(gè)簡單的消息體。切記,如果未指定標(biāo)題以及昵稱,并且將其格式化編碼,有可能會(huì)被認(rèn)為是辣雞郵件而導(dǎo)致發(fā)送失敗!!!
以下就是發(fā)送純文本郵件示例的完整代碼:
import smtplibfrom email.header import Headerfrom email.mime.text import MIMETextfrom email.utils import formataddr,parseaddrhost = 'smtp.163.com'port = 25from_addr = 'xxxx@163.com'from_addr_pwd = 'xxxxxx'to_addr = 'xxxx@qq.com'def _format_addr(s): name,addr = parseaddr(s) return formataddr((Header(name,'utf-8').encode(),addr.encode('utf-8') if isinstance(addr,unicode) else addr))msg = MIMEText('hello email','palin','utf-8')msg['From'] = _format_addr('發(fā)送者昵稱 <%s>'%from_addr) msg['To'] = _format_addr('接收者昵稱 <%s>'%to_addr)msg['Subject'] = Header('標(biāo)題','utf-8').encode()smtpObj = smtplib.SMTP(host,25)smtpObj.set_debuglevel(1)smtpObj.login(sender,password)smtpObj.sendmail(sender, [receivers], message.as_string())smtoObj.quit()
新聞熱點(diǎn)
疑難解答
圖片精選