在PHP中剥离收到的电子邮件标头

时间:2011-09-17 09:28:30

标签: php regex email

我有一个PHP脚本,其中包含电子邮件的来源。我的目标是将标题拆分为变量$To$From

尝试将字符串拆分为字符串时会出现问题。我需要脚本做的是

From: John <john@somesite.com>
To: Susy <susy@mysite.com>, Steven <steven@somesite.com>, Mary <mary@mysite.com>

并仅返回我网站上的发件人地址和地址。即。

$From = 'john@somesite.com';
$To = array('susy@mysite.com', 'mary@mysite.com');

因此代码需要将一串电子邮件地址转换为数组,然后过滤掉其他网站中的地址。这是第一个证明困难的部分,因为电子邮件地址可以在标题中列出的方式不同。

3 个答案:

答案 0 :(得分:2)

修改

正如您现在指定的那样,您将标题作为字符串实际上需要从中解析地址,因此无需重新发明轮子:

这两个函数将为您完成工作,最后一个函数将为您提供一个包含预先解析的电子邮件地址的对象的数组,因此您可以轻松地根据主机做出决策。


我不清楚你的问题是什么问题。

只要您担心过滤包含一个电子邮件地址的字符串(将其转换为数组)或包含一个或多个地址的数组:

要过滤现有的电子邮件地址数组,您可以使用简单的数组映射功能,将任何与您网站的主机不匹配的电子邮件设置为FALSE,然后过滤数组副本Demo

$addresses = array(
   'mary@mysite.com',
   'mary@othersite.com',
);

$myhost = 'mysite.com';

$filtered = array_map(function($email) use ($myhost) {
    $host = '@'.$myhost;
    $is = substr($email, -strlen($host)) === $host;
    return $is ? $email : FALSE;
}, $addresses);

$filtered = array_filter($filtered);

print_r($filtered);

此代码假设您已收集电子邮件地址。您尚未指定如何解析问题中已有的标题,因此实际上您不知道要处理哪些数据,因此我选择从问题的最后开始。如果您有更多可用信息,请告诉我们。

答案 1 :(得分:1)

 <?php

 $k= "......Subject: Write the program any of your favorite language whenever if you feel
  you are free
 From: Vinay Kumar <vinaykumarjg@gmail.com>
 To: msnjsk@gmail.com, mithunsatish@gmail.com,Susy <susy@mysite.com>, Steven      <steven@somesite.com>, Mary <mary@mysite.com>
 Content-Type: multipart/alternative; boundary=bcaec53964ec5eed2604acd0e09a

 --bcaec53964ec5eed2604acd0e09a
 Content-Type: text/plain; charset=ISO-8859-1
 .......";


 if(preg_match('/From:(?P<text>.+)\r\n/', $k, $matches1))
 {

      if(preg_match('/(?P<from>([a-z0-9])(([-a-z0-9._])*([a-z0-9]))*\@([a-z0-9])' .'(([a-z0-9-])*([a-z0-9]))+' . '(\.([a-z0-9])([-a-z0-9_-])?([a-z0-9])+)+)/', $matches1['text'],$sender ))
      {

         print_r($sender['from']);

      }

 }


 if(preg_match('/To:(?P<text>.+)\r\n/', $k, $matches2))
 {
    if(preg_match_all('/(?P<to>([a-z0-9])(([-a-z0-9._])*([a-z0-9]))*\@([a-z0-9])' .
'(([a-z0-9-])*([a-z0-9]))+' . '(\.([a-z0-9])([-a-z0-9_-])?([a-z0-9])+)+)/', $matches2['text'], $reciever))
    {
        if(isset($reciever['to']))
        {
                print_r($reciever['to']);
        }
    }
 }

获得主题:

 if(preg_match('/Subject:(?P<subject>.+)\r\n/', $k, $subject))
 {    

         print_r($subject['subject']);
 }

答案 2 :(得分:1)

preg_match_all("/<([^><]+)/", $headers, $matches);
print_r($matches[1]);

<强>输出:

Array
(
    [0] => john@somesite.com
    [1] => susy@mysite.com
    [2] => steven@somesite.com
    [3] => mary@mysite.com
)

第一个始终是来自电子邮件地址。

Live demo