Python 自動發送郵件
簡單郵件傳輸協議(SMTP)是一種協議,用於在郵件服務器之間發送電子郵件和路由電子郵件。Python提供smtplib
模塊,該模塊定義了一個SMTP客戶端會話對象,可用於使用SMTP或ESMTP偵聽器守護程序向任何互聯網機器發送郵件。
SMTP通訊的基本流程可以概括為以下幾點:
1.連接SMTP服務器
2.登陸用戶名和密碼
3.發送指定郵件內容
4.退出SMTP連接
一、發送純文本格式郵件
1 #coding:utf-8 2 import sys 3 reload(sys) 4 sys.setdefaultencoding(‘utf8‘) 5 import smtplib 6from smtplib import SMTP 7 from email.mime.text import MIMEText 8 from email.header import Header 9 10 #構造純文本郵件內容 11 msg = MIMEText(‘hello,send by Python.....‘,‘plain‘,‘utf-8‘) 12 13 #發送者郵箱 14 sender = ‘xxxxx@XXXXX.com.cn‘ 15 16 #發送者的登陸用戶名和密碼 17 user = ‘[email protected]‘ 18 password = ‘xxxxxx‘ 19 20 #發送者郵箱的SMTP服務器地址 21 smtpserver = ‘xxxx‘ 22 23 #接收者的郵箱地址 24 receiver = [‘[email protected]‘,‘[email protected]‘] #receiver 可以是一個list 25 26 smtp = smtplib.SMTP() #實例化SMTP對象 27 smtp.connect(smtpserver,25) #(缺省)默認端口是25 也可以根據服務器進行設定 28 smtp.login(user,password) #登陸smtp服務器 29 smtp.sendmail(sender,receiver,msg.as_string()) #發送郵件 ,這裏有三個參數 30 ‘‘‘ 31 login()方法用來登錄SMTP服務器,sendmail()方法就是發郵件,由於可以一次發給多個人,所以傳入一個list,郵件正文 32 是一個str,as_string()把MIMEText對象變成str。 33 ‘‘‘ 34 smtp.quit()
運行之後就會收到郵件:
但是仔細觀察會發現:
1.郵件沒有主題
2.看不到收件人的信息
這是因為郵件主題、如何顯示發件人、收件人等信息並不是通過SMTP協議發給MTA,而是包含在發給MTA的文本中的,所以,我們必須把From
、To
和Subject
添加到MIMEText
中,才是一封完整的郵件:
1 msg = MIMEText(‘hello,send by Python.....‘,‘plain‘,‘utf-8‘) 2 msg[‘From‘] = Header(‘Python測試‘,‘utf-8‘) 3 msg[‘To‘] = Header(‘管理員‘,‘utf-8‘) 4 subject = ‘python SMTP 測試郵件‘ 5 msg[‘Subject‘] = Header(subject,‘utf-8‘)
二、發送HTML格式的郵件
如果我們要發送HTML郵件,而不是普通的純文本文件怎麽辦?方法很簡單,在構造MIMEText
對象時,把HTML字符串傳進去,再把第二個參數由plain
變為html
就可以了:
1 msg = MIMEText(‘<html><h1>你好!<h1><html>‘,‘html‘,‘utf-8‘) #發送HTML格式郵件就只需要把對應的第二個參數改為html即可
三、發送帶附件的郵件
發送帶附件的郵件,首先要創建MIMEMultipart()實例,然後構造附件,如果有多個附件,可依次構造,最後利用smtplib.smtp發送。
1 #coding:utf-8 2 import sys 3 reload(sys) 4 sys.setdefaultencoding(‘utf8‘) 5 import smtplib 6 from email.mime.text import MIMEText 7 from email.mime.multipart import MIMEMultipart 8 from email.header import Header 9 10 #發送郵件服務器 11 smtpserver = ‘xxxxx‘ 12 #發送郵箱用戶名和密碼 13 user = ‘xxxxxx‘ 14 password = ‘xxxxxx‘ 15 #發送郵箱 16 sender = ‘xxxxx‘ 17 #接受郵箱 18 receiver = ‘xxxxxxx‘ 19 20 #創建一個帶附件的實例 21 message = MIMEMultipart() 22 message[‘From‘] = Header(‘Python 測試‘,‘utf-8‘) 23 message[‘To‘] = Header(‘測試‘,‘utf-8‘) 24 subject = ‘Python SMTP郵件測試‘ 25 message[‘Subject‘] = Header(subject,‘utf-8‘) 26 27 #郵件正文內容 28 message.attach(MIMEText(‘這是測試Python發送附件功能....‘,‘plain‘,‘utf-8‘)) 29 30 #構造附件1,傳送當前目錄下的test.txt文件 31 att1 = MIMEText(open(‘123.txt‘,‘rb‘).read(),‘base64‘,‘utf-8‘) 32 att1[‘Content-Type‘] = ‘application/octet-stream‘ 33 #這裏的filename可以任意寫,寫什麽名字 郵件中就顯示什麽名字 34 att1[‘Content-Disposition‘] = ‘attachment;filename:"123.txt"‘ 35 message.attach(att1) 36 37 smtp = smtplib.SMTP() 38 smtp.connect(smtpserver,25) 39 smtp.login(user,password) 40 smtp.sendmail(sender,receiver,message.as_string()) 41 smtp.quit()
小結
使用Python的smtplib發送郵件十分簡單,只要掌握了各種郵件類型的構造方法,正確設置好郵件頭,就可以順利發出。
構造一個郵件對象就是一個Messag
對象,如果構造一個MIMEText
對象,就表示一個文本郵件對象,如果構造一個MIMEImage
對象,就表示一個作為附件的圖片,要把多個對象組合起來,就用MIMEMultipart
對象,而MIMEBase
可以表示任何對象。它們的繼承關系如下:
Message
+- MIMEBase
+- MIMEMultipart
+- MIMENonMultipart
+- MIMEMessage
+- MIMEText
+- MIMEImage
這種嵌套關系就可以構造出任意復雜的郵件。你可以通過email.mime文檔查看它們所在的包以及詳細的用法。
Python 自動發送郵件