python郵件擴展(Python發送郵件)

本文目錄一覽:

如何在python程序中發郵件

python中email模塊使得處理郵件變得比較簡單,今天著重學習了一下發送郵件的具體做法,這裡寫寫自己的的心得,也請高手給些指點。

一、相關模塊介紹

發送郵件主要用到了smtplib和email兩個模塊,這裡首先就兩個模塊進行一下簡單的介紹:

1、smtplib模塊

smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])

SMTP類構造函數,表示與SMTP伺服器之間的連接,通過這個連接可以向smtp伺服器發送指令,執行相關操作(如:登陸、發送郵件)。所有參數都是可選的。

host:smtp伺服器主機名

port:smtp服務的埠,默認是25;如果在創建SMTP對象的時候提供了這兩個參數,在初始化的時候會自動調用connect方法去連接伺服器。

smtplib模塊還提供了SMTP_SSL類和LMTP類,對它們的操作與SMTP基本一致。

smtplib.SMTP提供的方法:

SMTP.set_debuglevel(level):設置是否為調試模式。默認為False,即非調試模式,表示不輸出任何調試信息。

SMTP.connect([host[, port]]):連接到指定的smtp伺服器。參數分別表示smpt主機和埠。注意: 也可以在host參數中指定埠號(如:smpt.yeah.net:25),這樣就沒必要給出port參數。

SMTP.docmd(cmd[, argstring]):向smtp伺服器發送指令。可選參數argstring表示指令的參數。

SMTP.helo([hostname]) :使用”helo”指令向伺服器確認身份。相當於告訴smtp伺服器「我是誰」。

SMTP.has_extn(name):判斷指定名稱在伺服器郵件列表中是否存在。出於安全考慮,smtp伺服器往往屏蔽了該指令。

SMTP.verify(address) :判斷指定郵件地址是否在伺服器中存在。出於安全考慮,smtp伺服器往往屏蔽了該指令。

SMTP.login(user, password) :登陸到smtp伺服器。現在幾乎所有的smtp伺服器,都必須在驗證用戶信息合法之後才允許發送郵件。

SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]) :發送郵件。這裡要注意一下第三個參數,msg是字元串,表示郵件。我們知道郵件一般由標題,發信人,收件人,郵件內容,附件等構成,發送郵件的時候,要注意msg的格式。這個格式就是smtp協議中定義的格式。

SMTP.quit() :斷開與smtp伺服器的連接,相當於發送”quit”指令。(很多程序中都用到了smtp.close(),具體與quit的區別google了一下,也沒找到答案。)

2、email模塊

emial模塊用來處理郵件消息,包括MIME和其他基於RFC 2822 的消息文檔。使用這些模塊來定義郵件的內容,是非常簡單的。其包括的類有:

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默認值為mixed。boundary是MIMEMultipart的邊界,默認邊界是可數的。

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.message.MIMEMessage(_msg[, _subtype]):具體的一個message實例,使用方法如下:

msg=mail.Message.Message() #一個實例

msg[‘to’]=’XXX@XXX.com’ #發送到哪裡

msg[‘from’]=’YYY@YYYY.com’ #自己的郵件地址

msg[‘date’]=’2012-3-16′ #時間日期

msg[‘subject’]=’hello world’ #郵件主題

class email.mime.text.MIMEText(_text[, _subtype[, _charset]]):MIME文本對象,其中_text是郵件內容,_subtype郵件類型,可以是text/plain(普通文本郵件),html/plain(html郵件), _charset編碼,可以是gb2312等等。

二、幾種郵件的具體實現代碼

1、普通文本郵件

普通文本郵件發送的實現,關鍵是要將MIMEText中_subtype設置為plain。首先導入smtplib和mimetext。創建smtplib.smtp實例,connect郵件smtp伺服器,login後發送,具體代碼如下:(python2.6下實現)

# -*- coding: UTF-8 -*-

import smtplib

from email.mime.text import MIMEText

mailto_list=[YYY@YYY.com]

mail_host=”smtp.XXX.com” #設置伺服器

mail_user=”XXXX” #用戶名

mail_pass=”XXXXXX” #口令

mail_postfix=”XXX.com” #發件箱的後綴

def send_mail(to_list,sub,content):

me=”hello”+””+mail_user+”@”+mail_postfix+””

msg = MIMEText(content,_subtype=’plain’,_charset=’gb2312′)

msg[‘Subject’] = sub

msg[‘From’] = me

msg[‘To’] = “;”.join(to_list)

try:

server = smtplib.SMTP()

server.connect(mail_host)

server.login(mail_user,mail_pass)

server.sendmail(me, to_list, msg.as_string())

server.close()

return True

except Exception, e:

print str(e)

return False

if __name__ == ‘__main__’:

if send_mail(mailto_list,”hello”,”hello world!”):

print “發送成功”

else:

