python發送郵件

来源:http://www.cnblogs.com/Chenjiabing/archive/2017/05/26/6907374.html
-Advertisement-
Play Games

python發送郵件 準備 python中發送郵件主要用的是smtplib和email兩個模塊,下麵主要對這兩個模塊進行講解 在講解之前需要準備至少兩個測試的郵箱,其中要在郵箱的設置中開啟smtplib協議才可以進行發送和接受 smtplib 是`SMTP 163 smtp.163.com port ...


python發送郵件

準備

python中發送郵件主要用的是smtplib和email兩個模塊,下麵主要對這兩個模塊進行講解

在講解之前需要準備至少兩個測試的郵箱,其中要在郵箱的設置中開啟smtplib協議才可以進行發送和接受

smtplib

  • smtplib.SMTP( [host [, port [, local_hostname[,timeout]]]]) hostSMTP主機的伺服器,其中163郵箱的是smtp.163.com,其他的可以在網上找到,port是埠號,這裡預設的是25local_hostname是你主機的SMTP,如果SMTP在你的本機上,你只需要指定伺服器地址為 localhost 即可。timeout是設置的連接的限制時間,如果超過這個時間還沒有連接上那麼就會出現錯誤
  • SMTP.set_debuglevel(level):設置是否為調試模式。預設為False,即非調試模式,表示不輸出任何調試信息。如果設置為1就表示輸出調試信息
  • SMTP.connect([host[, port]]):連接到指定的smtp伺服器。參數分別表示smpt主機和埠。註意: 也可以在host參數中指定埠號(如:smpt.yeah.net:25),這樣就沒必要給出port參數。
  • SMTP.login(user, password) 登錄伺服器,這裡的user是郵箱的用戶名,但是這裡的password並不是你郵箱的密碼,當你開啟SMTP的時候會提示你設置一個密碼,這裡的密碼就是對應的密碼
  • SMTP.sendmail(from_addr, [to_addrs,], msg[, mail_options, rcpt_options]) 發送郵件,from_addr是發送方也就是你的郵箱地址,to_addr是接受方的地址,當然這裡的可以填上多個郵箱賬號發送給多個賬號,如果有多個賬號需要使用列表傳遞參數
  • SMTP.quit()斷開連接

email

emial模塊用來處理郵件消息,包括MIME和其他基於RFC 2822的消息文檔。使用這些模塊來定義郵件的內容,是非常簡單的。其包括的類有(更加詳細的介紹可見:http://docs.python.org/library/email.mime.html):

  • class email.mime.base.MIMEBase(_maintype, _subtype, **_params):這是MIME的一個基類。一般不需要在使用時創建實例。其中_maintype是內容類型,如text或者image。_subtype是內容的minor type類型,如plain或者gif**_params是一個字典,直接傳遞給Message.add_header()。
  • class email.mime.multipart.MIMEMultipart([_subtype[, boundary[, _subparts[, _params]]]]MIMEBase的一個子類,多個MIME對象的集合,_subtype預設值為mixedboundaryMIMEMultipart的邊界,預設邊界是可數的。當需要發送附件的時候使用的就是這個類
  • class email.mime.application.MIMEApplication(_data[, _subtype[, _encoder[, **_params]]])MIMEMultipart的一個子類。
  • class email.mime.audio. MIMEAudio(_audiodata[, _subtype[, _encoder[, **_params]]])MIME音頻對象
  • class email.mime.image.MIMEImage(_imagedata[, _subtype[, _encoder[, **_params]]])MIME二進位文件對象。主要用來發送圖片

普通文本郵件

  • class email.mime.text.MIMEText(_text[, _subtype[, _charset]])MIME文本對象,其中_text是郵件內容,_subtype郵件類型,可以是text/plain(普通文本郵件),html/plain(html郵件), _charset編碼,可以是gb2312等等。
  • 普通文本郵件發送的實現,關鍵是要將MIMEText_subtype設置為plain。首先導入smtplibmimetext。創建smtplib.smtp實例,connect郵件smtp伺服器,login後發送,具體代碼如下*
# 一個格式化郵件的函數,可以用來使用
def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((
        Header(name, 'utf-8').encode(),
        addr.encode('utf-8') if isinstance(addr, unicode) else addr))

from_addr='××××××××'   #你的郵箱地址
from_password='×××××××'   #你的密碼
# to_email='[email protected]'
to_email='××××××'    #要發送的郵箱地址

msg=MIMEText('喬裝打扮,不擇手段','plain','utf-8')  #這裡text=喬裝打扮,不擇手段

msg['From'] = _format_addr(u'Python愛好者 <%s>' % from_addr)  #格式化發件人
msg['To'] = _format_addr(u'管理員 <%s>' % to_email)    #格式化收件人
msg['Subject'] = Header(u'來自SMTP的問候……', 'utf-8').encode()    #格式化主題

stmp='smtp.163.com'
server=smtplib.SMTP(stmp,port=25,timeout=30) #連接,設置超時時間30s
server.login(from_addr,from_password)    #登錄
server.set_debuglevel(1)        #輸出所有的信息
server.sendmail(from_addr,to_email,msg.as_string())   #這裡的as_string()是將msg轉換成字元串類型的,如果你想要發給多個人,需要講to_email換成一個列表

發送html郵件

還是用MIMEText來發送,不過其中的_subType設置成html即可,詳細代碼如下:

def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((
        Header(name, 'utf-8').encode(),
        addr.encode('utf-8') if isinstance(addr, unicode) else addr))

from_addr='××××××××'   #你的郵箱地址
from_password='×××××××'   #你的密碼
# to_email='[email protected]'
to_email='××××××'    #要發送的郵箱地址
html="""
<p><h1 style="color:red">大家好</h1></p>
"""

msg=MIMEText(html,'html','utf-8')  #這裡text=html,設置成html格式的

msg['From'] = _format_addr(u'Python愛好者 <%s>' % from_addr)  #格式化發件人
msg['To'] = _format_addr(u'管理員 <%s>' % to_email)    #格式化收件人
msg['Subject'] = Header(u'來自SMTP的問候……', 'utf-8').encode()    #格式化主題

stmp='smtp.163.com'
server=smtplib.SMTP(stmp,port=25,timeout=30) #連接,設置超時時間30s
server.login(from_addr,from_password)    #登錄
server.set_debuglevel(1)        #輸出所有的信息
server.sendmail(from_addr,to_email,msg.as_string())   #這裡的as_string()是將msg轉換成字元串類型的,如果你想要發給多個人,需要講to_email換成一個列表

附件的發送

發送帶附件的郵件,首先要創建MIMEMultipart()實例,然後構造附件,如果有多個附件,可依次構造,最後利用smtplib.smtp發送,具體實力如下:

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((
        Header(name, 'utf-8').encode(),
        addr.encode('utf-8') if isinstance(addr, unicode) else addr))

from_addr='××××××××'   #你的郵箱地址
from_password='×××××××'   #你的密碼
# to_email='[email protected]'
to_email='××××××'    #要發送的郵箱地址


msg=MIMEMultipart()   #創建實例
text=MIMEText('<h2 style="color:red">陳加兵</h2><br/><p>大家好</p>','html','utf-8')
msg.attach(text)   #添加一個正文信息,這裡實在正文中顯示的信息

#創建一個文本附件,這裡是從指定文本中讀取信息,然後創建一個文本信息
att1=MIMEText(open('/home/chenjiabing/文檔/MeiZi_img/full/file.txt','rb').read(),'plain','utf-8')
att1["Content-Type"] = 'application/octet-stream'  #指定類型
att1["Content-Disposition"] = 'attachment; filename="123.txt"'#這裡的filename可以任意寫,寫什麼名字,郵件中顯示什麼名字
msg.attach(att1)     #向其中添加附件

img_path='/home/chenjiabing/文檔/MeiZi_img/full/file.jpg'  #圖片路徑
image=MIMEImage(open(img_path,'rb').read())     #創建一個圖片附件
image.add_header('Content-ID','<0>')   #指定圖片的編號,這個會在後面用到
image.add_header('Content-Disposition', 'attachment', filename='test.jpg')        
image.add_header('X-Attachment-Id', '0')
msg.attach(image)    #添加附件


stmp='smtp.163.com'
server=smtplib.SMTP(stmp,port=25,timeout=30) #連接,設置超時時間30s
server.login(from_addr,from_password)    #登錄
server.set_debuglevel(1)        #輸出所有的信息
server.sendmail(from_addr,to_email,msg.as_string())   #這裡的as_string()是將msg轉換成字元串類型的,如果你想要發給多個人,需要講to_email換成一個列表

將圖片嵌入到正文信息中

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((
        Header(name, 'utf-8').encode(),
        addr.encode('utf-8') if isinstance(addr, unicode) else addr))

from_addr='××××××××'   #你的郵箱地址
from_password='×××××××'   #你的密碼
# to_email='[email protected]'
to_email='××××××'    #要發送的郵箱地址


msg=MIMEMultipart()   #創建實例
html="""
<html>
<head></head>
<body>
<p>下麵演示嵌入圖片</p>
<section>
<img src='cid:0' style='float:left'/>
<img src='cid:1' style='float:left'/>
</setcion>
</body>
</html>
"""

text=MIMEText('<h2 style="color:red">陳加兵</h2><br/><p>大家好</p>','html','utf-8')
msg.attach(text)   #添加一個正文信息,這裡實在正文中顯示的信息

#創建一個文本附件,這裡是從指定文本中讀取信息,然後創建一個文本信息
att1=MIMEText(open('/home/chenjiabing/文檔/MeiZi_img/full/file.txt','rb').read(),'plain','utf-8')
att1["Content-Type"] = 'application/octet-stream'  #指定類型
att1["Content-Disposition"] = 'attachment; filename="123.txt"'#這裡的filename可以任意寫,寫什麼名字,郵件中顯示什麼名字
msg.attach(att1)     #向其中添加附件


## 創建一個圖片附件
img_path='/home/chenjiabing/文檔/MeiZi_img/full/file.jpg'  #圖片路徑
image=MIMEImage(open(img_path,'rb').read())     #創建一個圖片附件
image.add_header('Content-ID','<0>')   #指定圖片的編號,
image.add_header('Content-Disposition', 'attachment', filename='test.jpg')        
image.add_header('X-Attachment-Id', '0')
msg.attach(image)    #添加附件

#創建第二個圖片附件
img_path_1='/home/chenjiabing/文檔/MeiZi_img/full/test.jpg'  #圖片路徑
image1=MIMEImage(open(img_path,'rb').read())     #創建一個圖片附件
image1.add_header('Content-ID','<1>')   #指定圖片的編號,這個就是在上面對應的cid:1的那張圖片,因此這裡的編號一定要對應
image1.add_header('Content-Disposition', 'attachment', filename='img.jpg')        
image1.add_header('X-Attachment-Id', '0')
msg1.attach(image)    #添加附件



stmp='smtp.163.com'
server=smtplib.SMTP(stmp,port=25,timeout=30) #連接,設置超時時間30s
server.login(from_addr,from_password)    #登錄
server.set_debuglevel(1)        #輸出所有的信息
server.sendmail(from_addr,to_email,msg.as_string())   #這裡的as_string()是將msg轉換成字元串類型的,如果你想要發給多個人,需要講to_email換成一個列表

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、cron表達式簡單介紹和下載 1、在上一篇博客“Quartz.net 定時任務之簡單任務”中,我簡單介紹了quartz的使用,而這篇博客我將介紹cron的具體使用(不足之處望大神斧正) 1、cron是為了方便編寫定時執行作業時間擴展出來的插件,這個有很多版本(網頁版,窗體版等),cron表達式的 ...
  • 首先看一下無參的構造方法: 在未指定容量大小時,會將final的DEFAULTCAPACITY_EMPTY_ELEMENTDATA給elementData,這樣的好處是無論多少次實例化無參ArrayList初始的保存對象都是固定的,而不必每次都創建一個新的Object數組. 這樣需要在每次做添加操作 ...
  • 本文簡要介紹在 Java 世界中, 線程相關知識。主要包含 線程的創建與銷毀;線程安全與同步;線程通訊;註意本文沒有什麼高深新知識,只緣起前段時間在翻看項目代碼的時候,發現有些同學對此有諸多誤解,故在此稍微整理一下,以幫助類似同學,同時警醒一下自己。 ...
  • 例一: 一個Student pojo類: public class Student{ private String name; private int age; public String getName(){ return this.name; } public void setName(Stri... ...
  • 即使是經驗豐富的程式猿,在編程的過程中犯個錯誤也是在所難免的。如果開發人員不能註意到這些錯誤,也無法瞭解編譯器報錯信息的含義,那麼這些錯誤信息不僅毫無用處,還會常常讓人感到沮喪,所以更好地理解錯誤信息可以大大節省尋找並改正錯誤內容所花費的時間。 變數聲明: 如果在一條語句中聲明一個變數,如下所示:$ ...
  • orm: 對象關係映射,把原來對資料庫表和欄位的操作改變為對類和對象的操作,是對象和關係的映射,主要實現程式對象到關係資料庫數據的映射。通俗理解就是不需要直接對資料庫操作,例如寫sql語句,建表等。 hibernate屬於orm框架,因為hibernate對jdbc重度封裝,不用寫sql語句,在用h ...
  • spring可以幫助開發人員管理一些與開發代碼無關的事,例如日誌,事物等。 spring中用到了什麼設計模式: 1.工廠模式,這個很明顯,在各種BeanFactory以及ApplicationContext創建中都用到了; 2.模版模式,這個也很明顯,在各種BeanFactory以及Applicat ...
  • 程式只要在運行,就免不了會出現錯誤,錯誤很常見,比如Error,Notice,Warning等等。在PHP中,主要有以下3種錯誤類型。 1. 註意(Notices) 這些都是比較小而且不嚴重的錯誤,比如去訪問一個未被定義的變數。通常,這類的錯誤是不提示給用戶的,但有時這些錯誤會影響到運行的結果。 2 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...