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]]]])
host
是SMTP
主機(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()
斷開連接
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
湃缎。boundary
是MIMEMultipart
的邊界,默認(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)入smtplib
和mimetext
。創(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è)列表