python發(fā)送郵件

python發(fā)送郵件

準(zhǔn)備

python中發(fā)送郵件主要用的是smtplib和email兩個(gè)模塊物舒,下面主要對(duì)這兩個(gè)模塊進(jìn)行講解

在講解之前需要準(zhǔn)備至少兩個(gè)測(cè)試的郵箱,其中要在郵箱的設(shè)置中開啟smtplib協(xié)議才可以進(jìn)行發(fā)送和接受

smtplib

  • smtplib.SMTP( [host [, port [, local_hostname[,timeout]]]]) hostSMTP主機(jī)的服務(wù)器雪位,其中163郵箱的是smtp.163.com,其他的可以在網(wǎng)上找到凤藏,port是端口號(hào)慕的,這里默認(rèn)的是25箩张,local_hostname是你主機(jī)的SMTP,如果SMTP在你的本機(jī)上甩骏,你只需要指定服務(wù)器地址為 localhost 即可。timeout是設(shè)置的連接的限制時(shí)間先慷,如果超過這個(gè)時(shí)間還沒有連接上那么就會(huì)出現(xiàn)錯(cuò)誤
  • SMTP.set_debuglevel(level):設(shè)置是否為調(diào)試模式饮笛。默認(rèn)為False,即非調(diào)試模式熟掂,表示不輸出任何調(diào)試信息缎浇。如果設(shè)置為1就表示輸出調(diào)試信息
  • SMTP.connect([host[, port]]):連接到指定的smtp服務(wù)器扎拣。參數(shù)分別表示smpt主機(jī)和端口赴肚。注意: 也可以在host參數(shù)中指定端口號(hào)(如:smpt.yeah.net:25)素跺,這樣就沒必要給出port參數(shù)。
  • SMTP.login(user, password) 登錄服務(wù)器誉券,這里的user是郵箱的用戶名指厌,但是這里的password并不是你郵箱的密碼,當(dāng)你開啟SMTP的時(shí)候會(huì)提示你設(shè)置一個(gè)密碼踊跟,這里的密碼就是對(duì)應(yīng)的密碼
  • SMTP.sendmail(from_addr, [to_addrs,], msg[, mail_options, rcpt_options]) 發(fā)送郵件踩验,from_addr是發(fā)送方也就是你的郵箱地址,to_addr是接受方的地址商玫,當(dāng)然這里的可以填上多個(gè)郵箱賬號(hào)發(fā)送給多個(gè)賬號(hào)箕憾,如果有多個(gè)賬號(hào)需要使用列表傳遞參數(shù)
  • SMTP.quit()斷開連接

email

emial模塊用來(lái)處理郵件消息,包括MIME和其他基于RFC 2822的消息文檔拳昌。使用這些模塊來(lái)定義郵件的內(nèi)容袭异,是非常簡(jiǎn)單的。其包括的類有(更加詳細(xì)的介紹可見: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湃缎。boundaryMIMEMultipart的邊界,默認(rèn)邊界是可數(shù)的蠢壹。當(dāng)需要發(fā)送附件的時(shí)候使用的就是這個(gè)類
  • 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ì)象。主要用來(lái)發(fā)送圖片

普通文本郵件

  • class email.mime.text.MIMEText(_text[, _subtype[, _charset]])MIME文本對(duì)象图贸,其中_text是郵件內(nèi)容蹂季,_subtype郵件類型,可以是text/plain(普通文本郵件)疏日,html/plain(html郵件), _charset編碼偿洁,可以是gb2312等等。
  • 普通文本郵件發(fā)送的實(shí)現(xiàn)沟优,關(guān)鍵是要將MIMEText_subtype設(shè)置為plain涕滋。首先導(dǎo)入smtplibmimetext。創(chuàng)建smtplib.smtp實(shí)例挠阁,connect郵件smtp服務(wù)器宾肺,login后發(fā)送溯饵,具體代碼如下*
# 一個(gè)格式化郵件的函數(shù),可以用來(lái)使用
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='chenjiabing666@yeah.net'
to_email='××××××'    #要發(fā)送的郵箱地址

msg=MIMEText('喬裝打扮锨用,不擇手段','plain','utf-8')  #這里text=喬裝打扮丰刊,不擇手段

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

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

發(fā)送html郵件

還是用MIMEText來(lái)發(fā)送啄巧,不過其中的_subType設(shè)置成html即可,詳細(xì)代碼如下:

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='chenjiabing666@yeah.net'
to_email='××××××'    #要發(fā)送的郵箱地址
html="""
<p><h1 style="color:red">大家好</h1></p>
"""

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

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

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

附件的發(fā)送

發(fā)送帶附件的郵件,首先要?jiǎng)?chuàng)建MIMEMultipart()實(shí)例猾封,然后構(gòu)造附件逗概,如果有多個(gè)附件,可依次構(gòu)造忘衍,最后利用smtplib.smtp發(fā)送逾苫,具體實(shí)力如下:

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='chenjiabing666@yeah.net'
to_email='××××××'    #要發(fā)送的郵箱地址


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