print “發送失敗”

2、html郵件的發送

與text郵件不同之處就是將將MIMEText中_subtype設置為html。具體代碼如下:(python2.6下實現)

# -*- coding: utf-8 -*-

import smtplib

from email.mime.text import MIMEText

mailto_list=[“YYY@YYY.com”]

mail_host=”smtp.XXX.com” #設置伺服器

mail_user=”XXX” #用戶名

mail_pass=”XXXX” #口令

mail_postfix=”XXX.com” #發件箱的後綴

def send_mail(to_list,sub,content): #to_list:收件人;sub:主題;content:郵件內容

me=”hello”+””+mail_user+”@”+mail_postfix+”” #這裡的hello可以任意設置,收到信後,將按照設置顯示

msg = MIMEText(content,_subtype=’html’,_charset=’gb2312′) #創建一個實例,這裡設置為html格式郵件

msg[‘Subject’] = sub #設置主題

msg[‘From’] = me

msg[‘To’] = “;”.join(to_list)

try:

s = smtplib.SMTP()

s.connect(mail_host) #連接smtp伺服器

s.login(mail_user,mail_pass) #登陸伺服器

s.sendmail(me, to_list, msg.as_string()) #發送郵件

s.close()

return True

except Exception, e:

print str(e)

return False

if __name__ == ‘__main__’:

if send_mail(mailto_list,”hello”,”a href=”小五義/a”):

print “發送成功”

else:

print “發送失敗”

3、發送帶附件的郵件

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

# -*- coding: cp936 -*-

from email.mime.text import MIMEText

from email.mime.multipart import MIMEMultipart

import smtplib

#創建一個帶附件的實例

msg = MIMEMultipart()

#構造附件1

att1 = MIMEText(open(‘d:\\123.rar’, ‘rb’).read(), ‘base64’, ‘gb2312’)

att1[“Content-Type”] = ‘application/octet-stream’

att1[“Content-Disposition”] = ‘attachment; filename=”123.doc”‘#這裡的filename可以任意寫,寫什麼名字,郵件中顯示什麼名字

msg.attach(att1)

#構造附件2

att2 = MIMEText(open(‘d:\\123.txt’, ‘rb’).read(), ‘base64’, ‘gb2312’)

att2[“Content-Type”] = ‘application/octet-stream’

att2[“Content-Disposition”] = ‘attachment; filename=”123.txt”‘

msg.attach(att2)

#加郵件頭

msg[‘to’] = ‘YYY@YYY.com’

msg[‘from’] = ‘XXX@XXX.com’

msg[‘subject’] = ‘hello world’

#發送郵件

try:

server = smtplib.SMTP()

server.connect(‘smtp.XXX.com’)

server.login(‘XXX’,’XXXXX’)#XXX為用戶名,XXXXX為密碼

server.sendmail(msg[‘from’], msg[‘to’],msg.as_string())

server.quit()

print ‘發送成功’

except Exception, e:

print str(e)

4、利用MIMEimage發送圖片

# -*- coding: cp936 -*-

import smtplib

import mimetypes

from email.mime.text import MIMEText

from email.mime.multipart import MIMEMultipart

from email.mime.image import MIMEImage

def AutoSendMail():

msg = MIMEMultipart()

msg[‘From’] = “XXX@XXX.com”

msg[‘To’] = “YYY@YYY.com”

msg[‘Subject’] = “hello world”

txt = MIMEText(“這是中文的郵件內容哦”,’plain’,’gb2312′)

msg.attach(txt)

file1 = “C:\\hello.jpg”

image = MIMEImage(open(file1,’rb’).read())

image.add_header(‘Content-ID’,’image1′)

msg.attach(image)

server = smtplib.SMTP()

server.connect(‘smtp.XXX.com’)

server.login(‘XXX’,’XXXXXX’)

server.sendmail(msg[‘From’],msg[‘To’],msg.as_string())

server.quit()

if __name__ == “__main__”:

AutoSendMail()

利用MIMEimage發送圖片,原本是想圖片能夠在正文中顯示,可是代碼運行後發現,依然是以附件形式發送的,希望有高手能夠指點一下,如何可以發送在正文中顯示的圖片的郵件,就是圖片是附件中存在,但同時能顯示在正文中,具體形式如下圖。

python批量發送郵件–包括批量不同附件

小豬在公司做出納,乾的活卻包括了出納、會計、結算專員等工作,周末都要被無奈在家加班,主要還沒有加班費,簡直是被公司嚴重壓榨。每個月初都要給每個工長發預付款賬單郵件,月中髮結算款賬單。重複性機械工作。

一個及格線上的程序員,最起碼的覺悟就是將重複性的機械工作自動化,於是,在我花了一個多小時,幫她給一部分工長發了一次郵箱後,默默的回來寫了這個腳本。

所以,設計要點就是一個字—— 懶 。

