1. 程式人生 > >python自動發郵件總結及例項說明

python自動發郵件總結及例項說明

python發郵件需要掌握兩個模組的用法,smtplib和email,這倆模組是python自帶的,只需import即可使用。smtplib模組主要負責傳送郵件,email模組主要負責構造郵件。

smtplib模組主要負責傳送郵件:是一個傳送郵件的動作,連線郵箱伺服器,登入郵箱,傳送郵件(有發件人,收信人,郵件內容)。

email模組主要負責構造郵件:指的是郵箱頁面顯示的一些構造,如發件人,收件人,主題,正文,附件等。

1.smtplib模組

smtplib使用較為簡單。以下是最基本的語法。

匯入及使用方法如下:

import smtplib

smtp = smtplib.SMTP() 
smtp.connect(
'smtp.163.com,25') smtp.login(username, password) smtp.sendmail(sender, receiver, msg.as_string()) smtp.quit()

說明:

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:指定連線伺服器的埠號,預設為25.

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會話。

2.email模組

email模組下有mime包,mime英文全稱為“Multipurpose Internet Mail Extensions”,即多用途網際網路郵件擴充套件,是目前網際網路電子郵件普遍遵循的郵件技術規範。

該mime包下常用的有三個模組:text,image,multpart

匯入方法如下:

from email.mime.multipart import MIMEMultipart    
from email.mime.text import MIMEText    
from email.mime.image import MIMEImage

構造一個郵件物件就是一個Message物件,如果構造一個MIMEText物件,就表示一個文字郵件物件,如果構造一個MIMEImage物件,就表示一個作為附件的圖片,要把多個物件組合起來,就用MIMEMultipart物件,而MIMEBase可以表示任何物件。它們的繼承關係如下:

Message
+- MIMEBase
   +- MIMEMultipart
   +- MIMENonMultipart
      +- MIMEMessage
      +- MIMEText
      +- MIMEImage

2.1 text說明

郵件傳送程式為了防止有些郵件閱讀軟體不能顯示處理HTML格式的資料,通常都會用兩型別分別為"text/plain"和"text/html"

構造MIMEText物件時,第一個引數是郵件正文,第二個引數是MIME的subtype,最後一定要用utf-8編碼保證多語言相容性。

2.1.1新增普通文字

text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.baidu.com"    
text_plain = MIMEText(text,'plain', 'utf-8')    

檢視MIMEText屬性:可以觀察到MIMEText,MIMEImage和MIMEMultipart的屬性都一樣。

print dir(text_plain)

['__contains__', '__delitem__', '__doc__', '__getitem__', '__init__', '__len__', '__module__', '__setitem__', '__str__', '_charset', '_default_type', '_get_params_preserve', '_headers', '_payload', '_unixfrom', 'add_header', 'as_string', 'attach', 'defects', 'del_param', 'epilogue', 'get', 'get_all', 'get_boundary', 'get_charset', 'get_charsets', 'get_content_charset', 'get_content_maintype', 'get_content_subtype', 'get_content_type', 'get_default_type', 'get_filename', 'get_param', 'get_params', 'get_payload', 'get_unixfrom', 'has_key', 'is_multipart', 'items', 'keys', 'preamble', 'replace_header', 'set_boundary', 'set_charset', 'set_default_type', 'set_param', 'set_payload', 'set_type', 'set_unixfrom', 'values', 'walk']

2.1.2新增超文字

html = """
<html>  
  <body>  
    <p> 
       Here is the <a href="http://www.baidu.com">link</a> you wanted.
    </p> 
  </body>  
</html>  
"""    
text_html = MIMEText(html,'html', 'utf-8')  

2.1.3新增附件

sendfile=open(r'D:\pythontest\1111.txt','rb').read()
text_att = MIMEText(sendfile, 'base64', 'utf-8')    
text_att["Content-Type"] = 'application/octet-stream'    
text_att["Content-Disposition"] = 'attachment; filename="顯示的名字.txt"'  

2.2 image說明

新增圖片:

sendimagefile=open(r'D:\pythontest\testimage.png','rb').read()
image = MIMEImage(sendimagefile)
image.add_header('Content-ID','<image1>')

檢視MIMEImage屬性:

print dir(image)

