Delphi使用Python來解碼郵件Delphi使用Python來解碼郵件

來源:互聯網
上載者:User

 

Delphi使用Python來解碼郵件      (轉載)

估計很多人和我一樣,在使用Indy的時候都會受不了眾多的Bug,不得不邊使用邊修改。

近來一直使用Indy來收發郵件,從D7到D2007再到D2010,後來直接從SVN中檢出一個最新版本來,讓人驚喜的是新版本中修複了一些Bug,讓人沮喪的是新版本中又重新引入了一些新的Bug,唉,鍛煉人啊。

前幾天簡單看了一下Python,測試了一下發現Python對郵件的處理簡直簡練至極!並且接收和解碼上也勝Indy很多,於是就想用Python來處理郵件。但因為工程是用Delphi的,所以就上網搜尋了一下,發現了PythonForDelphi,使用了一下,很不錯,於是就用Python做了個解碼,然後在Delphi中調用。

先介紹一下相關資源:

Python4Delphi:

http://mmm-experts.com/

入門:

http://www.atug.com/andypatterns/pythonDelphiTalk.htm

 

噢,它竟然在google上和yahoo上都安了家:

http://tech.groups.yahoo.com/group/pythonfordelphi/

http://code.google.com/p/python4delphi/

 

看一下Python端的代碼:

 

 1 import email
 2 
 3 fp = open("Test.eml", "r")  #開啟eml檔案
 4 msg = email.message_from_file(fp) 
 5 #msg = email.message_from_string(str) #也可以從字串建立
 6 subject = msg.get("subject") # 取信件頭裡的subject, 也就是主題
 7 # 下面的三行代碼只是為瞭解碼象=?gbk?Q?=CF=E0=C6=AC?=這樣的subject
 8 h = email.Header.Header(subject)
 9 dh = email.Header.decode_header(h)
10 subject = dh[0][0]
11 print "subject:", subject
12 print "from: ", email.utils.parseaddr(msg.get("from"))[1] # 取from
13 print "to: ", email.utils.parseaddr(msg.get("to"))[1] # 取to
14 
15 # 迴圈信件中的每一個mime的資料區塊
16 i=0
17 textplain=''
18 texthtml=''
19 
20 for par in msg.walk():
21     if not par.is_multipart(): # 這裡要判斷是否是multipart,是的話,裡面的資料是無用的,至於為什麼可以瞭解mime相關知識。
22         name = par.get_param("name") #如果是附件,這裡就會取出附件的檔案名稱
23         print name
24         
25         if name:
26             print '有附件'+name  #此處略,不對附件做處理,只處理常值內容
27         else:
28             #不是附件,是常值內容
29             #print par.get_payload(decode=True) # 解碼出常值內容,直接輸出來就可以了。
30             content_type=par.get_content_type()
31             if content_type in ['text/plain']:
32                 textplain=par.get_payload(decode=True)
33                 TextPlain.Value=textplain  #這裡TextPlain.Value和下面的TextHtml.Value在正常Python中是不能正確執行的,是Pytho4Delphi中的對象
34             if content_type in ['text/html']:
35                 texthtml=par.get_payload(decode=True)
36                 TextHtml.Value=texthtml
37     
38 fp.close()
39 

 

 

好了,上面只是樣本性地處理了常值內容

 

下面在Delphi中增加兩個TPythonDelphiVar,分別為TextPlain和TextHtm,然後:

 

1 PE.ExecStrings(Memo1.Lines);//Memo1中為上面的Python代碼,當然可以放到檔案中
2 ShowMessage(TextHtml.ValueAsString);//這時TextHtml.ValueAsString就是解碼後的郵件超常值內容,如果有Text/plain內容,取TextPlain的值即可。

 

 

好了,不要再和Indy生氣了! 

估計很多人和我一樣,在使用Indy的時候都會受不了眾多的Bug,不得不邊使用邊修改。

近來一直使用Indy來收發郵件,從D7到D2007再到D2010,後來直接從SVN中檢出一個最新版本來,讓人驚喜的是新版本中修複了一些Bug,讓人沮喪的是新版本中又重新引入了一些新的Bug,唉,鍛煉人啊。

前幾天簡單看了一下Python,測試了一下發現Python對郵件的處理簡直簡練至極!並且接收和解碼上也勝Indy很多,於是就想用Python來處理郵件。但因為工程是用Delphi的,所以就上網搜尋了一下,發現了PythonForDelphi,使用了一下,很不錯,於是就用Python做了個解碼,然後在Delphi中調用。

先介紹一下相關資源:

Python4Delphi:

http://mmm-experts.com/

入門:

http://www.atug.com/andypatterns/pythonDelphiTalk.htm

 

噢,它竟然在google上和yahoo上都安了家:

http://tech.groups.yahoo.com/group/pythonfordelphi/

http://code.google.com/p/python4delphi/

 

看一下Python端的代碼:

 

 1 import email
 2 
 3 fp = open("Test.eml", "r")  #開啟eml檔案
 4 msg = email.message_from_file(fp) 
 5 #msg = email.message_from_string(str) #也可以從字串建立
 6 subject = msg.get("subject") # 取信件頭裡的subject, 也就是主題
 7 # 下面的三行代碼只是為瞭解碼象=?gbk?Q?=CF=E0=C6=AC?=這樣的subject
 8 h = email.Header.Header(subject)
 9 dh = email.Header.decode_header(h)
10 subject = dh[0][0]
11 print "subject:", subject
12 print "from: ", email.utils.parseaddr(msg.get("from"))[1] # 取from
13 print "to: ", email.utils.parseaddr(msg.get("to"))[1] # 取to
14 
15 # 迴圈信件中的每一個mime的資料區塊
16 i=0
17 textplain=''
18 texthtml=''
19 
20 for par in msg.walk():
21     if not par.is_multipart(): # 這裡要判斷是否是multipart,是的話,裡面的資料是無用的,至於為什麼可以瞭解mime相關知識。
22         name = par.get_param("name") #如果是附件,這裡就會取出附件的檔案名稱
23         print name
24         
25         if name:
26             print '有附件'+name  #此處略,不對附件做處理,只處理常值內容
27         else:
28             #不是附件,是常值內容
29             #print par.get_payload(decode=True) # 解碼出常值內容,直接輸出來就可以了。
30             content_type=par.get_content_type()
31             if content_type in ['text/plain']:
32                 textplain=par.get_payload(decode=True)
33                 TextPlain.Value=textplain  #這裡TextPlain.Value和下面的TextHtml.Value在正常Python中是不能正確執行的,是Pytho4Delphi中的對象
34             if content_type in ['text/html']:
35                 texthtml=par.get_payload(decode=True)
36                 TextHtml.Value=texthtml
37     
38 fp.close()
39 

 

 

好了,上面只是樣本性地處理了常值內容

 

下面在Delphi中增加兩個TPythonDelphiVar,分別為TextPlain和TextHtm,然後:

 

1 PE.ExecStrings(Memo1.Lines);//Memo1中為上面的Python代碼,當然可以放到檔案中
2 ShowMessage(TextHtml.ValueAsString);//這時TextHtml.ValueAsString就是解碼後的郵件超常值內容,如果有Text/plain內容,取TextPlain的值即可。

 

 

好了,不要再和Indy生氣了! 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.