小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Python2.7 smtplib&&email

 小豬窩969 2015-05-10

    python腳本發(fā)郵件,一般會用到smtplib和email這兩個(gè)模塊??纯丛撃K怎么使用,先看smtplib模塊。

smtplib模塊定義了一個(gè)簡單的SMTP客戶端,可以用來在互聯(lián)網(wǎng)上發(fā)送郵件。
定義的類有如下:

1
2
3
class smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])
class smtplib.SMTP_SSL([host[, port[, local_hostname[, keyfile[, certfile[, timeout]]]]]])
class smtplib.LMTP([host[, port[, local_hostname]]])
還有一些已經(jīng)定義好的異常
1
2
3
4
5
6
7
8
9
exception smtplib.SMTPException
exception smtplib.SMTPServerDisconnected
exception smtplib.SMTPResponseException
exception smtplib.SMTPSenderRefused
exception smtplib.SMTPRecipientsRefused
exception smtplib.SMTPDataError
exception smtplib.SMTPConnectError
exception smtplib.SMTPHeloError
exception smtplib.SMTPAuthenticationError

這么多已定義的類中,我們最常用的的還是smtplib.SMTP類,就具體看看該類的用法:
    smtp實(shí)例封裝一個(gè)smtp連接,它支持所有的SMTP和ESMTP操作指令,如果host和port參數(shù)被定義,則smtp會在初始化期間自動(dòng)調(diào)用connect()方法,如果connect()方法失敗,則會觸發(fā)SMTPConnectError異常,timeout參數(shù)設(shè)置了超時(shí)時(shí)間。在一般的調(diào)用過程中,應(yīng)該遵connetc()、sendmail()、quit()步驟。

下面我們來看看該類的方法:

SMTP.set_debuglevel(level)
    設(shè)置輸出debug調(diào)試信息,默認(rèn)不輸出調(diào)試信息。
SMTP.docmd(cmd[, argstring])
    發(fā)送一個(gè)command到smtp服務(wù)器,
SMTP.connect([host[, port]])
    連接到指定的smtp服務(wù)器,默認(rèn)是本機(jī)的25端口。也可以寫成hostname:port的形式。
SMTP.helo([hostname])
    使用helo指令向smtp服務(wù)器確認(rèn)你的身份。
SMTP.ehlo([hostname])
    使用ehlo指令向esmtp服務(wù)器確認(rèn)你的身份。
SMTP.ehlo_or_helo_if_needed()
    如果在以前的會話連接中沒有提供ehlo或者h(yuǎn)elo指令,這個(gè)方法調(diào)用ehlo()或者h(yuǎn)elo()。
SMTP.has_extn(name)
    判斷指定的名稱是否在smtp服務(wù)器上。
SMTP.verify(address)
    判斷郵件地址是否在smtp服務(wù)器上存在。
SMTP.login(user, password)
    登陸需要驗(yàn)證的smtp服務(wù)器,如果之前沒有提供ehlo或者h(yuǎn)elo指令,則會先嘗試ESMTP的ehlo指令。
SMTP.starttls([keyfile[, certfile]])
    使smtp連接運(yùn)行在TLS模式,所有的smtp指令都會被加密。
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])
    發(fā)送郵件,該方法需要一些郵件地址和消息。
SMTP.quit()
    終止smtp會話并且關(guān)閉連接。

    經(jīng)過搜索學(xué)習(xí)發(fā)現(xiàn)網(wǎng)上大多都是用smtp類的sendmail這個(gè)方法來發(fā)郵件,那就先看看這個(gè)例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/python
import smtplib
from_mail='xxx@126.com'
to_mail='yyy@qq.com'
server=smtplib.SMTP('smtp.126.com')
server.docmd('ehlo','xxx@126.com')
server.login('xxx@126.com','password')
msg='''from:xxx@126.com
to:yyy@qq.com
subject:I am guol
I'm come 126
.
'''
server.sendmail(from_mail,to_mail,msg)
server.quit()
    上例是使用sendmail方式,采用郵箱驗(yàn)證的模式來發(fā)郵件,因?yàn)楝F(xiàn)在大多數(shù)郵件系統(tǒng)都有反垃圾郵件機(jī)制及驗(yàn)證機(jī)制,我在開始實(shí)驗(yàn)非驗(yàn)證模式時(shí)就被126當(dāng)作垃圾郵件而拒絕發(fā)送。

