1

Python を使用して、メール ヘッダーを解析し、「return-path」フィールドで電子メール アドレスを取得する最良の方法は何ですか?

Return-Path: <bob@example2.com>
Date: Sat, 16 Feb 2013 14:14:32 -0500
Subject: Hello World!
From: Robert Jones <robert.jones@example2.com>
To: Steve <steve@example.com>

PS 私は少し Python n00b で、このコードは AppEngine で実行する必要があります。

4

2 に答える 2

3

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

于 2013-02-19T01:08:01.500 に答える
0

split()関数を使用してから、次のことができますstrip()

line = "Return-Path: <bob@example2.com>"
header, value = line.split(":")
value = value.strip()

PS中括弧を取り除く必要がある場合は、もう一度ストリップ関数を使用してください:

value = value.strip('<>')
于 2013-02-19T00:56:50.197 に答える