まず、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 つの値しか許可しないことが判明した場合、同じコードがそのまま機能します。