恩,就醬。

經過我觀察,郵件內容分為兩種,這裡先說第一種,「結算款」:

(1) 郵件內容(content)不變,為固定的txt文本

(2) 附件(attch)為每個工長的結算賬單(excel文件.xlsx),此文件命名為總賬單中自動分割出來的名字(暫時不懂怎麼分割出來的=.=),格式為:

(3) 郵件主題(Subject)為附件名(不帶後綴名)

(4) 郵件接收對象(工長)的名單及其郵箱地址基本不變,偶爾變動

(5)

(1) 將工長及其郵箱地址存為CSV文件的兩列,python中將其讀取為字典形式,存儲以供後續查詢郵箱地址。

(2) 遍歷文件夾中的附件(.xlsx類型文件),對其進行兩種操作,一方面將其名字(不帶路徑和後綴)提取出來,作為郵件主題(Subject),並對Subject進一步劃分,得到其中的人名(工長);另一方面,將其傳入MIMEbase模塊中轉為郵件附件對象。

(3) 由上述得到的人名(name),在字典形式的通訊錄中,查找相應的地址(value),即為收件人名稱和地址

(4) 利用python中的email模塊和smtp模塊,登錄自己的郵箱賬號,再對每個附件,得到的收件人名和地址,添加附件,發送郵件。done

在設計過程中有幾點需要注意

(1) 有時一個郵件地址對應兩個人名,此時應該在CSV文件中分為兩行存儲,而不是將兩個人名存為同一個鍵;

(2)有賬單.xlsx文件,通訊錄里卻沒存儲此人記錄,程序應該列印提示沒有通訊記錄的人名,且不能直接退出,要保證員工看到此提示,此第一版程序還有解決此問題;

(3)此程序發送的郵件內容為純文本,若要求郵件內容有不同格式(如部分加粗,部分紅色),還有小部分需要每次更改的地方(如郵件內容包含當前月份),如何解決?(這就是第二種郵件內容,「預算款」);

(4)重名的,暫時還沒碰到,程序中也沒給出解決方案。

第一版到此,20180830,待更新

第二版更新,20180904

第三版更新,20180909

轉戰CSDN博客,更多博客見傳送門《 xiaozhou的博客主頁 》

Python向多人發送、抄送帶附件的郵件(含詳細代碼)

python要發送帶附件的郵件,首先要創建MIMEMultipart()實例,然後構造附件,如果有多個附件,可依次構造,最後使用smtplib.smtp發送。

步驟:

(1)設置伺服器所需信息(ps:部門郵箱密碼為授權碼,需自行登錄相應郵箱設置授權碼)

(2)設置email信息

(3)附件部分

(4)登錄郵箱並發送郵件

附上源碼:

python電子郵件系列(三)之POP接收郵件

由上篇文章我們已經得知郵件從發送到接收的過程:

發件人-MUA-MTA-若干MTA-MDA-MUA-收件人

本節接收郵件主要就是編寫一個 MUA 客戶端,從 MDA 將郵件取回本地。

收取郵件最常用的是 POP協議 ,目前版本是第三版,也稱 POP3 。python內置了 poplib 模塊,支持POP3協議。

回想上一節 SMTP ,我們對要發送的郵件內容進行了各種編碼,包括添加MIME header,編碼之後再進行發送。

因此,我們通過POP3協議接收的也不是原內容,而是經過一系列編碼等處理的文本。

所以,要想把POP3收取的文本變為可閱讀的郵件對象,就需要利用 email 模塊對原始郵件進行解析。

所以,郵件收取的流程就是:

由上一篇 文章 最後總結部分可知。郵件由字元到發送到網路經歷了如下的格式轉化:

純文本:

str-bytes-base64-str-bytes

二進位文件:

binary code-base64-str-bytes

我們解析郵件也是按這個思路,逆序解析出內容。

這裡的 decode(‘utf-8’) 先把位元組流轉化為字元串,再將字元串轉化為 message 結構的對象。這步與發送郵件的 as_string 函數相反。

先從上一節結構化的 msg 中取出信件頭,列印出來。

如果是 multipart 結構, get_payload 函數會返回一個包含不同part的list,然後對每一part遞歸調用 print_info ,列印子信件頭和子信件內容。

不是 multipart 時,之後再依據 Content-Type 作不同處理:

如果是 text :

利用 get_payload(decode = Ture) 取出子信件的內容, decode 為True,則按照 Content-Transfer-Type 將 base64 或 QP 解碼為 bytes 。

再 guess_charset 猜出編碼方式,之後將其解碼為字元顯示。

如果不是 Text 對象,則為附件:

列印出附件的 Content-Type 。

原創文章,作者:0CPGM,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/128455.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
0CPGM的頭像0CPGM
上一篇 2024-10-03 23:25
下一篇 2024-10-03 23:25

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29

發表回復

登錄後才能評論