下面這個(gè)例子采用原始的smtp指令來發(fā)郵件。常用的smtp指令如下:

    HELO 向服務(wù)器標(biāo)識用戶身份
    MAIL 初始化郵件傳輸 mail from:
    RCPT 標(biāo)識單個(gè)的郵件接收人;常在MAIL命令后面,可有多個(gè)rcpt to:
    DATA 在單個(gè)或多個(gè)RCPT命令后,表示所有的郵件接收人已標(biāo)識,并初始化數(shù)據(jù)傳輸,以.結(jié)束
    VRFY 用于驗(yàn)證指定的用戶/郵箱是否存在;由于安全方面的原因,服務(wù)器常禁止此命令
    EXPN 驗(yàn)證給定的郵箱列表是否存在,擴(kuò)充郵箱列表,也常被禁用
    HELP 查詢服務(wù)器支持什么命令
    NOOP 無操作,服務(wù)器應(yīng)響應(yīng)OK
    QUIT 結(jié)束會話
    RSET 重置會話,當(dāng)前傳輸被取消
    MAIL FROM 指定發(fā)送者地址
    RCPT TO 指明的接收者地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/python
import base64
import smtplib
from_mail='xxx@126.com'
to_mail='yyy@qq.com'
user=base64.encodestring('xxx@126.com').strip()
passwd=base64.encodestring('password').strip()
server=smtplib.SMTP('smtp.126.com')
server.set_debuglevel(1)
server.docmd('ehlo','xxx@126.com')
server.docmd('auth login')
server.docmd(user)
server.docmd(passwd)
server.docmd('mail FROM:<%s>' % from_mail)
server.docmd('rcpt TO:<%s>' % to_mail)
server.docmd('data')
server.docmd('''from:xxx@126.com
to:yyy@qq.com
subject:I am guol
I'm come here
.
''')
server.getreply()
server.quit()

     注意在以上兩個(gè)例子中在發(fā)送消息的subject后面書寫正文時(shí),需要空一行,正文以'.'結(jié)尾。


   果然簡單,如果想在郵件中攜帶附件、使用html書寫郵件,附帶圖片等等,就需要使用email模塊及其子模塊。下面來看看email包,email包是用來管理email信息的,它包括MIME和其他基于RFC 2822的消息格式。email包的主要特征是在它內(nèi)部解析和生成email信息是分開的模塊來實(shí)現(xiàn)的。

   MIME消息由消息頭和消息體兩大部分組成,在郵件里就是郵件頭和郵件體。郵件頭與郵件體之間以空行進(jìn)行分隔。

   郵件頭包含了發(fā)件人、收件人、主題、時(shí)間、MIME版本、郵件內(nèi)容的類型等重要信息。每條信息稱為一個(gè)域,由域名后加“: ”和信息內(nèi)容構(gòu)成,可以是一行,較長的也可以占用多行。域的首行必須“頂頭”寫,即左邊不能有空白字符(空格和制表符);續(xù)行則必須以空白字符打頭,且第一個(gè)空白字符不是信息本身固有的。

   郵件體包含郵件的內(nèi)容,它的類型由郵件頭的“Content-Type”域指出。最常見的類型有text/plain(純文本)和text/html(超文本)。郵件體被分為多個(gè)段,每個(gè)段又包含段頭和段體兩部分,這兩部分之間也以空行分隔。常見的multipart類型有三種:multipart/mixed, multipart/related和multipart/alternative。

在email的包里面包含了很多模塊:

email.message
email.parser
email.generator
email.mime   創(chuàng)建email和MIME對象
email.header
email.charset
email.encoders
email.ereors
email.utils
email.iterators

    主要來看看email.mime,在郵件中攜帶附件、圖片、音頻時(shí),主要使用的是該模塊。一般情況下,你通過解析一個(gè)文件或者一段text來生成一個(gè)消息對象結(jié)構(gòu),你也可以從頭開始建立一個(gè)消息結(jié)構(gòu),實(shí)際上,你可以給一個(gè)已經(jīng)存在的消息結(jié)構(gòu)追加一個(gè)新的消息對象。你可以通過創(chuàng)建message實(shí)例來創(chuàng)建一個(gè)對象結(jié)構(gòu),然后給該結(jié)構(gòu)追加附件和頭部信息。email包提供了一些子類使得該操作變得很容易。

email.mime中常用的類如下:

email.mime.base    email.mime.base.MIMEBase(_maintype, _subtype, **_params)
email.mime.nonmultipart   email.mime.nonmultipart.MIMENonMultipart
email.mime.multipart    email.mime.multipart.MIMEMultipart([_subtype[, boundary[, _subparts[, _params]]]])

1
A subclass of MIMEBase, this is an intermediate base class for MIME messages that are multipart. Optional _subtype defaults to mixed, but can be used to specify the subtype of the message. A Content-Type header of multipart/_subtype will be added to the message object. A MIME-Version header will also be added.
email.mime.application    email.mime.application.MIMEApplication(_data[, _subtype[, _encoder[, **_params]]])
email.mime.audio    email.mime.audio.MIMEAudio(_audiodata[, _subtype[, _encoder[, **_params]]])
email.mime.image    email.mime.image.MIMEImage(_imagedata[, _subtype[, _encoder[, **_params]]])
1
A subclass of MIMENonMultipart, the MIMEImage class is used to create MIME message objects of major type image. _imagedata is a string containing the raw image data.
email.mime.message    email.mime.message.MIMEMessage(_msg[, _subtype])
email.mime.text    email.mime.text.MIMEText(_text[, _subtype[, _charset]])
1
A subclass of MIMENonMultipart, the MIMEText class is used to create MIME objects of major type text. _text is the string for the payload. _subtype is the minor type and defaults to plain. _charset is the character set of the text and is passed as a parameter to the MIMENonMultipart constructor; it defaults to us-ascii. If _text is unicode, it is encoded using the output_charset of _charset, otherwise it is used as-is.

只解釋了常用的幾個(gè)類,詳細(xì)信息見: http://docs./2/library/email.mime.html

模擬在郵件內(nèi)容中攜帶圖片,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from_mail='xxx@126.com'
to_mail='yyy@qq.com'
msg=MIMEMultipart()
msg['From']=from_mail
msg['To']=to_mail
msg['Subject']='I am from email package'
body='I am come 126,i content with pic'
con=MIMEText('<b>%s</b><br><img src="cid:/opt/25343674.png"><br>' % body,'html')
msg.attach(con)
img=MIMEImage(file('/opt/25343674.png','rb').read())
img.add_header('Content-ID','/opt/25343674.png')
msg.attach(img)
server=smtplib.SMTP('smtp.126.com')
server.docmd('ehlo','xxx@126.com')
server.login('yyy@126.com','password')
server.sendmail(from_mail,to_mail,msg.as_string())
server.quit()
模擬在 郵件中攜帶附件 ,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from_mail='xxx@126.com'
to_mail='yyy@qq.com'
msg=MIMEMultipart()
msg['From']=from_mail
msg['To']=to_mail
msg['Subject']='I am from email package'
content=MIMEText('<b>I am come 126,i with attach<b>','html')
msg.attach(content)
attac=MIMEImage(file('/opt/25343674.png','rb').read())
attac['Content-Type']='application/octet-stream'
attac.add_header('content-disposition','attachment',filename='/opt/25343674.png')
msg.attach(attac)
server=smtplib.SMTP('smtp.126.com')
server.docmd('ehlo','xxx@126.com')
server.login('yyy@126.com','password')
server.sendmail(from_mail,to_mail,msg.as_string())
server.quit()
以上代碼均在python2.7下經(jīng)過測試。

參考:

http:///code-snippet/1105/python-usage-smtplib-fayoujian-carry-fujian-code
http://docs./2/library/smtplib.html
http:///questions/3362600/how-to-send-email-attachments-with-python



    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多