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

don*_*000 11 php email imap

我正在寻找一种方法来下载整个原始电子邮件数据(包括附件),类似于您在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");
Run Code Online (Sandbox Code Playgroud)

另外我知道更改imap_fetchbody的第3个参数可能会返回编码的附件.猜猜我需要一个循环来获取原始电子邮件的一部分,但是什么是停止循环的条件?

是否有一种简单的方法可以立即获得整个电子邮件?

任何帮助,将不胜感激.

Gon*_*zar 17

当我在寻找同样的问题时,我遇到了这个问题.我知道它必须比hakre的解决方案更容易,我imap_fetchbody5年前帖子上找到了正确的答案.

要获取完整的原始消息,请使用以下命令:

$imap_stream = imap_open($server, $username, $password);
$raw_full_email = imap_fetchbody($imap_stream, $msg_num, "");
Run Code Online (Sandbox Code Playgroud)

请注意空字符串作为imap_fetchbody此字符的第三个参数表示电子邮件的所有部分和子部分,包括标题和所有正文.

  • @VeeeneX是的,它取得了一切.确实需要对附件进行解码,它们通常是base64编码的.如今电子邮件提供商允许使用OneDrive/GoogleDrive发送"附件",这些不是真正的附件,它们将不会被提取. (3认同)

Boy*_*ema 9

hakre的答案是过于完整的,如果你真的不关心结构,那么你将不需要imap_fetchstructure.

对于简单的"显示源",您应该只需要imap_fetchheaderimap_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;
}
Run Code Online (Sandbox Code Playgroud)


hak*_*kre 4

我的答案是“过于完整”,如果您不需要电子邮件的整个结构,请参阅Boy Baukema 的答案以获得更直接的“查看源代码”方式。

如果要获取全部,则需要获取

由于 mime-message 可以有多个主体,因此您需要依次处理每个部分。要减少服务器的负载,请使用 的FT_PREFETCHTEXT选项imap_fetchheader另一个答案中的一些示例代码imap_fetchstructure显示了处理 imap 连接并迭代已经通过封装的消息部分。

  • 向下滚动,使用``imap_fetchbody($imap_stream, $msg_num, "")`` 更简单,而且效果就像一个魅力! (2认同)