設定でPopをオンにしているので、「import poplib」を使用してGmailにアクセスしようとしていますが、実際にメッセージの「from」アドレスを確認して、それに基づいて何かを実行するにはどうすればよいですか?また、メッセージから「本文」のテキストを削除するコマンドは何でしょうか。
3 に答える
imaplibを使用して、GMailの受信トレイにある各メッセージの件名と送信者を取得する方法は次のとおりです。
import imaplib
from email.parser import HeaderParser
conn = imaplib.IMAP4_SSL('imap.gmail.com')
conn.login('username@gmail.com', 'password')
# Select the mail box
status, messages = conn.select('INBOX')
if status != "OK":
print "Incorrect mail box"
exit()
if int(messages[0]) > 0:
for message_number in range(1,int(messages[0])+1):
data = conn.fetch(message_number, '(BODY[HEADER])')
parser = HeaderParser()
msg = parser.parsestr(data[1][0][1])
print "Subject: %s" % msg['subject']
print "From: %s" % msg['from']
おそらくもっと多くの情報が必要になるでしょう。公式のimaplibドキュメントから始めます。
モジュールrfc822があります
poplibからのメッセージはサーバーからダウンロードできると思います。
次にファイルに入れます
>>> f = StringIO.StringIO(message)
>>> import rfc822
に渡されます
>>> rfc822.Message(f)
これを試してみてください..また、モジュールのドキュメントも確認してください。お役に立てば幸いです。
別のPythonモジュールがあります:
>>> import email
>>> email.message_from_string(...)
これにより、ヘッダーの読み取りアクセスが提供され、本文コンテンツの複数の形式もサポートされます。
ドキュメントから:
POP3.retr(which)
Retrieve whole message number which, and set its seen flag. Result is in form (response, ['line', ...], octets).
したがって、の結果をretr()
と呼ばれる変数に入れたとするとresponse
、メッセージの行はリストとしてに格納されますresponse[1]
。RFC 2822により、ヘッダーがメッセージの本文から空白行で区切られていることがわかります。メッセージの送信者はFrom:
ヘッダー行に表示されます。したがって、メッセージの行を繰り返し処理し、空白行が表示されたら停止し、。で始まる行が表示されたら送信者に変数を設定できますFrom:
。
sender = None
for line in response[1]:
if line.startswith("From: "):
sender = line.partition(" ")[2].strip()
elif line == "":
break
ヘッダーで多くのことを行う予定がある場合は、ヘッダー名で辞書に入れると便利な場合があります。各ヘッダーは複数回表示される可能性があるため、ディクショナリの各値はリストである必要があります。
headers = {}
for line in response[1]:
if line == "":
break
line = line.partition(" ")
key = line[0].strip().rstrip(":")
value = line[2].stirp()
headers.setdefault(key, []).append(value)
headers["From"][0]
この後、メッセージの送信者を取得するために使用できます。
それほど複雑ではないので、これを行うための基本的な方法を示したかったのですが、Pythonがほとんどの作業を代行してくれます。retr()
繰り返しますが、結果が次のようになっていると仮定しますresponse
。
import email
# convert our message back to a string and parse it
headers = email.parsefromstring("\n".join(response[0]), headersonly=True)
print headers["From"] # prints the sender
メッセージオブジェクトの詳細については、電子メールモジュールのドキュメントを参照してください。
From:
電子メールメッセージの行には、電子メールアドレスの他に、送信者の名前などの追加のテキストが含まれる場合があります。正規表現を使用してメールアドレスを抽出できます。
sender = re.find(r".*[ <](.+@.+)\b", headers["From"]).match(1)