Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从管道到程序获取电子邮件正文_Php_Html_Email Headers - Fatal编程技术网

Php 如何从管道到程序获取电子邮件正文

Php 如何从管道到程序获取电子邮件正文,php,html,email-headers,Php,Html,Email Headers,我正在将一封电子邮件传送到一个程序并运行一些代码 ** 我知道如何获取“发件人:”和“主题:”但如何仅获取电子邮件的正文? ** #/usr/bin/php-q 基本上,你需要知道邮件头的结尾,并知道它是否是多部分的,这样你就可以得到邮件的正确部分 以下是一些信息: 这意味着第一个双换行符应该是电子邮件正文的开头 本页可能会为您提供一些其他想法(请参见下面的脚本): #/usr/bin/php 哇!你太快了。我不确定我是否理解这一点。我该怎么做才能找到尸体呢?:)我注意到它适用于html电子

我正在将一封电子邮件传送到一个程序并运行一些代码

**

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

#/usr/bin/php-q

基本上,你需要知道邮件头的结尾,并知道它是否是多部分的,这样你就可以得到邮件的正确部分

以下是一些信息:

这意味着第一个双换行符应该是电子邮件正文的开头

本页可能会为您提供一些其他想法(请参见下面的脚本):

#/usr/bin/php

哇!你太快了。我不确定我是否理解这一点。我该怎么做才能找到尸体呢?:)我注意到它适用于html电子邮件,但如果你从Gmail发送邮件,你会得到以下信息:--90e6ba1efd480d5bc804a150689a内容类型:text/plain;charset=ISO-8859-1我发送的内容——90e6ba1efd480d5bc804a150689a内容类型:text/html;charset=ISO-8859-1我发送的内容——90e6ba1efd480d5bc804a150689a——这些是内容类型边界。本质上,它发送两种不同版本的电子邮件,文本和html(针对可能不支持html的不同电子邮件客户端),并使用
--90e6ba1efd480d5bc804a150689a
来“划分”或标记一个消息块开始和停止的“边界”。这也是邮件包中包含附件(作为文本)的方式;boundary=“-----=90e6ba1efd480d5bc804a150689a”
,括号之间的部分是一个随机生成的字符串,用于一次使用(大多数情况下)。
#!/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);  


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

}

?>