Python的系統管理_09_python_email處理

來源:互聯網
上載者:User

E-mail解析:

包含header和body:

header 包含控制資料:

寄件人、目的地、資訊的標題,

body包含資訊本身。

下面是郵件程式用到header的幾種情況:

1.From header 可以向使用者表明郵件的寄件者,它也經常被用在客戶點擊“回複”按鈕的時候。新的郵件被發送到Form header中的地址:

2.Reply-To header 可以設定一個回複的替換地址:

3.Subject header 用於顯示郵箱摘要

4.Date header 可以被用來按照到達時間分類郵箱;

5.Message-ID 和 In-Reply-To header 可以協助某些郵件程式實現線索threading,分層次地排列郵件);

6.MIME header 可以協助郵件程式以合適的語言、格式來顯示郵件,它們也用來處理附件。

一般執行個體:trad_gen_simple.py

#!/usr/bin/env python#Traditional Message Generation , Simple#Trad_gen_simple.pyfrom email.MIMEText import MIMETextmessage = ''' Hello,This is a test message form Traditional Message!-- Anonymous '''msg = MIMEText(message)msg['To'] = 'recipient@example.com'msg['From'] = 'Test Sender <sender@example.com>'msg['Subject'] = 'Test Message ,'print msg.as_string()


添加Date和Message-ID header

Date header 一種為E-mail專門設定的格式,email.Utils.formatdate()函數來產生。

為新郵件添加一個Message-ID header,就不和世界其他郵件Message-ID重複,產生函數: email.Utils.make_msgid()

執行個體: trad_gen_newhdrs.py

#!/usr/bin/env python#Traditional Message Generation with Date and Message-ID#Trad_gen_newhdrs.pyfrom email.MIMEText import MIMETextfrom email import Utilsmessage = ''' Hello,This is a test message form Traditional Message!-- Anonymous '''msg = MIMEText(message)msg['To'] = 'recipient@example.com'msg['From'] = 'Test Sender <sender@example.com>'msg['Subject'] = 'Test Message ,'msg['Date'] = Utils.formatdate(localtime = 1)msg['Message-ID'] = Utils.make_msgid()print msg.as_string()

這樣這個郵件已經可以發送了。


解析傳統郵件:

編輯組建檔案message.txt,作為郵件要解析的文本。

編輯 trad_parse.py ,作為解析程式。

迭代出郵件資訊,檢索出必要資訊。


解析日期:

從E-mail中解析出日期並不容易,header裡有日期標示方法,實際Date header可能無效。儘管有python emai.Utils模組。 parsedate_tz)函數會載入一個日期文字,希望能返回10個元素的元組,元組9個元素可以傳遞給time.mktime()第10個指定時區,而mktime()不能接收,所以使用mktime_tz()函數,他可以轉換這個特殊的第10元素。

解析程式例子:data_parse.py

#!/usr/bin/env python#Traditional Message Parsing#data_parse.pyimport sys, email, timefrom email import Utilsdef getdate(msg):    """Returns the date/time from msg in seconds-since-epoch, if possible.    Otherwise,returens None."""    if not 'date' in msg:        #No Date header present.        return None    datehdr = msg['date'].strip()    try :    print Utils.mktime_tz(Utils.parsedate_tz(datehdr))        return Utils.mktime_tz(Utils.parsedate_tz(datehdr))    except:        # Some sort of error occured, like ly because of an invalid date.        return Nonemsg = email.message_from_file(sys.stdin)dateval = getdate(msg)if dateval is None:    print "No valid date was found."else:    print "dateval:" , dateval

MIME概念:

MIME包含多個部分,常規郵件包含header和內容,當你使用MIME多部分郵件的時候,你可以包含如:郵件文字和附件。它可以用不同方式例如,純文字和HTML)。

MIME支援不同傳輸編碼,提供內容類型如:text/plainimage/jpeg 可以指定字元集。


MIME是如何工作:

按照一般約定,最基本內容純文字郵件,)會出現在最前面,這樣沒有MIME的程式也可以閱讀,Python可以解析樹來使用。


添加MIME附件:

為了編寫帶有附件的郵件,通常來說,您需要下面幾個步驟:

1.建立一個MIMEMultipart()對象,設定郵件的header.

2.為郵件內容部分建立一個MIMEText()對象,也把它放到MIMEMultipart()對象中。

3.為每一個附件,建立一個合適MIME對象,也把它放到MIMEMultpart()對象中。

4.調用MIMEMultipart()對象中的as_string()函數來得到作為結果的郵件。

示範程式:mime_gen_basic.py

#!/usr/bin/env python# MIME attachement generation# mime_gen_basic.pyfrom email.MIMEText import MIMETextfrom email.MIMEMultipart import MIMEMultipartfrom email.MIMEBase import MIMEBasefrom email import Utils, Encodersimport mimetypes, sysdef attachment(filename):    fd = open(filename,'rb')    mimetype, mimeencoding = mimetypes.guess_type(filename)    if mimeencoding or (mimetype is None):        mimetype = 'application/octet-stream'    maintype, subtype = mimetype.split('/')    if maintype == 'text':        retval = MIMEText(fd.read(),_subtype=subtype)    else:        retval = MIMEBase(maintype, subtype)        retval.set_payload(fd.read())        Encoders.encode_base64(retval)    retval.add_header('Content-Disposition','attachment',filename = filename)    fd.close()    return retvalmessage = ''' Hello,This is a test message form Traditional Message!-- Anonymous '''msg = MIMEMultipart()msg['To'] = 'recipient@example.com'msg['From'] = 'Test Sender <sender@example.com>'msg['Subject'] = 'Test Message ,'msg['Date'] = Utils.formatdate(localtime = 1)msg['Message-ID'] = Utils.make_msgid()body = MIMEText(message,_subtype='plain')msg.attach(body)for filename in sys.argv[1:]:    msg.attach(attachment(filename))print msg.as_string()


