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