【问题标题】:How to Get Body of email from Pipe to program如何从管道获取电子邮件正文到程序
【发布时间】:2011-08-09 03:35:08
【问题描述】:

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

**

我知道如何获取“发件人:”和“主题:”,但如何仅获取电子邮件正文?

**

#!/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);  


        }

等等...我如何获取电子邮件的正文内容?

【问题讨论】:

    标签: php html email-headers


    【解决方案1】:

    基本上,您想知道标题在哪里结束,并知道它是否是多部分的,这样您就可以获得电子邮件的正确部分。

    这里有一些信息:

    parsing raw email in php

    这表示第一个双换行符应该是电子邮件正文的开头。

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

    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;
      }
    
    }
    
    ?>
    

    编辑

    这是一个名为 MailParse 的 PHP 扩展:

    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/

    【讨论】:

    • 哇...你真快。我不确定我是否理解这一点。那么我应该呼出什么来访问 Body 呢? :)
    • 我注意到它适用于 html 电子邮件,但如果您从 Gmail 发送,您会得到:
    • --90e6ba1efd480d5bc804a150689a 内容类型:文本/纯文本; charset=ISO-8859-1 我发送的内容 --90e6ba1efd480d5bc804a150689a 内容类型:文本/html; charset=ISO-8859-1 我发送的内容 --90e6ba1efd480d5bc804a150689a--
    • 这些是内容类型的界限。本质上,它发送两种不同版本的电子邮件,文本和 html(用于可能不支持 html 的不同电子邮件客户端),并使用--90e6ba1efd480d5bc804a150689a 来“划分”或标记一个消息块开始和停止的“边界”。这也是在消息包中包含附件(作为文本)的方式。
    • 您还应该在 Gmail 的 See Original 中看到这一行:Content-Type: multipart/alternative; boundary="----=90e6ba1efd480d5bc804a150689a",括号之间的部分是一个随机生成的字符串,意为一次性使用(大部分情况下)。
    猜你喜欢
    • 1970-01-01
    • 2012-11-12
    • 2011-01-09
    • 1970-01-01
    • 2017-01-21
    • 2017-01-16
    • 2021-02-14
    • 2011-04-15
    • 1970-01-01
    相关资源
    最近更新 更多