1

我有电子邮件发送到我的服务器,并通过管道传输到我的 Zend Framework 2 索引(遵循 MVC),然后发送到我的控制器。

public function incomingMailAction()
{
    $message ='';
    $stdin = fopen('php://stdin', 'r');

    while($line = fgets($stdin)) {
        $message .= $line;
    }

    fclose($stdin);

    // Parse e-mail here and store in database (including attachments)
}

我可以处理数据库部分的存储,我只是不知道如何获取原始消息,然后将其变成有用的东西(收件人、发件人、回复到、抄送、密件抄送、标题、附件......等)。

谢谢!

4

3 回答 3

3

您可以使用Zend\Mail\Message::fromString($rawMessage);它不会解码 MIME 正文。

于 2013-02-02T08:05:48.710 回答
1

我也尝试使用 ZF2 解析电子邮件,但实际上我在 Zend Mail 组件的源代码中发现了一条注释,即解码消息位于待办事项列表中,尚未实现。目前似乎没有简单的方法可以做到这一点。

相反,我建议使用php-mime-mail-parser - 我最终使用了那个库。它使用 pecl 扩展 mailparse 的功能(您可能需要安装)并且非常简单。一些可以帮助您入门的示例:

$message = new \PhpMimeMailParser\Parser();
$message->setText($rawMail); // Other functions to set a filename exists too

// All headers are retrieved in lowercase, "To" becomes "to"
// and "X-Mailer" becomes "x-mailer"
$recipient = $message->getHeader('to');
$date = $message->getHeader('date');
$xmailer = $message->getHeader('x-mailer');

// All headers can be retrieved at once as a simple array
$headers = $message->getHeaders();
$recipient = $headers['to'];

// Attachments can be retrieved all at once as "Attachment" objects
$attachments = $message->getAttachments();

foreach($attachments as $attachment) {
  $attachment_as_array = array(
    'type' => $attachment->getContentType(),
    'name' => $attachment->getFilename(),
    'content' => (string)$attachment->getContent(),
  );
}

因为该库使用 PHP 的现有扩展并且在内存管理方面似乎非常有效,所以它可能比 ZF 更适合解析电子邮件 - 而且它也非常易于使用。对我来说唯一的缺点是在每台服务器上额外安装了 mailparse pecl 扩展。

于 2016-02-29T16:44:21.790 回答
-1
public function incomingMailAction()
{
    $message ='';
    $stdin = fopen('php://stdin', 'r');

    while($line = fgets($stdin)) {
        $email .= $line;
    }     

    fclose($stdin);

    $to1 = explode ("\nTo: ", $email);
    $to2 = explode ("\n", $to1[1]);
    $to = str_replace ('>', '', str_replace('<', '', $to2[0]));
    list($toa, $tob) = explode('@', $to);
}

窃取自:PHP 电子邮件管道获取“到”字段

于 2013-02-01T18:22:43.527 回答