0

我使用下面的代码从邮件中提取标题详细信息.. 我无法从 from、to 和 cc 中获取邮件地址,如下所述..

$header = explode("\n", imap_fetchheader($mbox,$msgno));
echo "<br>";
    for ($i=1; $i<count($header); $i++)
    {
        echo $header[$i] . "<br>";
    }


output:

Delivered-To: user1@examplecom 
X-WM-Delivered: user1@example.com 
Received: from ElcotPC ([127.0.0.1]) 
(envelope-sender ) 
by 127.0.0.1 with ESMTP 
for ; Wed, 31 Jul 2013 09:14:19 +0530 
From: "user1" 
To: 
Cc: 
Subject: testing with attachment 
Date: Wed, 31 Jul 2013 09:14:18 +0530 

“发件人”、“收件人”、“抄送”字段为空,没有邮件地址。

我想要这样的输出..

 Delivered-To: user1@examplecom 
    X-WM-Delivered: user1@example.com 
    Received: from ElcotPC ([127.0.0.1]) 
    (envelope-sender ) 
    by 127.0.0.1 with ESMTP 
    for ; Wed, 31 Jul 2013 09:14:19 +0530 
    From: "user1" <user1@example.com>
    To: <user2@example.com>
    Cc: <user1@example.com>

如何获取“发件人”、“收件人”和“抄送”字段的电子邮件地址?

4

1 回答 1

2

更新:
最好使用现成的代码,所以我检查了 imap 解析函数是否已经存在。它确实:imap_rfc822_parse_headers. 阅读文档了解详细信息,以及各种imap_*功能的链接。也许imap_rfc822_parse_adrlist正是您需要的?


我认为,一个基本的preg_match_all电话就可以完成这项工作:

if (preg_match_all('/^\s*(From|To|Cc):[^<]*<([^>]+)\>/m',$string, $addresses)
{
    $addresses = array_merge($addresses[1], $addresses[2]);
    print_r($addresses);
}

应该输出:

array (
    'From' => 'user1@example.com',
    'To' => 'user2@example.com',
    'Cc' => 'user1@example.com',
)

我想这就是你要找的。
正则表达式解释:

  • ^\s*匹配行的开头,以及零个或多个空格字符
  • (From|To|Cc)匹配(和组)发件人、收件人或抄送
  • :[^<]*<:匹配(但不分组)冒号和任何字符,地址分隔符除外<
  • ([^>]+):Mathces(和组)之后的所有内容<,不是>
  • \>: 可以省略,但匹配地址分隔>
  • m: 多行。如果省略前导^意味着字符串的开始,现在它意味着行的开始

注意:此表达式不处理逗号分隔的地址或多个地址,调用:

 filter_var($addresses['From'], FILTER_VALIDATE_EMAIL)

或在合并前array_map用于过滤...$addresses[2]

于 2013-08-14T09:42:22.847 回答