如何在imap php中提取完整的邮件地址

时间:2013-08-14 09:32:26

标签: php cakephp imap

我使用以下代码从邮件中提取标题详细信息..我无法在下面提到的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 

“from”,“to”,“cc”字段为空,没有邮件地址..

我想要像这样的输出..

 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>

如何将电子邮件地址设为“from”,“to”和“cc”字段?

1 个答案:

答案 0 :(得分:2)

更新:
它总是最好使用现成的代码,所以我检查了是否已存在imap-parsing函数。它确实:imap_rfc822_parse_headersRead the docs了解详细信息,以及指向各种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)匹配(和组)From,To或Cc
  • :[^<]*<:匹配(但不分组)冒号和任何字符,但地址分隔<
  • 除外
  • ([^>]+):在<之后的所有内容的数学(和分组),不是>
  • \>:可以省略,但匹配地址分隔>
  • m:多行。如果省略前导^表示字符串,则现在意味着行首

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

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

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