2011-02-05 32 views
6

私はpythonを使用してメールを受信したいと思います。これまで私は、被験者を得ることができましたが、体を取得することはできませんでした。私が使用しているコードは次のとおりです。pythonを使用してメールを受信する方法

import poplib 
from email import parser 
pop_conn = poplib.POP3_SSL('pop.gmail.com') 
pop_conn.user('myusername') 
pop_conn.pass_('mypassword') 
#Get messages from server: 
messages = [pop_conn.retr(i) for i in range(1, len(pop_conn.list()[1]) + 1)] 
# Concat message pieces: 
messages = ["\n".join(mssg[1]) for mssg in messages] 
#Parse message intom an email object: 
messages = [parser.Parser().parsestr(mssg) for mssg in messages] 
for message in messages: 
    print message['subject'] 
    print message['body'] 
pop_conn.quit() 

私がこのコードを実行すると、Subjectは返されますが、本文は返されません。だから私は、 "テスター"という科目と "これはテストメッセージです"とのメールを送ると、IDLEのように見えます。

>>>>Tester >>>>None 

正確には被験者を評価するように見えますが、身体ではないようですが、私はそれが正しい解析方法だと思いますか?問題は、これらのライブラリをどのように変更して、サブジェクトとボディの両方を返すかを把握するのに十分ではないことです。

答えて

5

あなたは

print message.keys() 

を実行した場合、あなたが何をしたい参照してくださいよとメールパーサは、bodyキーが含まれていませんemail.message.Messageオブジェクトを返しますがget_payload()方法である:

for message in messages: 
    print message['subject'] 
    print message.get_payload() 
pop_conn.quit() 

しかし、これは複数の部分のメッセージに関しては複雑になります。 get_payload()は、それぞれがオブジェクトであるパー​​ツのリストを返します。 iパートを返すget_payload(i)を使用してマルチパートメッセージの特定の部分を取得し、iが範囲外の場合はIndexErrorを、メッセージがマルチパートでない場合はTypeErrorを生成します。

Gustavo Costa De Oliveirが指摘するように、walk()メソッドを使用すると、部品を順番に取得することができます。メッセージの部品とサブパートを深度優先で走査します。

モジュールの詳細はhttp://docs.python.org/library/email.message.html#email.message.Messageです。

8

オブジェクトメッセージがボディを持っていない、あなたはこのように、複数の部品を解析する必要があります。

for part in message.walk(): 
    if part.get_content_type(): 
     body = part.get_payload(decode=True) 

walk()機能を反復深度最初の電子メールの部分を通して、あなたが探していますコンテンツタイプを持つパーツの場合コンテンツタイプはtext/plainまたはtext/htmlのいずれかであり、メッセージcontent_typemultipart/alternativeに設定されている場合は、1つの電子メールに両方が含まれることがあります。 uはIMAP4を使用したい場合は

2

メッセージで正しいエンコーディングでは、それも良い戻りデータは、いくつかの多言語コンテンツ

 

charset = part.get_content_charset() 
content = part.get_payload(decode=True) 
content = content.decode(charset).encode('utf-8') 
 
0

が含まれています。見通しのPythonライブラリを使用して、ここからダウンロード:

print mail.mailbody() 
print mail.mailsubject() 
print mail.mailfrom() 
print mail.mailto() 

import outlook 
mail = outlook.Outlook() 
mail.login('[email protected]','yourpassword') 
mail.inbox() 
print mail.unread() 

は、電子メールの要素をretriveする:https://github.com/awangga/outlook はあなたの受信トレイから未読メールを取得するために、

関連する問題