python發送郵件(smtplib)


  我們在測試完成后,都會發一份郵件也就是我們的測試報告,那么既然要自動化,是不是也可以通過python幫助我們發送郵件?當然這么強大的python可以幫助你完成這個需求

SMTP

SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協議,它是一組用於由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。這里我們就需要用到這個庫。其中SMTP支持smtplib和Email兩個模塊,其中smtplib負責發送郵件,email負責構建郵件,SMTP支持發送純文本,攜帶附件和攜帶圖片等功能。

發送文本

源碼

class MIMEText(MIMENonMultipart):
    """Class for generating text/* type MIME documents."""

    def __init__(self, _text, _subtype='plain', _charset=None, *, policy=None):
""" 創建一個文本
/*類型的MIME文檔。     _text是這個消息對象的字符串。     _subtype是MIME子內容類型,默認為“plain”。     _charset是添加到內容類型的字符集參數頭。默認為“us-ascii”。注意,作為一個副作用,還將設置Content-Transfer-Encoding頭。 """ 如果沒有指定_charset,檢查是否有非ascii碼 #字符。如果不是,使用“us-ascii”,否則使用utf-8。 if _charset is None: try: _text.encode('us-ascii') _charset = 'us-ascii' except UnicodeEncodeError: _charset = 'utf-8' MIMENonMultipart.__init__(self, 'text', _subtype, policy=policy, **{'charset': str(_charset)}) self.set_payload(_text, _charset)

1、首先導入smtplib模塊和email模塊中MIMEText(表示文本)

2、准備發送郵件所需要的參數(服務器,發送者賬號,密碼,和收件人賬號)

# 服務器地址
smtpserver = 'smtp.163.com'
# 發送賬號
user = 'XXXXXXXX@163.com'
# 發送密碼
password = 'xxxxxxx'
# 收件人
receivers  = '821006052@qq.com'

3、根據源碼內容完成對參數對應填寫

# 郵件標題
subject = 'python 發送郵件'
# 發送內容 (文本內容,發送格式,編碼格式)
message = MIMEText('Python 通過smtplib發送郵件。。。', 'html', 'utf-8')
# 發送地址
message['From'] = user
# 接受地址
message['To'] =  receivers
# 郵件標題
message['subject'] =subject

4、通過對smtplib模塊對郵件進行發送

smtp = smtplib.SMTP()
# 連接服務器
smtp.connect(smtpserver)
# 登錄郵箱賬號
smtp.login(user,password)
# 發送賬號信息
smtp.sendmail(user,receivers,message.as_string())
# 關閉
smtp.quit()

然后進行執行,我們就會收到一份QQ郵箱了,郵箱的內容和標題和上方填寫的一致

 

攜帶附件

我們正常發送郵件的時候可能會攜帶一些附件,當然這個功能python也可以幫助我們完成,SMTP中自帶的有攜帶附件的模塊。

1、導入email中的MIMEMultipart模塊

2、准備發送郵件的配置和參數

3、郵件攜帶的附件

# coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

# 服務器地址
smtpserver = 'smtp.163.com'
# 發送賬號
user = 'xxxxxx@163.com'
# 發送密碼
password = 'xxxxx'
# 收件人
receivers  = '821006052@qq.com'
# 郵件標題
subject = 'python 發送攜帶附件郵件'
# 獲取附件信息
with open('name.txt','rb',)as f:
    body = f.read().decode()
message = MIMEMultipart()
# 發送地址
message['From'] = user
# 接受地址
message['To'] =  receivers
# 郵件標題
message['subject'] =subject
# 正文內容
body = MIMEText(body, 'html', 'utf-8')
message.attach(body)
# 傳當前目錄中的name.txt文件
att = MIMEText(open('name.txt', 'rb').read(), 'base64', 'utf-8')
att["Content-Type"] = 'application/octet-stream'    # 死格式
# filename 表示附件的名稱
att["Content-Disposition"] = 'attachment; filename="name.txt"'
message.attach(att)
smtp = smtplib.SMTP()
# 連接服務器
smtp.connect(smtpserver)
# 登錄郵箱賬號
smtp.login(user,password)
# 發送賬號信息
smtp.sendmail(user,receivers,message.as_string())
# 關閉
smtp.quit()