['__contains__', '__delitem__', '__doc__', '__getitem__', '__init__', '__len__', '__module__', '__setitem__', '__str__', '_charset', '_default_type', '_get_params_preserve', '_headers', '_payload', '_unixfrom', 'add_header', 'as_string', 'attach', 'defects', 'del_param', 'epilogue', 'get', 'get_all', 'get_boundary', 'get_charset', 'get_charsets', 'get_content_charset', 'get_content_maintype', 'get_content_subtype', 'get_content_type', 'get_default_type', 'get_filename', 'get_param', 'get_params', 'get_payload', 'get_unixfrom', 'has_key', 'is_multipart', 'items', 'keys', 'preamble', 'replace_header', 'set_boundary', 'set_charset', 'set_default_type', 'set_param', 'set_payload', 'set_type', 'set_unixfrom', 'values', 'walk']

2.3 multpart說明

常見的multipart型別有三種:multipart/alternative, multipart/related和multipart/mixed。

郵件型別為"multipart/alternative"的郵件包括純文字正文(text/plain)和超文字正文(text/html)。

郵件型別為"multipart/related"的郵件正文中包括圖片,聲音等內嵌資源。

郵件型別為"multipart/mixed"的郵件包含附件。向上相容,如果一個郵件有純文字正文,超文字正文,內嵌資源,附件,則選擇mixed型別。

msg = MIMEMultipart('mixed')

我們必須把Subject,From,To,Date新增到MIMEText物件或者MIMEMultipart物件中,郵件中才會顯示主題,發件人,收件人,時間(若無時間,就預設一般為當前時間,該值一般不設定)。

msg = MIMEMultipart('mixed') 
msg['Subject'] = 'Python email test'
msg['From'] = '[email protected] <[email protected]>'
msg['To'] = '[email protected]'
msg['Date']='2012-3-16'

檢視MIMEMultipart屬性:

msg = MIMEMultipart('mixed') 
print dir(msg) 

結果:

['__contains__', '__delitem__', '__doc__', '__getitem__', '__init__', '__len__', '__module__', '__setitem__', '__str__', '_charset', '_default_type', '_get_params_preserve', '_headers', '_payload', '_unixfrom', 'add_header', 'as_string', 'attach', 'defects', 'del_param', 'epilogue', 'get', 'get_all', 'get_boundary', 'get_charset', 'get_charsets', 'get_content_charset', 'get_content_maintype', 'get_content_subtype', 'get_content_type', 'get_default_type', 'get_filename', 'get_param', 'get_params', 'get_payload', 'get_unixfrom', 'has_key', 'is_multipart', 'items', 'keys', 'preamble', 'replace_header', 'set_boundary', 'set_charset', 'set_default_type', 'set_param', 'set_payload', 'set_type', 'set_unixfrom', 'values', 'walk']

說明:

msg.add_header(_name,_value,**_params):新增郵件頭欄位。

msg.as_string():是將msg(MIMEText物件或者MIMEMultipart物件)變為str,如果只有一個html超文字正文或者plain普通文字正文的話,一般msg的型別可以是MIMEText;如果是多個的話,就都新增到MIMEMultipart,msg型別就變為MIMEMultipart。

msg.attach(MIMEText物件或MIMEImage物件):將MIMEText物件或MIMEImage物件新增到MIMEMultipart物件中。MIMEMultipart物件代表郵件本身,MIMEText物件或MIMEImage物件代表郵件正文。

以上的構造的文字,超文字,附件,圖片都何以新增到MIMEMultipart('mixed')中:

msg.attach(text_plain)    
msg.attach(text_html)    
msg.attach(text_att)    
msg.attach(image)

3.文字,html,圖片,附件實現例項

#coding: utf-8    
  
import smtplib    
from email.mime.multipart import MIMEMultipart    
from email.mime.text import MIMEText    
from email.mime.image import MIMEImage 
from email.header import Header   
    
#設定smtplib所需的引數
#下面的發件人,收件人是用於郵件傳輸的。
smtpserver = 'smtp.163.com'
username = '[email protected]'
password='XXX'
sender='[email protected]'
#receiver='[email protected]'
#收件人為多個收件人
receiver=['[email protected]','[email protected]']

subject = 'Python email test'
#通過Header物件編碼的文字,包含utf-8編碼資訊和Base64編碼資訊。以下中文名測試ok
#subject = '中文標題'
#subject=Header(subject, 'utf-8').encode()
    
#構造郵件物件MIMEMultipart物件
#下面的主題,發件人,收件人,日期是顯示在郵件頁面上的。
msg = MIMEMultipart('mixed') 
msg['Subject'] = subject
msg['From'] = '[email protected] <[email protected]>'
#msg['To'] = '[email protected]'
#收件人為多個收件人,通過join將列表轉換為以;為間隔的字串
msg['To'] = ";".join(receiver) 
#msg['Date']='2012-3-16'

