? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?python使用SMTP發送電子郵件
SMTP是發送郵件的協議,Python內置對SMTP的支持,可以發送純文本郵件、HTML郵件以及帶附件的郵件。Python對SMTP支持有smtplib和email兩個模塊,email負責構造郵件,smtplib負責發送郵件。
一、發送純文本郵件
注:以qq郵箱發送郵件為例,使用QQ郵箱發送郵件時,須提前開通SMTP服務,密碼輸入QQ郵箱的授權碼。
使用到email模塊中MIMEText構造文本郵件對象,在參數中傳入。第一個參數是郵件正文,第二個參數是MIME的subtype,傳入'plain'表示純文本,最終的MIME就是'text/plain',最后一定要用utf-8編碼保證多語言兼容性。
使用smtplib模塊,該模塊定義了一個SMTP客戶端會話對象,可用于使用SMTP或ESMTP偵聽器守護程序向任何互聯網機器發送郵件。模塊中的sendmail實例方法,用于執行郵件發送的工作。它需要三個參數 -
sender - 具有發件人地址的字符串。
receiver - 字符串列表,每個收件人一個。
message - 作為格式如在各種RFC中指定的字符串。
示例代碼:
from email.mime.text import MIMEText
from email.header import Header
from smtplib import SMTP_SSL
# 發送純文本格式郵件
def send_email_text():
? ? # 郵件服務信息:郵件服務+發件人QQ郵箱信息+發件人郵箱+收件人郵箱
? ? smtp_server = 'smtp.qq.com'
? ? sender_qq = '296****177@qq.com'
? ? password = 'wsvh********dcjg'
? ? sender_email = '296****177@qq.com'
? ? receiver = '130****7364@163.com'
? ? # receiver = ['1@123.com','2@123.com','3@123.com']? # 給多人發送郵件,收件人傳入列表中,以逗號隔開
? ? # 郵件內容:正文+標題
? ? mail_content = '您好,這是一封使用python登錄QQ郵箱發送文本郵件的測試'
? ? mail_title = '文本格式郵件測試'
? ? # 發送郵件:連接smtp服務+登錄賬號+組裝郵件
? ? smtp = SMTP_SSL(smtp_server)? # 連接服務器
? ? smtp.ehlo(smtp_server)?
? ? smtp.login(sender_qq, password)? # 登錄賬號
? ? msg = MIMEText(mail_content, 'plain', 'utf-8')? # 指定郵件正文為純文本格式,以utf-8編碼
msg['Subject'] = Header(mail_title, 'utf-8')? # 郵件主題中包含中文,需要通過Header對象進行編碼
? ? msg['From'] = sender_email
? ? msg['To'] = receiver
? ? smtp.sendmail(sender_email, receiver, msg.as_string())
? ? smtp.close()
二、發送html格式郵件
發送html格式郵件,在構造MIMEText對象時,把HTML字符串傳進去,再把第二個參數由plain變為html就可以了。
示例代碼:
from email.mime.text import MIMEText
from email.header import Header
from smtplib import SMTP_SSL
# 使用Python發送HTML格式的郵件
? ? def send_email_html(self):
? ? ? ? # 郵件服務信息:郵件服務+發件人QQ郵箱信息+發件人郵箱+收件人郵箱
? ? ? ? smtp_server = 'smtp.qq.com'
? ? ? ? sender_qq = '296****177@qq.com'
? ? ? ? password = 'wsvh********dcjg'
? ? ? ? sender_email = '296****177@qq.com'
? ? ? ? receiver = '130****7364@163.com'
? ? ? ? # receiver = ['1@123.com','2@123.com','3@123.com']? # 給多人發送郵件
? ? ? ? # 郵件內容:正文+標題
? ? ? ? # 傳入Html格式的郵件內容
mail_content = '<html><body><h2>您好</h2>,<p>這是一封使用python登錄QQ郵箱發送文本郵件的測試</p></body></html>'
? ? ? ? mail_title = '發送網頁格式郵件測試'
? ? ? ? # 登錄smtp服務器并發送郵件
? ? ? ? smtp = SMTP_SSL(smtp_server)
? ? ? ? smtp.ehlo(smtp_server)? # 由客戶端發送,指示 ESMTP 會話開始
? ? ? ? smtp.login(sender_qq, password)
? ? ? ? msg = MIMEText(mail_content, 'html', 'utf-8')# 構建郵件對象,指定為html格式,以utf-8編碼
? ? ? ? msg['Subject'] = Header(mail_title, 'utf-8')? # 郵件主題中包含中文,需要通過Header對對象進行編碼
? ? ? ? msg['From'] = sender_email
? ? ? ? msg['To'] = receiver
? ? ? ? smtp.sendmail(sender_email, receiver, msg.as_string())
? ? ? ? smtp.close()
三、發送混合格式(帶附件)的郵件
發送帶附件格式的郵件,使用到email模塊下multipart中的MIMEMultipart方法,構建混合格式郵件對象,構造附件變量對象,再加載附件。
? # 使用Python發送帶附件的郵件
? ? def send_email_mixture(self, report_file):
? ? ? ? # 郵件服務信息:郵件服務+發件人QQ郵箱信息+發件人郵箱+收件人郵箱
? ? ? ? smtp_server = 'smtp.qq.com'
? ? ? ? sender_qq = '296****177@qq.com'
? ? ? ? password = 'wsv********lndcjg'
? ? ? ? sender_email = '296****177@qq.com'
? ? ? ? receiver = '130****7364@163.com'
? ? ? ? # receiver = ['1@123.com','2@123.com','3@123.com']? # 給多人發送郵件
? ? ? ? # 郵件內容:正文+標題
? ? ? ? # 傳入Html格式的郵件內容
? ? ? ? mail_content = '<html><body><h2>您好</h2>,<p>這是一封使用python登錄QQ郵箱發送網頁格式帶附件郵件的測試</p></body></html>'
? ? ? ? mail_title = '發送網頁格式帶附件的郵件測試'
? ? ? ? # 登錄smtp服務器并發送郵件
? ? ? ? smtp = SMTP_SSL(smtp_server)
? ? ? ? smtp.ehlo(smtp_server)? # 由客戶端發送,指示 ESMTP 會話開始
? ? ? ? smtp.login(sender_qq, password)
? ? ? ?msg = MIMEMultipart()? # 構建混合格式郵件對象
? ? ? ? msg.attach(MIMEText(mail_content, 'html', 'utf-8'))? # 郵件正文
? ? ? ? msg['Subject'] = Header(mail_title, 'utf-8')? # 郵件主題中包含中文,需要通過Header對對象進行編碼
? ? ? ? msg['From'] = sender_email
? ? ? ? msg['To'] = receiver
? ? ? ? # 加載附件
? ? ? ?att = MIMEText(open(report_file, 'rb').read(), 'base64', 'utf-8')? # 打開文件并以二進制方式讀取,以base64位加密,utf-8編碼保存作為附件
? ? ? ? att['Content-Type'] = 'application/octet-stream'? # 聲明附件內容類型
? ? ? ? att['Content-Disposition'] = 'attachment; filename="report.html"'? # 聲明附件描述及附件名稱
? ? ? ? msg.attach(att)
? ? ? ? smtp.sendmail(sender_email, receiver, msg.as_string())
? ? ? ? smtp.close()
四、發送HTML文本中帶圖片的郵件
將圖片嵌于郵件中,需要使用到email中的image模塊的MIMEImage方法,先構建混合郵件對象并指定指定subtype是alternative,同時兼容HTML和Plain格式。使用MIMEImage方法實例化圖片對象,并加載到郵件中。郵件正文HTML內容中添加圖片,在HTML中通過引用src="cid:0"就可以把附件作為圖片嵌入了。如果有多個圖片,給它們依次編號,然后引用不同的cid:x即可。
示例代碼:
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from smtplib import SMTP_SSL
from config.cif import *
# 發送HTML文本中帶圖片的郵件
? ? def send_email_html_img(self, data_file):
? ? ? ? # 郵件服務信息:郵件服務+發件人QQ郵箱信息+發件人郵箱+收件人郵箱
? ? ? ? smtp_server = 'smtp.qq.com'
? ? ? ? sender_qq = '296****177@qq.com'
? ? ? ? password = 'wsv********lndcjg'
? ? ? ? sender_email = '296****177@qq.com'
? ? ? ? receiver = '130****7364@163.com'
? ? ? ? # receiver = ['1@123.com','2@123.com','3@123.com']? # 給多人發送郵件
? ? ? ? # 郵件內容:正文+標題
? ? ? ? # 傳入Html格式的郵件內容
? ? ? ? mail_content = '''
? ? ? ? ? ? ? ? ? ? <html><body>
? ? ? ? ? ? ? ? ? ? <h2>您好</h2>,
? ? ? ? ? ? ? ? ? ? <p>這是一封使用python登錄QQ郵箱發送網頁格式帶圖片郵件的測試</p>,
? ? ? ? ? ? ? ? ? ? <p>圖片演示:</p>,
<p><img src="cid:01"></p>
? ? ? ? ? ? ? ? ? ? </body></html>
? ? ? ? ? ? ? ? ? ? '''
? ? ? ? mail_title = '發送網頁格式帶圖片郵件測試'
? ? ? ? # 登錄smtp服務器并發送郵件
? ? ? ? smtp = SMTP_SSL(smtp_server)
? ? ? ? smtp.ehlo(smtp_server)? # 由客戶端發送,指示 ESMTP 會話開始
? ? ? ? smtp.login(sender_qq, password)
? ? ? ? msg = MIMEMultipart('alternative')? # 同時支持HTML和Plain格式
? ? ? ? msg.attach(MIMEText(mail_content, 'html', 'utf-8'))? # 構建郵件對象,指定為html格式,以utf-8編碼
? ? ? ? msg['Subject'] = Header(mail_title, 'utf-8')? # 郵件主題中包含中文,需要通過Header對對象進行編碼
? ? ? ? msg['From'] = sender_email
? ? ? ? msg['To'] = receiver
? ? ? ? # 指定圖片
? ? ? img = MIMEImage(open(data_file, 'rb').read())
? ? ? ? # 定義圖片ID
? ? ? ?img.add_header('Content-ID', '0')
? ? ? ?msg.attach(img)
? ? ? ? smtp.sendmail(sender_email, receiver, msg.as_string())
? ? ? ? smtp.close()
參考:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432005226355aadb8d4b2f3f42f6b1d6f2c5bd8d5263000
https://www.yiibai.com/python/python_sending_email.html
http://www.lxweimin.com/p/abb2d6e91c1f