python自動發送郵件


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)

 


免責聲明!

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



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