2012-02-05 64 views
3

我想转发我反弹的电子邮件到一个PHP脚本来处理它们。我在用。用php脚本收集TO字段的电子邮件管道?

#!/usr/bin/php -q 
<?php 

// read from stdin 
$fd = fopen("php://stdin", "r"); 
$email = ""; 
while (!feof($fd)) { 
$email .= fread($fd, 1024); 
} 
    fclose($fd); 

    // handle email 
    $lines = explode("\n", $email); 

    // empty vars 
    $from = ""; 
    $subject = ""; 
    $headers = ""; 
    $message = ""; 
    $splittingheaders = true; 

    for ($i=0; $i < count($lines); $i++) { 
    if ($splittingheaders) { 
    // this is a header 
    $headers .= $lines[$i]."\n"; 

    // look out for special headers 
    if (preg_match("/^Subject: (.*)/", $lines[$i], $matches)) { 
     $subject = $matches[1]; 
    } 
    if (preg_match("/^From: (.*)/", $lines[$i], $matches)) { 
     $from = $matches[1]; 
    } 
} else { 
    // not a header, but message 
    $message .= $lines[$i]."\n"; 
} 

if (trim($lines[$i])=="") { 
    // empty line, header section has ended 
    $splittingheaders = false; 
    } 
    } 

    ?>  

完美的作品!但是,如何收集退回邮件中的“收件人”字段?我试着添加一个$ to变量,但它不起作用。

任何帮助将是巨大的,

感谢,

编辑:其实我需要得到消息的正文中的“收件人”字段。 - 它弹回的电子邮件。我如何拆开消息的主体以获取特定信息?我应该使用该人的电子邮件创建一个特殊的标题,以便获取此信息更容易?

+0

你需要知道它在消息体中的外观,然后用正则表达式来获取它。 – Alasdair 2012-02-05 09:55:26

+0

有时更可靠的另一种选择是发送具有唯一返回路径的每条消息。通过这种方式,您可以根据消息被反弹到的电子邮件地址确切地知道哪些消息会返回给您。 – 2012-02-06 09:27:48

回答

1

如果您可以创建自定义标题,那将是最简单的。否则,您需要针对您的整个身体进行特定模式的匹配;如果你的身体文字可能有所不同,可能很难确保你总是匹配正确的文本。

自定义页眉应该X-开始,所以也许这样做:

if (preg_match("/^X-Originally-To: (.*)/", $lines[$i], $matches)) { 
    $originallyto = $matches[1]; 
} 

但随着X-头,他们是非标准的,所以最好选一个名字要么是

  1. 通常只用于同一目的,或者
  2. 不可能被任何人在任何
使用

你应该注意的另一件事;消息中的行应始终以“\ r \ n”结尾,因此您可能希望在两个字符(而不是“\ n”)上进行拆分以确保更一致的行为。