如何获得与IMAP扩展原始电子邮件数据?(How to get raw email data wit

2019-07-29 03:23发布

我正在寻找一种方式来下载整个原始电子邮件数据(包括附件),类似于你通过点击“显示原始”在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的第三个参数可能返回编码的附件。 我想我需要一个循环这里由部分获得的原始邮件的一部分,但什么是停止循环的条件?

有一个简单的方法来获得整个电子邮件一次?

任何帮助,将不胜感激。

Answer 1:

我的回答是“完备”,看到男孩Baukema的回答做,如果你不需要的电子邮件的整个结构的更直接的“查看源文件”的方式。

如果你想获取所有你需要获取

  • 标头imap_fetchheader
  • 获得机构的消息的数量imap_fetchstructure
  • 每个矿头一个身体有imap_fetchmime
  • 每个主体有imap_fetchbody

为MIME消息可以有多个机构,你需要处理后,其他各部分。 为了降低负载对服务器使用FT_PREFETCHTEXT的选项imap_fetchheader 。 一些示例有关代码imap_fetchstructure在另一个答案是显示处理IMAP连接并已通过封装遍历消息的部分。



Answer 2:

我碰到这个问题来了,当我在寻找同样的问题。 我知道它必须比hakre解决方案更容易,我发现在页面上正确的答案imap_fetchbody上后从5年前 。

要获得完整的原始消息只是使用以下命令:

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

注意空字符串作为第三个参数imap_fetchbody这意味着所有部件和电子邮件的子部分,包括头和所有机构。



Answer 3:

通过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;
}


Answer 4:

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

根据RFC RFC821,RFC2060,RFC1939 "\r\n"应该被使用。 虽然一些邮件服务器自动转换出错,居鲁士不扔一个不错的错误。

PHP_EOL是根据恒定的,它是一个系统的"\n"在Linux上, "\r"在Mac和"\r\n"在Windows上,例如。

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

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


文章来源: How to get raw email data with the imap extension?
标签: php email imap