我們在測試完成后,都會發一份郵件也就是我們的測試報告,那么既然要自動化,是不是也可以通過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()
小伙伴們可以動手嘗試嘗試,如果安靜寫的對您有幫助的話,點個關注,持續更新,如果那里寫的不懂或者寫錯的地方,下方留言看到第一時間更改。