如何从管道到程序获取电子邮件的主体


How to Get Body of email from Pipe to program

我正在给一个程序发送一封电子邮件并运行一些代码。

* *

我知道如何获得"From:"answers"Subject:",但我如何只获得电子邮件的正文?

* *

#!/usr/bin/php -q
<?
$fd = fopen("php://stdin", "r");
while (!feof($fd)) {
  $email .= fread($fd, 1024);
}
fclose($fd);
$lines = explode("'n", $email);
for ($i=0; $i < count($lines); $i++) 
{

    // look out for special headers
    if (preg_match("/Subject:/", $lines[$i], $matches)) 
        {
    list($One,$Subject) = explode("Subject:", $lines[$i]);    
    list($Subject,$Gone) = explode("<", $Subject);  

        }

等等……我如何获得电子邮件的正文内容?

基本上,你想知道标题结束的地方,并知道它是否由多个部分组成,这样你就可以得到电子邮件的正确部分。

下面是一些信息:

解析原始邮件

表示第一个双换行符应该是邮件正文的开始。

此页可能会给你一些其他的想法(参见下面的脚本):

http://thedrupalblog.com/configuring-server-parse-email-php-script

#!/usr/bin/php
<?php
// fetch data from stdin
$data = file_get_contents("php://stdin");
// extract the body
// NOTE: a properly formatted email's first empty line defines the separation between the headers and the message body
list($data, $body) = explode("'n'n", $data, 2);
// explode on new line
$data = explode("'n", $data);
// define a variable map of known headers
$patterns = array(
  'Return-Path',
  'X-Original-To',
  'Delivered-To',
  'Received',
  'To',
  'Message-Id',
  'Date',
  'From',
  'Subject',
);
// define a variable to hold parsed headers
$headers = array();
// loop through data
foreach ($data as $data_line) {
  // for each line, assume a match does not exist yet
  $pattern_match_exists = false;
  // check for lines that start with white space
  // NOTE: if a line starts with a white space, it signifies a continuation of the previous header
  if ((substr($data_line,0,1)==' ' || substr($data_line,0,1)=="'t") && $last_match) {
    // append to last header
    $headers[$last_match][] = $data_line;
    continue;
  }
  // loop through patterns
  foreach ($patterns as $key => $pattern) {
    // create preg regex
    $preg_pattern = '/^' . $pattern .': (.*)$/';
    // execute preg
    preg_match($preg_pattern, $data_line, $matches);
    // check if preg matches exist
    if (count($matches)) {
      $headers[$pattern][] = $matches[1];
      $pattern_match_exists = true;
      $last_match = $pattern;
    }
  }
  // check if a pattern did not match for this line
  if (!$pattern_match_exists) {
    $headers['UNMATCHED'][] = $data_line;
  }
}
?>

编辑

这是一个PHP扩展名为MailParse: http://pecl.php.net/package/mailparse

有人围绕它建立了一个类叫做MimeMailParse:

http://code.google.com/p/php-mime-mail-parser/

这里有一篇博客文章讨论如何使用它:

http://www.bucabay.com/web-development/a-php-mime-mail-parser-using-mailparse-extension/