使用php脚本发送电子邮件管道来收集TO字段?

时间:2012-02-05 03:27:26

标签: php email piping

我想将我的退回电子邮件转发到php脚本来处理它们。我正在使用。

 #!/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”字段。 - 它从中弹回的电子邮件。如何拆分邮件正文以获取特定信息?我应该使用此人的电子邮件创建一个特殊标题,以便更容易获得此信息吗?

1 个答案:

答案 0 :(得分:1)

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

自定义标头应以X-开头,因此可能会执行以下操作:

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

但是对于X-header,它们是非标准的,所以最好选择一个名称

  1. 通常专门用于相同目的,或
  2. 根本不可能被其他任何人使用
  3. 你应该注意另一件事;消息中的行应始终以“\ r \ n”结尾,因此您可能希望拆分两个字符(而不仅仅是“\ n”)以确保更一致的行为。