執行后查看郵箱會發現已經發送成功了。查看附件也是我們添加的附件內容

 

如果想要添加多個附件的話繼續重新傳取附件內容,只需要更改不同的附件名稱即可

# 傳當前目錄中的name.txt文件
att = MIMEText(open('name.txt', 'rb').read(), 'base64', 'utf-8')
att["Content-Type"] = 'application/octet-stream'        # 死格式
# filename 表示附件的名稱
att["Content-Disposition"] = 'attachment; filename="name.txt"'

郵件中添加圖片

我們正常發送郵件的時候可以添加圖片,當然python發送一樣可以幫助我們完成這個需求

1、添加圖片,需要用到email中的MIMEImage模塊

2、准備發送郵件的配置和參數

3、郵件攜帶的附件

由於html中不能添加圖片鏈接,因為會被認為是惡意鏈接,我們可以通過在html寫入圖片ID,通過ID進行匹配圖片內容

# 添加圖片
img_body = '''
<html>
<head>Python 發送攜帶圖片信息</head>
<body>
<p>
<p><img src="cid:imageid"></p>
<p>
</body>
</html>
'''
# 正文內容
body = MIMEText(img_body, 'html', 'utf-8')
f = open('123.jpg','rb')
mag = MIMEImage(f.read())
f.close()
# 定義圖片ID在HTML中展示
mag.add_header('Content-ID', 'imageid')
# 添加圖片圖片
message.attach(mag)
# 添加body內容
message.attach(body)

完整代碼

# coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage

# 服務器地址
smtpserver = 'smtp.163.com'
# 發送賬號
user = 'xxxxx@163.com'
# 發送密碼
password = 'xxxxxxx'
# 收件人
receivers  = '821006052@qq.com'
# 郵件標題
subject = 'python 發送圖片郵件'

message = MIMEMultipart()

# 添加圖片
img_body = '''
<html>
<head>Python 發送攜帶圖片信息</head>
<body>
<p>
<p><img src="cid:imageid"></p>
<p>
</body>
</html>
'''
# 正文內容
body = MIMEText(img_body, 'html', 'utf-8')
f = open('123.jpg','rb')
mag = MIMEImage(f.read())
f.close()
# 定義圖片ID在HTML中展示
mag.add_header('Content-ID', 'imageid')
# 添加圖片信息
message.attach(mag)
# 添加正文
message.attach(body)
# 發送地址
message['From'] = user
# 接受地址
message['To'] =  receivers
# 郵件標題
message['subject'] =subject

# 非SSL郵箱
smtp = smtplib.SMTP()
# 連接服務器
smtp.connect(smtpserver)
# 登錄郵箱賬號
smtp.login(user,password)
# 發送賬號信息
smtp.sendmail(user,receivers,message.as_string())
# 關閉
smtp.quit()

執行后發現郵件中圖片已經添加成功了

注意: 上面的使用一些常規的郵箱,如果你的發件郵箱有SSL認證的需要打開認證信息,比如QQ郵箱需要配置一些信息

QQ郵箱舉例:

1、進入-設置--賬戶--POP3服務內容,打開POP3/SMTP服務

 

 2、開啟后會給一個密碼,這個密碼就是我們需要登錄的密碼,復制保存下來

 

3、上面的代碼中需要更改服務器內容

# SSL郵箱(QQ郵箱)
smtp = smtplib.SMTP_SSL(smtpserver, 465)
# 登錄郵箱賬號
smtp.login(user,password)
# 發送賬號信息
smtp.sendmail(user,receivers,message.as_string())
# 關閉
smtp.quit()

 

小伙伴們可以動手嘗試嘗試,如果安靜寫的對您有幫助的話,點個關注,持續更新,如果那里寫的不懂或者寫錯的地方,下方留言看到第一時間更改。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM