[英]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-message可以有多个主体,因此您需要先处理每个部分。 为了降低负载对服务器使用FT_PREFETCHTEXT
的选项imap_fetchheader
。 关于imap_fetchstructure
一些示例代码在另一个答案中显示了处理imap连接并通过封装迭代部分消息。
常见的错误是使用"\\n"
或PHP_EOL
。
根据RFC RFC821,RFC2060,应使用RFC1939 "\\r\\n"
。 虽然一些mailserver自动转换出错,但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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.