まず、stdlib のemail
パッケージを使用してメッセージを解析することをお勧めします。
どのようにメッセージを取得しているのかはわかりません。stdlibimaplib
や gmail API などを使用すると、本文とは別にヘッダーを取得できますが、他の方法を使用するとメッセージ全体が得られる場合があります。どちらの方法でも、全体を に渡してemail.parser.HeaderParser
ヘッダーを解析し、それ以外は無視できます。
>>> from email.parser import HeaderParser
>>> msg = HeaderParser().parsestr(header) # or parsestr(msg) if you have the whole msg
>>> return_path = msg.get('Return-Path')
これreturn_path
は、電子メール アドレス (または、存在しない場合は )"<bob@example2.com>"
として解析できます。None
>>> from email.utils import parseaddr
>>> realname, emailaddr = parseaddr(return_path)
今、realname
です""
、そしてemailaddr
です'bob@example2.com'
。
2 つの部分がある理由は、これも完全に有効だからです。
Return-Path: "Bob Example" <bob@example.com>
さて、これはあまり正しくないかもしれません。Return-Path
ヘッダーを 2 つ持つことはできますか? または、Return-Path
ヘッダーに複数のアドレスを含めることはできますか? 思い出せない。関連する RFC で調べることもできますが、一般的なクライアントがこれらの特定の規則に違反していないかどうかを調べるために、いくつかの検索も行う必要があります。このすべてを思い出せません。したがって、便宜上、通常は何でも複数のヘッダーと複数の値であると想定し、次のようにします。
>>> return_paths = msg.get_all('Return-Path')
これは を返しますlist
["<bob@example2.com>"]
。(Return-Path
ヘッダーがない場合は、このようlist
に , の代わりに空の , を取得しNone
ます。) そして、それをすべて一度に解析してlist
、名前とアドレスのペアを 1 つではなく取得することができます。
>>> from email.utils import getaddresses
>>> for realname, emailaddr in getaddresses(returnpaths):
... print(realname, emailaddr)
そして、Return-Path が 1 つの値しか許可しないことが判明した場合、同じコードがそのまま機能します。