python發郵件須要掌握兩個模塊的用法,smtplib和email,這倆模塊是python自帶的,只需import便可使用。smtplib模塊主要負責發送郵件,email模塊主要負責構造郵件。html
smtplib模塊主要負責發送郵件:是一個發送郵件的動做,鏈接郵箱服務器,登陸郵箱,發送郵件(有發件人,收信人,郵件內容)。python
email模塊主要負責構造郵件:指的是郵箱頁面顯示的一些構造,如發件人,收件人,主題,正文,附件等。api
import smtplib smtp = smtplib.SMTP() smtp.connect('smtp.163.com,25') smtp.login(username, password) smtp.sendmail(sender, receiver, msg.as_string()) smtp.quit()
from email.mime.text import MIMEText from email.header import Header from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart
咱們必須把Subject,From,To添加到MIMEText對象或者MIMEMultipart對象中,郵件中才會顯示主題,發件人,收件人。服務器
# 組裝郵件內容和標題,中文需參數‘utf-8’,單字節字符不須要 msg = MIMEMultipart() msg['Subject'] = Header(subject) msg['From'] = sender msg['To'] = ','.join(user_list)
自動化測試報告爲HTML,以附件方式發送,併發
無論什麼類型的附件,均可以用MIMEApplication,MIMEApplication默認子類型是application/octet-streamapp
# 發送html內容的郵件 import smtplib import time import os from email.mime.text import MIMEText from email.header import Header from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart class SendMail(): def find_new_file(self, dir): '''查找目錄下最新的文件''' file_lists = os.listdir(dir) file_lists.sort(key=lambda fn: os.path.getmtime(dir + "\\" + fn) if not os.path.isdir(dir + "\\" + fn) else 0) # print('最新的文件爲: ' + file_lists[-1]) file = os.path.join(dir, file_lists[-1]) print('完整文件路徑:', file) return file def send_mail_html(self, file): '''發送html格式測試報告郵件''' # 發送郵箱 sender = 'name@163.com' # 接收郵箱 user_list = [ 'user@foxmail.com', 'user@qq.com', 'user@qq.com'] # 發送郵件主題 t = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) subject = '接口自動化測試結果(請下載附件查看)_' + t # 發送郵箱服務器 smtpserver = 'smtp.163.com' # 發送郵箱用戶/密碼 username = 'user@163.com' password = 'youer_password' # 組裝郵件內容和標題,中文需參數‘utf-8’,單字節字符不須要 msg = MIMEMultipart() msg['Subject'] = Header(subject) msg['From'] = sender msg['To'] = ','.join(user_list) # ---這是附件部分--- # html類型附件,無論什麼類型的附件,均可以用MIMEApplication,MIMEApplication默認子類型是application/octet-stream。 part = MIMEApplication(open(file, 'rb').read()) part.add_header('Content-Disposition', 'attachment', filename=file) msg.attach(part) # 登陸併發送郵件 try: smtp = smtplib.SMTP() smtp.connect(smtpserver) smtp.login(username, password) smtp.sendmail(sender, user_list, msg.as_string()) except BaseException: print("郵件發送失敗!") else: print("郵件發送成功!") finally: smtp.quit() if __name__ == '__main__': sen = SendMail() dir = r'D:\\api\\report' # 指定文件目錄 b = sen.find_new_file(dir) # 查找最新的html文件 sen.send_mail_html(b) # 發送html內容郵件
ps:函數
python郵件發送給多人時,只有第一我的能收到的問題,測試
MIMEText()["to"]的數據類型與sendmail(from_addrs,to_addrs,...)的to_addrs不一樣;前者爲str類型,多個地址使用逗號分隔,後者爲list類型。ui
expects toaddrs to be a list of email addresses. (Or, of course, just use recipients in place of toaddrs.)
參考連接:https://stackoverflow.com/questions/20509427/python-not-sending-email-to-multiple-addressesspa