#構造文字內容   
text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.baidu.com"    
text_plain = MIMEText(text,'plain', 'utf-8')    
msg.attach(text_plain)    

#構造圖片連結
sendimagefile=open(r'D:\pythontest\testimage.png','rb').read()
image = MIMEImage(sendimagefile)
image.add_header('Content-ID','<image1>')
image["Content-Disposition"] = 'attachment; filename="testimage.png"'
msg.attach(image)

#構造html
#傳送正文中的圖片:由於包含未被許可的資訊,網易郵箱定義為垃圾郵件,報554 DT:SPM :<p><img src="cid:image1"></p>
html = """
<html>  
  <head></head>  
  <body>  
    <p>Hi!<br>  
       How are you?<br>  
       Here is the <a href="http://www.baidu.com">link</a> you wanted.<br> 
    </p> 
  </body>  
</html>  
"""    
text_html = MIMEText(html,'html', 'utf-8')
text_html["Content-Disposition"] = 'attachment; filename="texthtml.html"'   
msg.attach(text_html)    


#構造附件
sendfile=open(r'D:\pythontest\1111.txt','rb').read()
text_att = MIMEText(sendfile, 'base64', 'utf-8') 
text_att["Content-Type"] = 'application/octet-stream'  
#以下附件可以重新命名成aaa.txt  
#text_att["Content-Disposition"] = 'attachment; filename="aaa.txt"'
#另一種實現方式
text_att.add_header('Content-Disposition', 'attachment', filename='aaa.txt')
#以下中文測試不ok
#text_att["Content-Disposition"] = u'attachment; filename="中文附件.txt"'.decode('utf-8')
msg.attach(text_att)    
       
#傳送郵件
smtp = smtplib.SMTP()    
smtp.connect('smtp.163.com')
#我們用set_debuglevel(1)就可以打印出和SMTP伺服器互動的所有資訊。
#smtp.set_debuglevel(1)  
smtp.login(username, password)    
smtp.sendmail(sender, receiver, msg.as_string())    
smtp.quit()

說明:

如果大家對add_header的入參有更多的瞭解(Content-Disposition,Content-Type,Content-ID),希望告訴我,謝謝。

(尊重筆者的勞動哦,轉載請說明出處哦。)

相關推薦

python自動郵件總結例項說明

