Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用imap扩展获取原始电子邮件数据?_Php_Email_Imap - Fatal编程技术网

Php 如何使用imap扩展获取原始电子邮件数据?

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-

我正在寻找一种下载整个原始电子邮件数据(包括附件)的方法,类似于你在Gmail中点击“Show Original”得到的

目前,我可以通过以下代码获取原始邮件头和邮件正文的某些部分:

$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, "");