python發郵件需要掌握兩個模塊的用法,smtplib和email,這倆模塊是python自帶的,只需import即可使用。smtplib模塊主要負責發送郵件,email模塊主要負責構造郵件。
1. 基本流程如下:
1 #coding=utf-8 2 import smtplib 3 from email.mime.text import MIMEText 4 from email.header import Header 5 6 def send_email(SMTP_host, from_account, from_password, to_account, subject, content): 7 # 1. 實例化SMTP 8 smtp = smtplib.SMTP() 9 10 # 2. 鏈接郵件服務器 11 smtp.connect(SMTP_host) 12 13 # 3. 配置發送郵箱的用戶名和密碼 14 smtp.login(from_account, from_password) 15 16 # 4. 配置發送內容msg 17 msg = MIMEText(content, 'plain', 'utf-8') 18 msg['Subject'] = Header(subject,'utf-8') 19 msg['From'] = from_account 20 msg['To'] = to_account 21 22 # 5. 配置發送郵箱,接受郵箱,以及發送內容 23 smtp.sendmail(from_account, to_account, msg.as_string()) 24 25 # 6. 關閉郵件服務 26 smtp.quit() 27 28 if __name__ == '__main__': 29 send_email("smtp.163.com", "from_account", "from_pssword","to_account", "I want to talk to u", "In this semester")
2. smtplib模塊
- smtplib.SMTP():實例化SMTP()
- connect(host,port):
- host:指定連接的郵箱服務器。常用郵箱的smtp服務器地址如下:新浪郵箱:smtp.sina.com,新浪VIP:smtp.vip.sina.com,搜狐郵箱:smtp.sohu.com,126郵箱:smtp.126.com,139郵箱:smtp.139.com,163網易郵箱:smtp.163.com。
- port:指定連接服務器的端口號,默認為0.
- login(user,password):
- user:登錄郵箱的用戶名。
- password:登錄郵箱的密碼
- sendmail(from_addr,to_addrs,msg,...):
- from_addr:郵件發送者地址
- to_addrs:郵件接收者地址。字符串列表['接收地址1','接收地址2','接收地址3',...]或'接收地址'
- msg:發送消息:郵件內容。一般是msg.as_string():as_string()是將msg(MIMEText對象或者MIMEMultipart對象)變為str。
- quit():用於結束SMTP會話。
3. email模塊
email模塊下有mime包,mime英文全稱為“Multipurpose Internet Mail Extensions”,即多用途互聯網郵件擴展,是目前互聯網電子郵件普遍遵循的郵件技術規范。
該mime包下常用的有三個模塊:text,image,multpart。
3.1 導入方法:
1 from email.mime.multipart import MIMEMultipart 2 from email.mime.text import MIMEText 3 from email.mime.image import MIMEImage
其中:
- 構造一個郵件對象就是一個
Message
對象 - 如果構造一個
MIMEText
對象,就表示一個文本郵件對象 - 如果構造一個
MIMEImage
對象,就表示一個作為附件的圖片 - 要把多個對象組合起來,就用
MIMEMultipart
對象 - 而
MIMEBase
可以表示任何對象。它們的繼承關系如下:
Message
+- MIMEBase
+- MIMEMultipart
+- MIMENonMultipart
+- MIMEMessage
+- MIMEText
+- MIMEImage
3.2 傳送文本郵件
郵件發送程序為了防止有些郵件閱讀軟件不能顯示處理HTML格式的數據,通常都會用兩類型分別為"text/plain"和"text/html"(如果發送內容為中文,需要選擇“plain”,要不然無法顯示)
構造MIMEText對象時,第一個參數是郵件正文,第二個參數是MIME的subtype,最后一定要用utf-8編碼保證多語言兼容性。
3.2.1 添加普通文件
1 text = "This is a text\nHere is the link you want:\nhttp:\\www.baidu.com" 2 msg = MINEText(text, 'plain', utf-8)
3.2.2 添加超文本
1 html = """ 2 <html> 3 <body> 4 <p> 5 Here is the <a href="http://www.baidu.com">link</a> you wanted. 6 </p> 7 </body> 8 </html> 9 """ 10 msg = MIMEText(html,'html', 'utf-8')
3.2.3添加附件
1 sendfile = open('D:\\python\\sendfile.txt', 'rb').read() 2 msg = MINEText(sendfile, 'base64', 'utf-8') 3 msg['Content-type'] = 'application/octet-stream' 4 msg['Content-Disposition'] = 'attachment;filename= "文件顯示名字.txt"'
3.2.4 添加圖片
1 sendimagefile=open(r'D:\pythontest\testimage.png','rb').read() 2 msg = MIMEImage(sendimagefile) 3 msg.add_header('Content-ID','<image1>')
4. 自動發送測試報告的郵件
1 def send_report(): 2 # 一、獲取最新的報告 3 # 1. 獲取report目錄下的所有文件,結果以列表形式返回 4 case_list = os.listdir(report_dir) 5 # 2. 對case_list中所有元素按時間從大到小排序 6 case_list.sort(key=lambda fn: os.path.getmtime(report_dir + "\\" + fn) 7 if not os.path.isdir(report_dir + "\\" + fn) else 0) 8 # 3. 獲取最新報告的絕對路徑 9 print("The latest report:" + case_list[-1]) 10 latest_report = os.path.join(report_dir, case_list[-1]) 11 print(latest_report) 12 13 # 二、發送郵件 14 send_email("smtp.163.com", "xx", "xx","xx", "消費者登錄測試報告", latest_report)