python使用SMTP發送電子郵件

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Linux多線程同步機制 - 信號量信號量函數定義如下:include int semctl(int sem_i...
    molscar閱讀 754評論 0 0
  • 文本郵件的發送 1.郵件發送流程 ? 郵件的發送是主動行為:主要通過 MUA/郵件客戶端軟件,將郵件內容發送給對應...
    YiFoErLiu閱讀 246評論 0 1
  • 前言 在進行日常的自動化測試實踐中,我們總是需要將測試過程中的記錄、結果等等等相關信息通過自動的手段發送給相關人員...
    苦葉子閱讀 665評論 0 5
  • 類 !/usr/bin/python -- coding: UTF-8 -- class Employee:'所有...
    SkTj閱讀 983評論 0 0
  • “青春在風中飄著”,記得,最初看到這句話時,是在五月天的一首歌里,霎時間覺得它帶著一份熟悉的意境,一種涌上心頭的美...
    滄海桑田雨落千年閱讀 400評論 0 0