用python發(fā)送各類郵件

一、相關(guān)模塊介紹

發(fā)送郵件主要用到了smtplib和email兩個(gè)模塊,這里首先就兩個(gè)模塊進(jìn)行一下簡(jiǎn)單的介紹:

1、smtplib模塊

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

SMTP類構(gòu)造函數(shù),表示與SMTP服務(wù)器之間的連接,通過(guò)這個(gè)連接可以向smtp服務(wù)器發(fā)送指令,執(zhí)行相關(guān)操作(如:登陸、發(fā)送郵件)。所有參數(shù)都是可選的。

host:smtp服務(wù)器主機(jī)名

port:smtp服務(wù)的端口,默認(rèn)是25;如果在創(chuàng)建SMTP對(duì)象的時(shí)候提供了這兩個(gè)參數(shù),在初始化的時(shí)候會(huì)自動(dòng)調(diào)用connect方法去連接服務(wù)器。

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

smtplib.SMTP提供的方法:

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

SMTP.connect([host[, port]]):連接到指定的smtp服務(wù)器。參數(shù)分別表示smpt主機(jī)和端口。注意: 也可以在host參數(shù)中指定端口號(hào)(如:smpt.yeah.net:25),這樣就沒(méi)必要給出port參數(shù)。

SMTP.docmd(cmd[, argstring]):向smtp服務(wù)器發(fā)送指令。可選參數(shù)argstring表示指令的參數(shù)。

SMTP.helo([hostname]) :使用"helo"指令向服務(wù)器確認(rèn)身份。相當(dāng)于告訴smtp服務(wù)器“我是誰(shuí)”。

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

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

SMTP.login(user, password) :登陸到smtp服務(wù)器。現(xiàn)在幾乎所有的smtp服務(wù)器,都必須在驗(yàn)證用戶信息合法之后才允許發(fā)送郵件。

SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]) :發(fā)送郵件。這里要注意一下第三個(gè)參數(shù),msg是字符串,表示郵件。我們知道郵件一般由標(biāo)題,發(fā)信人,收件人,郵件內(nèi)容,附件等構(gòu)成,發(fā)送郵件的時(shí)候,要注意msg的格式。這個(gè)格式就是smtp協(xié)議中定義的格式。

SMTP.quit() :斷開(kāi)與smtp服務(wù)器的連接,相當(dāng)于發(fā)送"quit"指令。

2、email模塊

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

class email.mime.base.MIMEBase(_maintype, _subtype, **_params):這是MIME的一個(gè)基類。一般不需要在使用時(shí)創(chuàng)建實(shí)例。其中_maintype是內(nèi)容類型,如text或者image。_subtype是內(nèi)容的minor type 類型,如plain或者gif。?**_params是一個(gè)字典,直接傳遞給Message.add_header()。

class email.mime.multipart.MIMEMultipart([_subtype[, boundary[, _subparts[, _params]]]]:MIMEBase的一個(gè)子類,多個(gè)MIME對(duì)象的集合,_subtype默認(rèn)值為mixed。boundary是MIMEMultipart的邊界,默認(rèn)邊界是可數(shù)的。

class email.mime.application.MIMEApplication(_data[, _subtype[, _encoder[, **_params]]]):MIMEMultipart的一個(gè)子類。

class email.mime.audio. MIMEAudio(_audiodata[, _subtype[, _encoder[, **_params]]]): MIME音頻對(duì)象

class email.mime.image.MIMEImage(_imagedata[, _subtype[, _encoder[, **_params]]]):MIME二進(jìn)制文件對(duì)象。

class email.mime.message.MIMEMessage(_msg[, _subtype]):具體的一個(gè)message實(shí)例,使用方法如下:

msg=mail.Message.Message()#一個(gè)實(shí)例

msg['to']='XXX@XXX.com'#發(fā)送到哪里

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

msg['date']='2012-3-16'#時(shí)間日期

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

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

二、幾種郵件的具體實(shí)現(xiàn)代碼

1、普通文本郵件

普通文本郵件發(fā)送的實(shí)現(xiàn),關(guān)鍵是要將MIMEText中_subtype設(shè)置為plain。首先導(dǎo)入smtplib和mimetext。創(chuàng)建smtplib.smtp實(shí)例,connect郵件smtp服務(wù)器,login后發(fā)送,具體代碼如下:(python2.6下實(shí)現(xiàn))

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

importsmtplib

fromemail.mime.textimportMIMEText

mailto_list=[YYY@YYY.com]

mail_host="smtp.XXX.com"#設(shè)置服務(wù)器

mail_user="XXXX"#用戶名

mail_pass="XXXXXX"#口令

mail_postfix="XXX.com"#發(fā)件箱的后綴

defsend_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()

returnTrue

exceptException, e:

printstr(e)

returnFalse

if__name__=='__main__':

ifsend_mail(mailto_list,"hello","hello world!"):

print"發(fā)送成功"

else:

print"發(fā)送失敗"

2、html郵件的發(fā)送

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

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

importsmtplib

fromemail.mime.textimportMIMEText

mailto_list=["YYY@YYY.com"]

mail_host="smtp.XXX.com"#設(shè)置服務(wù)器

mail_user="XXX"#用戶名

mail_pass="XXXX"#口令

mail_postfix="XXX.com"#發(fā)件箱的后綴

defsend_mail(to_list,sub,content):#to_list:收件人;sub:主題;content:郵件內(nèi)容

me="hello"+"<"+mail_user+"@"+mail_postfix+">"#這里的hello可以任意設(shè)置,收到信后,將按照設(shè)置顯示

msg = MIMEText(content,_subtype='html',_charset='gb2312')#創(chuàng)建一個(gè)實(shí)例,這里設(shè)置為html格式郵件

msg['Subject'] = sub#設(shè)置主題

msg['From'] = me

msg['To'] =";".join(to_list)

try:

s = smtplib.SMTP()

s.connect(mail_host)#連接smtp服務(wù)器

s.login(mail_user,mail_pass)#登陸服務(wù)器

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

s.close()

returnTrue

exceptException, e:

printstr(e)

returnFalse

if__name__=='__main__':

ifsend_mail(mailto_list,"hello","你好"):

print"發(fā)送成功"

else:

print"發(fā)送失敗"

3、發(fā)送帶附件的郵件

發(fā)送帶附件的郵件,首先要?jiǎng)?chuàng)建MIMEMultipart()實(shí)例,然后構(gòu)造附件,如果有多個(gè)附件,可依次構(gòu)造,最后利用smtplib.smtp發(fā)送。

