使用正则表达式解析MIME标头

时间:2015-06-01 02:36:57

标签: regex string email

我需要在3种特殊情况下从MIME标头中提取电子邮件地址(由于发送电子邮件的电子邮件服务器不同,它们是不同的 - 它是发送给多个(3)收件人的单个电子邮件)。

haskell2010

提取电子邮件地址的正确正则表达式是什么? 重要的是要注意,它们中的每一个都只是...之前和之后的一个更大的字符串。

1 个答案:

答案 0 :(得分:0)

基本上只有不好的理由想要这样做,但这是一个小的Python程序,它试图从标准输入中检索最顶层的Received:标题中的电子邮件终端。

from sys import stdin, exit

collected = []
for line in stdin:
    line = line.rstrip('\r\n')
    if line.startswith('Received:'):
        collected.append(line)
    elif line.startswith(' ') or line.startswith('\t'):
        collected.append(line)
    else:
        final = ''.join(collected)
        # XXX FIXME: the search should also work with a tab before "for"
        start = final.find(' for <')
        if start != -1:
            # XXX WARNING: Throws ValueError if '>' not found
            print("%s" % final[start+6:final.index('>', start+6)])
            exit(0)
        else:
            exit(1)

您可能希望这样做的一个方案是使用自行开发的错误电子邮件传送系统。一个正确的MTA会通过信封传递你的信息,这样你就知道收件人是谁,但是错误的实现只会给你提供信息,然后你会试着找出丢失信封里面的信息。 不要这样做。解决问题,而不是症状。

在最顶层Received:标题通常包含预期收件人的系统中,如果有多个本地收件人,通常会丢失该邮件。

因此,如果你有一个通配符收件箱,并且有人发送了一条消息To: you@example.com,你可以发现最后的Received:标题包含... for <you@example.com>,所以你希望能够发现传递信息的位置。但是,如果发件人有Bcc: you@example.com, another@example.com,则Received:标题通常包含收件人,因此提议的&#34;解决方案&#34;如果您没有真正有任何其他方法可以解决这个问题,那么就会失败。

在切向上,另一个复杂因素是Received:标头格式未正式指定。规范说标题需要存在,并且需要包含一些内容,但是没有特定的语法来表示这些信息。如果您只在单个配置中处理单个MTA的单个版本,则可以为该特定Received:标头格式编写解析器,但没有可靠的方法来解析它们。 (图表A:SpamAssassin/Message/Metadata/Received.pm的来源!)