Php 如何使用imap扩展获取原始电子邮件数据?
我正在寻找一种下载整个原始电子邮件数据(包括附件)的方法,类似于你在Gmail中点击“Show Original”得到的 目前,我可以通过以下代码获取原始邮件头和邮件正文的某些部分:Php 如何使用imap扩展获取原始电子邮件数据?,php,email,imap,Php,Email,Imap,我正在寻找一种下载整个原始电子邮件数据(包括附件)的方法,类似于你在Gmail中点击“Show Original”得到的 目前,我可以通过以下代码获取原始邮件头和邮件正文的某些部分: $this->MailBox = imap_open($mailServer, $userName, $password, OP_SILENT); ... $email->RawEmail = imap_fetchbody($this->MailBox, $msgNo, "0"); $email-
$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的第三个参数可能会返回编码的附件。我想我需要一个循环来一部分一部分地获取原始电子邮件,但是停止循环的条件是什么
有没有一种简单的方法可以一次收到整个电子邮件
任何帮助都将不胜感激
我的答案是“过度完成”,如果您不需要电子邮件的整个结构,请参阅更直接的“查看源代码”方法
如果你想全部取回,你需要取回
- 标题
- 获取消息包含的实体数
- 每一颗地雷都有一具尸体
- 它拥有的每一具尸体
由于mime消息可以有多个主体,因此需要依次处理每个部分。要减少服务器的负载,请使用的
FT\u PREFETCHTEXT
选项。一些示例显示了如何处理imap连接并通过封装对消息的某些部分进行迭代。hakre给出的答案是“过度完成”,如果您不真正关心结构,则不需要
对于简单的“显示源代码”,您应该只需要和
例如:
一个常见的错误是使用
“\n”
或PHP\u EOL
根据RFC RFC821、RFC2060、RFC1939“\r\n”
应使用。
虽然有些邮件服务器会自动转换错误,但Cyrus不会,并抛出一个不错的错误
PHP\u EOL
是一个依赖于系统的常数,例如,它在Linux上是“\n”
,在Mac上是“\r”
,在Windows上是“\r\n”
此外,imap\u fetchheader()
按预期包含尾部的“\r\n”
。因此,正确的例子是:
$source = imap_fetchheader($conn, $msg->msgno) . imap_body($conn, $msg->msgno);
我在寻找同一问题时遇到了这个问题。我知道这比哈克雷的解决方案要容易,我在一页上找到了正确的答案 要获取完整的原始消息,只需使用以下命令:
$imap_stream = imap_open($server, $username, $password);
$raw_full_email = imap_fetchbody($imap_stream, $msg_num, "");
请注意,
imap_fetchbody
的第三个参数为空字符串,表示电子邮件的所有部分和子部分,包括标题和所有正文。太棒了!它能获取附件吗?@VeeeneX是的,它能获取所有东西。附件确实需要解码,它们通常是base64编码的。现在,电子邮件提供商允许使用OneDrive/GoogleDrive发送“附件”。这些不是真正的附件,它们不会被提取。这是最好的解决方案——只需一行即可检索完整的邮件,这样您就可以将其输入解析器$raw\u full\u email=imap\u fetchbody($handle,$num,“”)$Parser=new PhpMimeMailParser\Parser()$解析器->setText($raw\u full\u email);有没有其他人从这个PHP警告:imap\u fetchbody():错误的消息编号…
?向下滚动,使用imap\u fetchbody($imap\u stream,$msg\u num,“””)
更简单,工作起来很有魅力!我也不确定这是否回答了这个问题,因为它没有边界。
$imap_stream = imap_open($server, $username, $password);
$raw_full_email = imap_fetchbody($imap_stream, $msg_num, "");