本文實例講述了Python基于SMTP協議實現發送郵件功能。分享給大家供大家參考,具體如下:
SMTP(Simple Mail Transfer Protocol),即簡單郵件傳輸協議,它是一組由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。Python內置對SMTP的支持,可以發送純文本郵件、HTML郵件以及帶附件的郵件。
Python對SMTP支持有smtplib
和email
兩個模塊,email
負責構造郵件,smtplib
負責發送郵件。
Python創建SMTP語法如下:
import smtplibsmtpObj = mstplib.SMTP(host,port)
創建具有SSL協議的SMTP:
import smtplibsmtpObj = mstplib.SMTP_SSL(host,port)
使用SMTP對象發送郵件:
# from_addr:發送者郵箱# to_addrs:接收者郵箱,list# msg:消息體smtpObj.sendmail(from_addr, to_addrs, msg, mail_options=[], rcpt_options=[])
接下來的示例都是以網易郵箱作為郵箱服務器來寫的,網易163免費郵箱相關服務器信息如下:
使用網易郵箱作為發送者郵箱時應注意,郵箱密碼并非為郵箱的登錄密碼,而是客戶端授權密碼。
發送純文本郵件
首先,我們需要構造一個消息體:
from email.header import Headerfrom email.mime.text import MIMEText# 第一個參數為郵件正文,第二個參數為MINE的subtype,傳入‘plain',最終的MINE就是‘text/plain',最后參數為編碼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))# 發送者昵稱msg['From'] = _format_addr('發送者昵稱 <%s>'%from_addr) # 接收者昵稱msg['To'] = _format_addr('接收者昵稱 <%s>'%to_addr)# 標題msg['Subject'] = Header('標題','utf-8').encode()
此時就構造了一個簡單的消息體。切記,如果未指定標題以及昵稱,并且將其格式化編碼,有可能會被認為是辣雞郵件而導致發送失?。。?!
以下就是發送純文本郵件示例的完整代碼:
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('發送者昵稱 <%s>'%from_addr) msg['To'] = _format_addr('接收者昵稱 <%s>'%to_addr)msg['Subject'] = Header('標題','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()
新聞熱點
疑難解答