Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用正则表达式解析MIME头_Regex_String_Email - Fatal编程技术网

Regex 用正则表达式解析MIME头

Regex 用正则表达式解析MIME头,regex,string,email,Regex,String,Email,在3种特殊情况下,我需要从MIME邮件头中提取电子邮件地址(由于发送电子邮件的电子邮件服务器不同,它们不同-这是一封发送给多(3)个收件人的电子邮件) 1。已接收:由oiax69以SMTP id x69so5491756oia.2接收;2015年5月31日星期日15:39:45-0700(PDT) 2.已接收:由oiav63以SMTP id v63so5487624oia.3接收;2015年5月31日星期日15:39:46-0700(PDT) 3.已接收:由oiav63以SMTP id v63s

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

1。已接收:由oiax69以SMTP id x69so5491756oia.2接收;2015年5月31日星期日15:39:45-0700(PDT)
2.已接收:由oiav63以SMTP id v63so5487624oia.3接收;2015年5月31日星期日15:39:46-0700(PDT)
3.已接收:由oiav63以SMTP id v63so5493687oia.0接收;2015年5月31日星期日15:39:45-0700(PDT)
提取电子邮件地址的正确正则表达式是什么?
重要的是要注意,它们中的每一个在…之前和之后都只是一个较大字符串的一部分。

基本上只有不好的理由想这样做,但这里有一个小Python程序,它试图从其标准输入的最顶端的
接收头中检索电子邮件终端。

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)
从系统导入标准,退出
已收集=[]
对于标准DIN中的行:
line=line.rstrip('\r\n')
如果行.startswith('Received:'):
collected.append(行)
elif line.startswith(“”)或line.startswith('\t'):
collected.append(行)
其他:
final=''.join(已收集)
#XXX FIXME:搜索还应使用“for”之前的选项卡
start=final.find('for'未找到
打印(“%s”%final[start+6:final.index('>',start+6)])
出口(0)
其他:
出口(1)
有一种情况下,您可能需要使用自制的有缺陷的电子邮件传递系统。一个合适的MTA会将邮件连同信封一起传递给您,这样您就知道收件人是谁,但一个不正确的实现只会给您发送邮件,然后您会尝试找出丢失的信封中的内容。不要这样做。修复问题,而不是症状

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

1. Received: by oiax69 with SMTP id x69so5491756oia.2 for <myaddr1@mydomain1.biz>; Sun, 31 May 2015 15:39:45 -0700 (PDT)
2. Received: by oiav63 with SMTP id v63so5487624oia.3 for <myaddr2@mydomain2.com>; Sun, 31 May 2015 15:39:46 -0700 (PDT)    
3. Received: by oiav63 with SMTP id v63so5493687oia.0 for <myaddr3@mydomain3.com>; Sun, 31 May 2015 15:39:45 -0700 (PDT)
因此,如果您有一个通配符收件箱,并且有人向您发送了一条消息
:you@example.com
您可以观察到最终收到的
标题中包含
…for
,因此您希望能够发现在何处传递邮件。但是如果发件人有
密件抄送:you@example.com, another@example.com
ode>Received:
标题通常不包含收件人,因此建议的“解决方案”在您也没有其他解决方法的情况下也会失败


另一个复杂的问题是,
接收:
头格式没有正式指定。规范说头需要存在,以及它需要包含的一些内容,但是对于如何表示这些信息没有具体的语法。如果您只在单个配置中处理单个MTA的单个版本例如,您可以为特定的
Received:
header格式编写解析器,但是没有可靠的方法来解析它们。(附件a:源代码!)

您需要更具体地说明如何在字符串中查找电子邮件地址,以获得高质量的答案。此外,您迄今为止尝试了哪些方法来解决此问题?只要在大于和小于符号之间寻找一个
@
符号就足够了。这是用什么语言编写的?chris85-我无法按照您的建议执行整个字符串很大,有很多电子邮件地址。我需要关注与我相关的这一部分…有人评论说这不够详细-标题太大,无法粘贴到此处…您的问题包含很少的详细信息,因此我不得不假设一些事情。每条消息通常都包含多个
接收:
headers——我假设最新、最顶端的头是您感兴趣的头。如果不是这样,您需要更详细地解释您的问题,可能更详细。问题的框架比您遇到问题的数据转储更重要。事实上,这是dif发送的电子邮件头的3个示例来自POP和Exchange帐户的不同服务器-由于我找不到正确的正则表达式,我最终执行了与您在C#中的建议类似的操作。它们从何处发送不太有趣,显然是接收系统生成了
接收:
头。