如何使用 imap 扩展获取原始电子邮件数据


How to get raw email data with the imap extension?

我正在寻找一种下载整个原始电子邮件数据(包括附件)的方法,类似于您在Gmail中单击"显示原始"所获得的方法。

目前,我可以通过以下代码获取原始标头和邮件正文的某些部分:

$this->MailBox = imap_open($mailServer, $userName, $password, OP_SILENT);
...
$email->RawEmail = imap_fetchbody($this->MailBox, $msgNo, "0");
$email->RawEmail .= "'n".imap_fetchbody($this->MailBox, $msgNo, "1");

我也知道更改imap_fetchbody的第 3 个参数可能会返回编码的附件。猜猜我在这里需要一个循环来逐部分获取原始电子邮件,但是停止循环的条件是什么?

有没有一种简单的方法可以一次获取整封电子邮件?

任何帮助将不胜感激。

我在

搜索同一问题时遇到了这个问题。我知道它必须比 hakre 的解决方案更容易,我在 5 年前的一篇文章中找到了imap_fetchbody的正确答案。

要获取完整的原始消息,只需使用以下命令:

$imap_stream = imap_open($server, $username, $password);
$raw_full_email = imap_fetchbody($imap_stream, $msg_num, "");

请注意空字符串作为imap_fetchbody的第三个参数,这表示电子邮件的所有部分和子部分,包括标题和所有正文。

hakre的答案过于完整,如果你真的不关心结构,那么你就不需要imap_fetchstructure。

对于简单的"显示源",您只需要imap_fetchheader和imap_body。

例:

$conn = imap_open('{'."$mailServer:$port/pop3}INBOX", $userName, $password, OP_SILENT && OP_READONLY);
$msgs = imap_fetch_overview($conn, '1:5'); /** first 5 messages */
foreach ($msgs as $msg) {
    $source = imap_fetchheader($conn, $msg->msgno) . imap_body($conn, $msg->msgno);
    print $source;
}

我的答案是"过度完成",如果你不需要电子邮件的整个结构,请参阅Boy Baukema的回答,以获得更直接的"查看源代码"方式。

如果要获取所有内容,则需要获取

  • 标题imap_fetchheader .
  • 获取消息imap_fetchstructure的正文数。
  • 每个地雷头一个身体都有imap_fetchmime.
  • 它拥有的每个身体都imap_fetchbody.

由于 mime 消息可以有多个正文,因此您需要处理每个部分。要减少服务器的负载,请使用 imap_fetchheaderFT_PREFETCHTEXT 选项。一些关于imap_fetchstructure在另一个答案中的示例代码,该答案显示了处理 imap 连接并已通过封装迭代消息的各个部分。

一个常见的错误是使用 "'n"PHP_EOL

根据RFC RFC821,RFC2060,应该使用RFC1939 "'r'n"。虽然一些邮件服务器会自动转换该错误,但赛勒斯不会并抛出一个很好的错误。

PHP_EOL是一个依赖于常量的系统,例如,它在Linux上"'n",在Mac上"'r",在Windows上"'r'n"

此外,imap_fetchheader()还包含预期的尾随"'r'n"。所以正确的例子是:

 $source = imap_fetchheader($conn, $msg->msgno) . imap_body($conn, $msg->msgno);