python實現郵件接口——smtplib模塊


1. 思路

使用腳本發送郵件的思路其實和客戶端發送郵件一樣,過程都是:

登錄 —> 寫郵件 —> 發送

只不過通過腳本發送時我們需要考慮到整個過程的方方面面。以下為思路導圖:

2. Python-email 模塊

與發送郵件相關的 Python 模塊:

smtplib

是關於 SMTP(簡單郵件傳輸協議)的操作模塊,在發送郵件的過程中起到服務器之間互相通信的作用。

email

簡單來說,即服務器之間通信的信息,包括信息頭、信息主體等等。

舉個簡單的例子,當你登錄郵箱,寫好郵件后點擊發送,這部分是由 SMTP 接管;而寫郵件、添加附件是由 email 模塊控制。

3. 開通電子郵箱的SMTP功能

在使用腳本發郵件之前,我們需要打開自己郵箱的 SMTP 功能,各家郵箱的設置方法就不一一講述了,具體使用時可以百度一下,下面以 163 郵箱設置為例做一個簡單的演示:

4. 簡單代碼

實踐出真知,我們結合一個簡單的代碼來理解這一過程:登錄 163 郵箱,向 qq 郵箱發送郵件。

腳本分為三個步驟:

  1. 設置好服務器端信息
  2. 郵件主體信息
  3. 登錄發送

另外在處理文本時,我們需要使用 MIMEText 類。

import smtplib from email.mime.text import MIMEText #設置服務器所需信息 #163郵箱服務器地址 mail_host = 'smtp.163.com' #163用戶名 mail_user = '159*****02' #密碼(部分郵箱為授權碼) mail_pass = '7******x' #郵件發送方郵箱地址 sender = '159*****02@163.com' #郵件接受方郵箱地址,注意需要[]包裹,這意味着你可以寫多個郵件地址群發 receivers = ['59*****02@qq.com'] #設置email信息 #郵件內容設置 message = MIMEText('content','plain','utf-8') #郵件主題 message['Subject'] = 'title' #發送方信息 message['From'] = sender #接受方信息 message['To'] = receivers[0] #登錄並發送郵件 try: smtpObj = smtplib.SMTP() #連接到服務器 smtpObj.connect(mail_host,25) #登錄到服務器 smtpObj.login(mail_user,mail_pass) #發送 smtpObj.sendmail( sender,receivers,message.as_string()) #退出 smtpObj.quit() print('success') except smtplib.SMTPException as e: print('error',e) #打印錯誤 

結果:

 

注意事項:

一些郵箱登錄比如 QQ 郵箱需要 SSL 認證,所以 SMTP 已經不能滿足要求,而需要SMTP_SSL,解決辦法為:

#啟動 smtpObj = smtplib.SMTP() #連接到服務器 smtpObj.connect(mail_host,25) #######替換為######## smtpObj = smtplib.SMTP_SSL(mail_host) 

5. 帶有附件的email

上面我們介紹了發送字符串的郵件,但這明顯不滿足現代郵件的需求,下面我們介紹如何發送內容以 HTML 格式,並且帶有圖片和文本文件的郵件。

處理多種形態的郵件主體我們需要 MIMEMultipart 類,而處理圖片需要 MIMEImage 類。

import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.image import MIMEImage #設置登錄及服務器信息 mail_host = 'smtp.163.com' mail_user = '159*****02' mail_pass = '7******x' sender = '159*****02@163.com' receivers = ['7******0@qq.com'] #設置eamil信息 #添加一個MIMEmultipart類,處理正文及附件 message = MIMEMultipart() message['From'] = sender message['To'] = receivers[0] message['Subject'] = 'title' #推薦使用html格式的正文內容,這樣比較靈活,可以附加圖片地址,調整格式等 with open('abc.html','r') as f: content = f.read() #設置html格式參數 part1 = MIMEText(content,'html','utf-8') #添加一個txt文本附件 with open('abc.txt','r')as h: content2 = h.read() #設置txt參數 part2 = MIMEText(content2,'plain','utf-8') #附件設置內容類型,方便起見,設置為二進制流 part2['Content-Type'] = 'application/octet-stream' #設置附件頭,添加文件名 part2['Content-Disposition'] = 'attachment;filename="abc.txt"' #添加照片附件 with open('1.png','rb')as fp: picture = MIMEImage(fp.read()) #與txt文件設置相似 picture['Content-Type'] = 'application/octet-stream' picture['Content-Disposition'] = 'attachment;filename="1.png"' #將內容附加到郵件主體中 message.attach(part1) message.attach(part2) message.attach(picture) #登錄並發送 try: smtpObj = smtplib.SMTP() smtpObj.connect(mail_host,25) smtpObj.login(mail_user,mail_pass) smtpObj.sendmail( sender,receivers,message.as_string()) print('success') smtpObj.quit() except smtplib.SMTPException as e: print('error',e) 

6.小結

通過上面的代碼,想必大家已經對發郵件有了基本的認識。

從整體上我們要把握整個過程的思路:

  1. 登錄
  2. 寫郵件
  3. 發送

微觀上我們需要了解:

  • smtplib/email 模塊的代碼規則;
  • 什么時候使用 SMTP,什么時候使用 SMTP_SSL?
  • 針對不同的郵件內容需要使用到不同的類,MIMEmultipart、MIMEText、MIMEIamge 等等;
  • 怎么去設置附件信息

當然,看再多教程,不如親自動手寫一段代碼。大家不妨都自己發一封郵件試一試。


免責聲明!

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



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