SMTP發送郵件:

Python是通過smtplib模組來實現SMTP的,smtplib模組可以使用SMTP的簡單任務變得更容易。

簡單SMTP程式:smtp_simple.py

SMTP發送帶附件的郵件:

mime_stmp.py

#!/usr/bin/env python# MIME attachement generation# mime_gen_basic.pyfrom email.MIMEText import MIMETextfrom email.MIMEMultipart import MIMEMultipartfrom email.MIMEBase import MIMEBasefrom email import Utils, Encodersimport mimetypes, sysimport smtplibmail_server = 'smtp.exmail.qq.com'mail_server_port = 465from_addr = 'test@x'to_addr = 'x's=smtplib.SMTP_SSL(mail_server,mail_server_port)def attachment(filename):    fd = open(filename,'rb')    mimetype, mimeencoding = mimetypes.guess_type(filename)    if mimeencoding or (mimetype is None):        mimetype = 'application/octet-stream'    maintype, subtype = mimetype.split('/')    if maintype == 'text':        retval = MIMEText(fd.read(),_subtype=subtype)    else:        retval = MIMEBase(maintype, subtype)        retval.set_payload(fd.read())        Encoders.encode_base64(retval)    retval.add_header('Content-Disposition','attachment',filename = filename)    fd.close()    return retvalmessage = ''' Hello,This is a test message form Traditional Message!

POP3內送郵件:

串連和認證一個遠程伺服器的過程:

1.建立一個POP3對象,傳給它遠程伺服器的主機名稱和連接埠號碼。

2.調用user()和pass_()函數來發送使用者名稱和密碼。

3.如果產生poplib.error_proto異常,登入就失敗,伺服器就會發送和異常有關的字串和解釋文字。

4.一旦串連上,調用stat(),返回一個一個元組,其中包含了伺服器郵箱中郵件的數量和郵件總大小。

5.調用quit()關閉POP串連,代碼如下:


一個簡單串連: POP3_simple.py

#!/usr/bin/env python#pop3_simple.pyimport poplibusername='test@x'password='x'mail_server = 'xx'p = poplib.POP3(mail_server)p.user(username)p.pass_(password)status = p.stat()print "Mailbox has %d messages for a total of %d bytes" %(status[0],status[1])p.quit()#for msg_id in p.list()[1]:#    print msg_id#    outf = open ('%s.eml' % msg_id , 'w')#    outf.write('\n' .join(p.retr(msg_id)[1]))#    outf.close()#p.quit()

取得郵箱資訊: pop3_get.py

#!/usr/bin/env python#pop3_get.pyimport poplibusername='test@x'password='x'mail_server = 'pop.exmail.qq.com'p = poplib.POP3(mail_server)p.user(username)p.pass_(password)status = p.stat()print "Mailbox has %d messages for a total of %d bytes" %(status[0],status[1])for item in p.list()[1]:    print item    print item.split(' ')    number, octets = item.split(' ')    print "Message %s: %s bytes " %(number,octets)p.quit()#for msg_id in p.list()[1]:#    print msg_id#    outf = open ('%s.eml' % msg_id , 'w')#    outf.write('\n' .join(p.retr(msg_id)[1]))#    outf.close()#p.quit()

下載郵件:pop3_download.py

#!/usr/bin/env python#pop3_download.pyimport poplibimport getpass,sys,emailusername='test@x'password='x'mail_server = 'pop.exmail.qq.com'dest = "testmbox"#destfd = open (dest,"at")p = poplib.POP3(mail_server)p.user(username)p.pass_(password)status = p.stat()print "Mailbox has %d messages for a total of %d bytes" %(status[0],status[1])for item in p.list()[1]:#    print item#    print item.split(' ')    number, octets = item.split(' ')    print "Message %s: %s bytes " %(number,octets)    # Retrieve the message (storing it in a list of lines)    lines = p.retr(number)[1]    print lines    print "*" * 75    #Create an e-mail object representing the message    msg = email.message_from_string("\n" .join(lines))    print msg    destfd = open('%s.eml'%number,"at")    #Write it out to the mailbox    destfd.write(msg.as_string(unixfrom=1))    # Make sure there's an extra newline separating messages    destfd.write("\n")p.quit()destfd.close()#for msg_id in p.list()[1]:#    print msg_id#    outf = open ('%s.eml' % msg_id , 'w')#    outf.write('\n' .join(p.retr(msg_id)[1]))#    outf.close()#p.quit()

刪除郵件:L


本文出自 “fzhaolei” 部落格,請務必保留此出處http://53254.blog.51cto.com/43254/1334631

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.