python發郵件需要掌握兩個模組的用法,smtplib和email,這倆模組是python自帶的,只需import即可使用。smtplib模組主要負責傳送郵件,email模組主要負責構造郵件。 smtplib模組主要負責傳送郵件:是一個傳送郵件的動作,連線郵箱伺服器,登入郵箱,傳送郵件(有發件人,收信人,

python介面自動化(三十三)-python自動郵件總結例項說明番外篇——下(詳解)

簡介   發郵件前我們需要了解的是郵件是怎麼一個形式去傳送到對方手上的,通俗點來說就是你寫好一封信,然後裝進信封,寫上地址,貼上郵票,然後就近找個郵局,把信仍進去,其他的就不關心了,只是關心時間,而電子郵件不像日常傳送郵件的按天算,時間都是按 秒算的。 電子郵件的傳送流程: 1、你使用某款電子

python郵件總結例項說明,中文亂碼已解決(在最後一個模組)

python發郵件需要掌握兩個模組的用法,smtplib和email,這倆模組是python自帶的,只需import即可使用。smtplib模組主要負責傳送郵件,email模組主要負責構造郵件。 smtplib模組主要負責傳送郵件:是一個傳送郵件的動作,連線郵箱伺服器,登入郵箱,傳送郵件(有發件

利用python自動郵件

return ddr weather gin ade today code 每天 inf #coding:utf-8 import smtplib from email.mime.text import MIMEText from email.header import

Python自動郵件-yagmail庫

pass pan 單個 mail quest aid 忘記 rda 授權碼 之前寫過用標準庫使用Python Smtplib和email發送郵件,感覺很繁瑣,久了不用之後便忘記了。前幾天看知乎哪些Python庫讓你相見恨晚?,看到了yagmail第三方庫,學習過程中遇到一些

python自動郵件

tms with eve mtp cool 多個 郵件標題 smtplib rom 想著能用程序自動發郵件就好了,想到就動手寫了一個自動發郵件的腳本。 一:前提準備(我使用的是qq郵箱) 1、開通qq郵箱的smtp服務 2、上代碼 # -*- coding: utf-8

python 自動郵件

一、一般發郵件的方法 Python對SMTP支援有smtplib和email兩個模組,email負責構造郵件,smtplib負責傳送郵件。 注意到構造MIMETEXT物件時,第一個引數就是郵件正文,第二個引數是MIME的subtype,傳入'plain'表示純文字,最終的MIME就是‘text/plain

python如何郵件, 附件呼叫簡訊介面

首先,為了讀者能夠更好的去理解python裡面如何完成這些功能的,我會盡可能的將程式碼簡化!我們要怎麼完成利用python去發郵件呢?首先,我們要使用一個郵件伺服器,可以是(126,163,qq,yahoo等),也可以是自己搭建的伺服器(最好),然後開啟SMTP服務,拿到伺服

Selenuim+Python之元素定位總結例項說明

    網頁自動化最基本的要求就是要定位到各個元素,然後才能對該元素進行各種操作(輸入,點選,清除,提交等),所以筆者今天來總結下Selenuim+Python最基本的幾種定位方式及例項說明,希望能幫助到大家。 目錄 以百度搜索輸入框為例,具體說明各個定位方式的用法: (通過chrome

Ubuntu Linux自動郵件配置郵件傳送指令碼

測試環境:Ubuntu 11.10 1. 安裝mutt及msmtp軟體 sudo apt-get install mutt sudo apt-get install msmtp 2. 編輯配置檔案vi ~/.muttrc set sendmail="/usr/bin/

Python 自動郵件

設定 sage login 分享 app efault 測試 ipa imei 簡單郵件傳輸協議(SMTP)是一種協議,用於在郵件服務器之間發送電子郵件和路由電子郵件。Python提供smtplib模塊,該模塊定義了一個SMTP客戶端會話對象,可用於使用SMTP或ESMTP

python自動郵件

ive smtps quit mtp () rec subject 郵箱 alt Python 的 smtplib 模塊提供了發送電子郵件的功能。測試報告出來後,然後就把報告發送到郵箱。 一、先來看簡單的列子 使用QQ郵箱發送郵件,使用的是授權碼,需要先到QQ郵箱申請授權碼

Appium+python 自動郵件(2)

con rtp 正文 郵件 des 圖片 turn () dma 移動端執行完測試case之後,通過郵件自動發送測試報告。大體流程如下: 1、通過unittest框架的discover()發現所有測試用例 2、使用HTMLTestRunner的run()方法運行測試用例,生

python 自動qq郵件

import smtplib from email.mime.text import MIMEText from email.utils import formataddr   my_sender='[email protected]'    # 發件人郵箱賬號 my_pass = 'XXXXXXX

使用python自動郵件

def lena fail from sam arr .text encode cond 最近研究郵件透明加密技術,,需要使用腳本自動發送郵件測試,於是使用python寫了一個小程序。程序可以自動選擇不定數量的附件,隨機選擇主題,隨機選擇正文,然後自由組合發送,非常適合郵件

redmine創建新聞,自動郵件給項目組所有成員

redmin 接受 clas 9.png es2017 mage class 檢查 mine redmine創建新聞,自動發郵件給項目組所有成員: 1.添加用戶至公共項目內 2.配置系統郵件推送配置 3.檢查用戶接受推送配置 3.使用管理員賬戶發布新聞(不能自

java windows自動化-mail自動郵件

需要 -m vax catch 全部 post ont 地址 兩種 本文旨在讓測試人員了解如何發郵件 發郵件的話,最簡單的事是直接手動發郵件,但是在自動化測試中,應做到讓機器或者代碼來自動發送郵件,筆者大概了解以下幾種方法,總有一款口味適合你:1java代碼來做下面即為我的

python學習總結

也會 不定 啟動 enc 兩個 star 嘗試 到你 target 目錄 一、理解操作系統 二、任務類型 三、Socket模塊 四、一個簡單的C/S程序 五、使用阻塞IO實現並發 方案一:阻塞IO+多進程 方案二:阻塞IO+多線程 阻塞IO模型的思考和總結 六、使用非阻

SQL Server 2008 自動郵件HTML表格

自動發郵件 ont bus return select borde layout ati fix DECLARE @emailBody NVARCHAR(MAX); SET @emailBody = N‘<style>table{table-layout:

樹莓派從裝系統,連線wifi 到每次登入自動郵件

我自己有一個樹莓派,放那很久硬是沒有用到。今天在工作不忙的情況下,梳理一下樹莓派的使用。 首先,你需要下載一個樹莓派的映象檔案。樹莓派下載連結, 樹莓派首先需要把你下載的這個系統燒到一個cf卡里面,其實就是寫到cf卡上。這個各個系統有專門的軟體。 我主要分享的寫完硬碟之後的樹莓派