我正在寻找一种方式来下载整个原始电子邮件数据(包括附件),类似于你通过点击“显示原始”在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的第三个参数可能返回编码的附件。 我想我需要一个循环这里由部分获得的原始邮件的一部分,但什么是停止循环的条件?
有一个简单的方法来获得整个电子邮件一次?
任何帮助,将不胜感激。
我的回答是“完备”,看到男孩Baukema的回答做,如果你不需要的电子邮件的整个结构的更直接的“查看源文件”的方式。
如果你想获取所有你需要获取
- 标头
imap_fetchheader
。 - 获得机构的消息的数量
imap_fetchstructure
。 - 每个矿头一个身体有
imap_fetchmime
。 - 每个主体有
imap_fetchbody
。
为MIME消息可以有多个机构,你需要处理后,其他各部分。 为了降低负载对服务器使用FT_PREFETCHTEXT
的选项imap_fetchheader
。 一些示例有关代码imap_fetchstructure
在另一个答案是显示处理IMAP连接并已通过封装遍历消息的部分。
我碰到这个问题来了,当我在寻找同样的问题。 我知道它必须比hakre解决方案更容易,我发现在页面上正确的答案imap_fetchbody
上后从5年前 。
要获得完整的原始消息只是使用以下命令:
$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;
}
一个常见的错误是使用"\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);