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生氣了!