1

ここで奇妙な問題。

Python を使用している場合、99% の確率で受信メールを問題なく解析しています。最近、iPhone に組み込まれている電子メール クライアントなど、特定のクライアントから送信された受信電子メール アドレスをスクリプトが認識できないという新しい問題が発生しました。私のデバッグ スクリプトは、["From"] キーを電子メール アドレスなしの名前としてリストします。

私が期待するもの:

Ryan Martin <ryan@grouped.com>

ログに表示されている内容 (およびスクリプトが処理しようとしている内容):

Ryan Martin

しかし、ログを携帯電話にテキスト送信すると、次のように適切にリストされていることがわかります。

Ryan Martin <ryan@grouped.com>

したがって、私が最初に考えたのは、電子メール アドレスが適切に検出されていないものにエンコードされているということです。スマホで見れるので情報はあると思います。Python スクリプトは空白と見なし、ログに保存すると空白になります。

私は電子メールを解析し、次のコードでテストしています:

parser = HeaderParser()
msg = parser.parsestr(self.message_as_string)
print msg["From"]

送信者名は ascii であり、括弧で囲まれた実際の電子メール アドレスは別のものでエンコードされていると思いますが、よくわかりません。

だから私の質問は:

送信者 ("From") がどのようにエンコードされているかを確認するにはどうすればよいですか? また、それを使用できるものに変換するにはどうすればよいですか?

いつもありがとうございます。

ヘッダーの例を次に示します。

['Received: (qmail 16170 invoked by uid 110); 14 Jun 2012 10:49:02 -0700\n', 'Delivered-To: 1-etest@grouped.com\n', 'Received: (qmail 16167 invoked from network); 14 Jun 2012 10:49:02 -0700\n', 'Received: from mail-pz0-f46.google.com (209.85.210.46)\n', '  by grouped.com with (RC4-MD5 encrypted) SMTP; 14 Jun 2012 10:49:02 -0700\n', 'Received: by dady13 with SMTP id y13so2807279dad.5\n', '        for <etest@grouped.com>; Thu, 14 Jun 2012 10:49:01 -0700 (PDT)\n', 'DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;\n', '        d=gmail.com; s=20120113;\n', '        h=subject:references:from:content-type:x-mailer:in-reply-to\n', '         :message-id:date:to:content-transfer-encoding:mime-version;\n', '        bh=8ta00o/UsoBbe+qrLFMT/1rE1AHRZyQSK1Az6Ve7ffE=;\n', '        b=A4aSj5duxG4nWr1+Dn/X614kOMJWq+nYo6jo7ntsXNCZquoxPW/+1FBVXs96Qi73cR\n', '         jW5sIO33mCe1fsRQvDn+9Mp/i9kSNwzGX/+QwseBGy78bNf2ZDxDhbJZ7nKm9qlsvc2x\n', '         j9m/j8mZG7/j3ruz1b9O+j1KwCqzzl9Lgqj
 Lx0af7/MCEHVfE4rIpJsOBOzUJR8EA8MJ\n', '         5LvtdKxS3/8cqKX92plziGOWMiRjI+euBE3apHou7PUM9/BpHD4o2LH1OjSQKo6sVNmt\n', '         8CiB5vw3UvNDU+nMgjWcvirJsE8xzXDqkulbDiyI5Ba5QagfpwAKUb/OQpDlkY4gK+Bv\n', '         fTsg==\n', 'Received: by 10.68.225.6 with SMTP id rg6mr10617173pbc.100.1339696141712;\n', '        Thu, 14 Jun 2012 10:49:01 -0700 (PDT)\n', 'Return-Path: <some_sender@gmail.com>\n', 'Received: from [10.230.186.251] (125.sub-174-254-212.myvzw.com. [174.254.212.125])\n', '        by mx.google.com with ESMTPS id ol1sm10204626pbb.25.2012.06.14.10.48.53\n', '        (version=SSLv3 cipher=OTHER);\n', '        Thu, 14 Jun 2012 10:49:00 -0700 (PDT)\n', 'Subject: Re: Prempus Patterson replied to a post on etest\n', 'References: <20120614173822.12044.qmail@grouped.com>\n', 'From: Ryan Martin <some_sender@gmail.com>\n', 'Content-Type: multipart/alternative;\n', '\tboundary=Apple-Mail-17F5BF62-A532-49C2-BF72-499A1EEB510E\n', 'X-Mailer: iPhone Mail (10A5316k)\n', 'In-Reply-To: <
 20120614173822.12044.qmail@grouped.com>\n', 'Message-Id: <8321D4D0-E41A-4A1C-87DC-D7A2E462AC6A@gmail.com>\n', 'Date: Thu, 14 Jun 2012 10:48:48 -0700\n', 'To: Prempus Patterson <etest@grouped.com>\n', 'Content-Transfer-Encoding: 7bit\n', 'Mime-Version: 1.0 (1.0)\n', '\n', '\n', '--Apple-Mail-17F5BF62-A532-49C2-BF72-499A1EEB510E\n']
4

2 に答える 2

0

残念ながら、何が問題を引き起こしているのか正確にはわかりませんが、今のところうまくいく解決策を見つけました。気を引き締めてください、それは少し醜いです:

    # At this point, we know there is a < bracket in the 'From' value
    acceptable_chars = ["a", "b", "c", ... "6", "7", "8", "9", "0", "_", ".", "@"]
    from_str = msg["From"].lower().split("<")[-1]

    stripped_from = ''
    for letter in from_str:
        if letter in acceptable_chars:
            stripped_from += letter

    return stripped_from

スクリプトがエンコードされた情報をこのように理解できる理由や方法はわかりませんが、文字列全体を評価する場合はわかりません。名前の後、最初の角かっこの前に隠されたUnicode文字が原因だと思います。

いずれにせよ、それは機能していますが、私は書き直しや他の提案を受け入れています。

于 2012-06-14T21:27:12.983 に答える
0

生の(ネットワークから離れた) メッセージをファイルに保存し、16 進エディタで開く方法を見つけてください。

または、より直接的には、wireshark で着信メッセージをキャプチャし、From:行のバイトを調べます。次に、パーサーを台無しにしているヘッダーに奇妙な文字があるかどうかを確認します。

于 2012-06-14T20:30:26.600 に答える