这里有个奇怪的问题。
我正在使用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,实际的括号内的电子邮件地址是用其他东西编码的,但我不确定。
所以我的问题是:
如何确定发件人(“发件人”)的编码方式以及如何将其转换为可以使用的内容?
一如既往,谢谢。
以下是标题的示例:
['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']
答案 0 :(得分:0)
找到一种方法将 raw (无线)消息保存到文件中,然后在十六进制编辑器中打开它。
或者,更直接地,在wireshark中捕获传入消息并查看From:
行中的字节。然后你会看到标题中是否有一些奇怪的字符弄乱了解析器。
答案 1 :(得分: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字符,但是在第一个括号之前。
无论哪种方式,它都有效,但我愿意重写或提出其他建议。