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

时间:2012-04-24 07:32:34

标签: 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");

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

是否可以轻松获取整个电子邮件?

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:17)

当我在寻找同样的问题时,我遇到了这个问题。我知道它必须比hakre的解决方案更容易,我在imap_fetchbody上的post from 5 years ago页面上找到了正确的答案。

要获取完整的原始邮件,只​​需使用以下内容:

$imap_stream = imap_open($server, $username, $password);
$raw_full_email = imap_fetchbody($imap_stream, $msg_num, "");

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

答案 1 :(得分: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;
}

答案 2 :(得分:3)

  

我的回答是“overcomplete”,如果您不需要整体,请参阅Boy Baukema's answer了解更直接的“查看来源”的做法电子邮件的结构。

如果你想获取全部,你需要获取

由于mime-message可以有多个实体,因此需要先处理每个部分。要减少服务器的负载,请使用imap_fetchheaderFT_PREFETCHTEXT选项。一些示例code about imap_fetchstructure in another answer显示了处理imap连接并通过封装迭代部分消息。

答案 3 :(得分:0)

常见的错误是使用"\n"PHP_EOL

根据RFC RFC821,RFC2060,应使用RFC1939 "\r\n"。 虽然有些邮件服务器自动转换出错,但Cyrus并没有抛出错误。

PHP_EOL是系统依赖常量,它在Linux上是"\n",在Mac上是"\r",在Windows上是"\r\n"

此外,imap_fetchheader()包含预期的尾随"\r\n"。所以正确的例子是:

 $source = imap_fetchheader($conn, $msg->msgno) . imap_body($conn, $msg->msgno);