12

我正在寻找一种下载整个原始电子邮件数据(包括附件)的方法,类似于您在 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 的第三个参数可能会返回编码的附件。猜猜我需要一个循环来逐部分获取原始电子邮件,但是停止循环的条件是什么?

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

任何帮助,将不胜感激。

4

4 回答 4

19

当我搜索相同的问题时,我遇到了这个问题。我知道它必须比 hakre 的解决方案更容易,并且我在5 年前imap_fetchbody的一篇帖子的页面上找到了正确答案。

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

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

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

于 2015-01-27T04:48:59.687 回答
9

hakre 的答案过于完整,如果您并不真正关心结构,那么您将不需要imap_fetchstructure

对于一个简单的“显示源”,您应该只需要imap_fetchheaderimap_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;
}
于 2013-07-26T09:39:19.640 回答
4

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

如果要获取全部,则需要获取

由于 mime-message 可以有多个主体,您需要一个接一个地处理每个部分。要减少服务器的负载,请FT_PREFETCHTEXT使用imap_fetchheader. 另一个答案中的一些示例代码imap_fetchstructure显示了处理 imap 连接并已经通过封装迭代了部分消息。

于 2012-04-24T07:49:11.500 回答
0

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

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

PHP_EOL是一个系统依赖常量,例如"\n"在 Linux、"\r"Mac 和"\r\n"Windows 上。

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

 $source = imap_fetchheader($conn, $msg->msgno) . imap_body($conn, $msg->msgno);
于 2014-04-09T21:13:28.073 回答