#創(chuàng)建一個(gè)文本附件枚钓,這里是從指定文本中讀取信息铅搓,然后創(chuàng)建一個(gè)文本信息
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())     #創(chuàng)建一個(gè)圖片附件
image.add_header('Content-ID','<0>')   #指定圖片的編號(hào),這個(gè)會(huì)在后面用到
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) #連接星掰,設(shè)置超時(shí)時(shí)間30s
server.login(from_addr,from_password)    #登錄
server.set_debuglevel(1)        #輸出所有的信息
server.sendmail(from_addr,to_email,msg.as_string())   #這里的as_string()是將msg轉(zhuǎn)換成字符串類型的,如果你想要發(fā)給多個(gè)人,需要講to_email換成一個(gè)列表



將圖片嵌入到正文信息中

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='chenjiabing666@yeah.net'
to_email='××××××'    #要發(fā)送的郵箱地址


msg=MIMEMultipart()   #創(chuàng)建實(shí)例
html="""
<html>
<head></head>
<body>
<p>下面演示嵌入圖片</p>
<section>
![](cid:0)
![](cid:1)
</setcion>
</body>
</html>
"""

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

#創(chuàng)建一個(gè)文本附件氢烘,這里是從指定文本中讀取信息,然后創(chuàng)建一個(gè)文本信息
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)     #向其中添加附件


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

#創(chuàng)建第二個(gè)圖片附件
img_path_1='/home/chenjiabing/文檔/MeiZi_img/full/test.jpg'  #圖片路徑
image1=MIMEImage(open(img_path,'rb').read())     #創(chuàng)建一個(gè)圖片附件
image1.add_header('Content-ID','<1>')   #指定圖片的編號(hào),這個(gè)就是在上面對(duì)應(yīng)的cid:1的那張圖片,因此這里的編號(hào)一定要對(duì)應(yīng)
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) #連接饭于,設(shè)置超時(shí)時(shí)間30s
server.login(from_addr,from_password)    #登錄
server.set_debuglevel(1)        #輸出所有的信息
server.sendmail(from_addr,to_email,msg.as_string())   #這里的as_string()是將msg轉(zhuǎn)換成字符串類型的,如果你想要發(fā)給多個(gè)人蜀踏,需要講to_email換成一個(gè)列表


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市掰吕,隨后出現(xiàn)的幾起案子果覆,更是在濱河造成了極大的恐慌,老刑警劉巖殖熟,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件局待,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)钳榨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門舰罚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人重绷,你說我怎么就攤上這事沸停∧せ伲” “怎么了昭卓?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)瘟滨。 經(jīng)常有香客問我候醒,道長(zhǎng),這世上最難降的妖魔是什么杂瘸? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任倒淫,我火速辦了婚禮,結(jié)果婚禮上败玉,老公的妹妹穿的比我還像新娘敌土。我一直安慰自己,他們只是感情好运翼,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布返干。 她就那樣靜靜地躺著,像睡著了一般血淌。 火紅的嫁衣襯著肌膚如雪矩欠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天悠夯,我揣著相機(jī)與錄音癌淮,去河邊找鬼。 笑死沦补,一個(gè)胖子當(dāng)著我的面吹牛乳蓄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播夕膀,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼栓袖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了店诗?” 一聲冷哼從身側(cè)響起裹刮,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎庞瘸,沒想到半個(gè)月后捧弃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年违霞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嘴办。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡买鸽,死狀恐怖涧郊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情眼五,我是刑警寧澤妆艘,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站看幼,受9級(jí)特大地震影響批旺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诵姜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一汽煮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棚唆,春花似錦暇赤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至摆寄,卻和暖如春失暴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背微饥。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工逗扒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人欠橘。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓矩肩,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親肃续。 傳聞我的和親對(duì)象是個(gè)殘疾皇子黍檩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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

  • 背景 公司內(nèi)網(wǎng)有個(gè)論壇,各種公司的前沿消息都會(huì)有人在討論始锚。一忙起來(lái)刽酱,經(jīng)常忘記逛論壇,所以寫了個(gè)爬蟲瞧捌,爬取論壇前10...
    aialin閱讀 917評(píng)論 0 11
  • 簡(jiǎn)單郵件傳輸協(xié)議(SMTP)是一種協(xié)議棵里,用于在郵件服務(wù)器之間發(fā)送電子郵件和路由電子郵件润文。 Python提供smtp...
    易百教程閱讀 43,740評(píng)論 4 62
  • 一、相關(guān)模塊介紹 發(fā)送郵件主要用到了smtplib和email兩個(gè)模塊殿怜,這里首先就兩個(gè)模塊進(jìn)行一下簡(jiǎn)單的介紹: 1...
    LizPL閱讀 1,344評(píng)論 0 3
  • 昨天我晚上回來(lái)典蝌,我看到媽媽給我買了我的新水杯。我特別的開心头谜,是因?yàn)槟鞘俏易钕矚g的水杯骏掀。原來(lái)的那個(gè)丟了,媽媽重新買的...
    小狐貍的麻麻閱讀 207評(píng)論 0 0
  • 倘若風(fēng)也記得你 忐忑地將你寫進(jìn)日記 干涸的夢(mèng)里 一只螞蟻轉(zhuǎn)著尋找它的意義 倘若風(fēng)也記得你 湖邊的綠草地 聲聲蓋過你...
    水檻閱讀 271評(píng)論 5 16