#-*- coding: cp936 -*-

fromemail.mime.textimportMIMEText

fromemail.mime.multipartimportMIMEMultipart

importsmtplib

#創(chuàng)建一個(gè)帶附件的實(shí)例

msg = MIMEMultipart()

#構(gòu)造附件1

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

att1["Content-Type"] ='application/octet-stream'

att1["Content-Disposition"] ='attachment; filename="123.doc"'

msg.attach(att1)

#構(gòu)造附件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'

#發(fā)送郵件

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'發(fā)送成功'

exceptException, e:

printstr(e)

4、利用MIMEimage發(fā)送圖片

#-*- coding: cp936 -*-

importsmtplib

importmimetypes

fromemail.mime.textimportMIMEText

fromemail.mime.multipartimportMIMEMultipart

fromemail.mime.imageimportMIMEImage

defAutoSendMail():

msg = MIMEMultipart()

msg['From'] ="XXX@XXX.com"

msg['To'] ="YYY@YYY.com"

msg['Subject'] ="hello world"

txt = MIMEText("這是中文的郵件內(nèi)容哦",'plain','gb2312')

msg.attach(txt)

file1 ="C:\\hello.jpg"

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

image.add_header('Content-ID','')

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()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,237評(píng)論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,957評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 177,248評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 63,356評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,081評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 55,485評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,534評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 42,720評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,263評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,025評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,204評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,787評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,461評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 34,874評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 36,105評(píng)論 1 289
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,945評(píng)論 3 395
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,205評(píng)論 2 375

推薦閱讀更多精彩內(nèi)容

  • 背景 公司內(nèi)網(wǎng)有個(gè)論壇,各種公司的前沿消息都會(huì)有人在討論。一忙起來(lái),經(jīng)常忘記逛論壇,所以寫了個(gè)爬蟲(chóng),爬取論壇前10...
    aialin閱讀 942評(píng)論 0 11
  • Django 官方文檔 發(fā)送email 官網(wǎng)地址:[https://docs.djangoproject.com/...
    學(xué)以致用123閱讀 2,303評(píng)論 0 2
  • 前言 在進(jìn)行日常的自動(dòng)化測(cè)試實(shí)踐中,我們總是需要將測(cè)試過(guò)程中的記錄、結(jié)果等等等相關(guān)信息通過(guò)自動(dòng)的手段發(fā)送給相關(guān)人員...
    苦葉子閱讀 663評(píng)論 0 5
  • 從男朋友追我,到答應(yīng)在一起,掐指一算,竟然才短短幾天時(shí)間。有時(shí)想到高中英語(yǔ)老師和我們聊的:不要輕易答應(yīng)男生的追求,...
    不厭雎鳩閱讀 400評(píng)論 0 0
  • 今天是6月9日,馬金中學(xué)召開(kāi)考前布置會(huì),程校長(zhǎng)從“提高認(rèn)識(shí)”“安全保障”“誠(chéng)信考試”“后勤服務(wù)”等方面落實(shí)考...
    墨池蓮魚閱讀 392評(píng)論 0 2