Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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_open函数有时会看到空白消息体_Php - Fatal编程技术网

PHP中的imap_open函数有时会看到空白消息体

PHP中的imap_open函数有时会看到空白消息体,php,Php,我正在使用PHP中的imap\u open函数下载电子邮件并将其插入mysql数据库 下面是我获取标题和正文消息等的代码: $emails = imap_search($inbox,'ALL'); //if emails are returned, cycle through each... if($emails) { //begin output var $output = ''; //put the newest emails on top rsort($

我正在使用PHP中的
imap\u open
函数下载电子邮件并将其插入mysql数据库

下面是我获取标题和正文消息等的代码:

$emails = imap_search($inbox,'ALL');

//if emails are returned, cycle through each...
if($emails)
{
    //begin output var
    $output = '';

    //put the newest emails on top
    rsort($emails);

    //for every email...
    foreach($emails as $email_number) 
    {
        //get information specific to this email
        $header=imap_headerinfo($inbox,$email_number);

        $structure = imap_fetchstructure($inbox,$email_number);

        $from = $header->from[0]->mailbox . "@" . $header->from[0]->host;
        $toaddress=$header->to[0]->mailbox."@".$header->to[0]->host;
        $replyto=$header->reply_to[0]->mailbox."@".$header->reply_to[0]->host;
        $datetime=date("Y-m-d H:i:s",$header->udate);
        $subject=$header->subject;

    $message = quoted_printable_decode(imap_fetchbody($inbox,$email_number,1.1)); 
    if($message == '')
    {
        $message = quoted_printable_decode(imap_fetchbody($inbox,$email_number,1));
    }
}
}
但它似乎并不是所有电子邮件的主体。例如,当它收到已读回执时,正文是空白的,人们发送的其他一些电子邮件也是如此

有时,电子邮件正文看起来像:

PGh0bWw+DQO8AGVHZD4NCJXTZXRHIGH0DHATZF1AxF9IKNVBNRLBNQTVHLWZIGY29UDGVUDD0I DGV4DC9ODG1SOYBJFYC2V0PXVZI04IJ4NCJJ2R5IHN0EWXLPSJ3J3JKLXDLXDY YXA6IGJYZWFRLXDVCMQ7IC13ZWZWZLXQTBMJZCC1TB2TB2LOIBGFJZTLYMTPDC1SAW5LW5LJJJJJJZYM9LZYMTPDC9LZWIJJ9LJJJJ9LJJJJZZZLZZZZZZZZZZZZZZZZLYYZZZZZZZZZZZZZZZNHB4OYBMB250LWZHBWLSETOGQ2FSAWJYASWGC2FUNCY1ZZXJPZJSIPG0KPGRPDJ4NCJXKAXY+DQO8ZGL2PNLCGX5PC9KAXY+DQO8ZGL2PG0KPHAGC3R5BGU9IMZVBNQTZMTFTAWX5OIBDYWYYWYNJJJJJJJJJJVNPKBMQGYYXJJJJJJJJJJJJJJJJJKGYNI+DQOYNI+DQOYNI+DQQGYNI+DQQQGYNZFYNZFYNYNYNJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJPLRLY2HUAWNHBCNYW5HZ2VYJM5IC3A7PC9IPJWVC3BHBJ48YJ58JM5IC3A7SW50ZWDYYSBEAWDP dGFsPC9iPjxmb250IGNvbG9yPSIjNTk1OTU。。。继续


如何将整个消息正文转换为纯文本

以下是我通常使用的内容
$email
指的是从返回的eg
imap\u fetch\u overview
中得到的一个对象:

$structure = imap_fetchstructure($email->msgno);
$body = imap_fetchbody($email->msgno, '1');
if (3 === $structure->encoding) {
    $body = imap_base64($body);
} else if (4 === $structure->encoding) {
    $body = imap_qprint($body);
}
注意有6种可能的编码(从0到5),我只处理其中的2种(3和4)——您可能希望处理所有编码

还要注意的是,我只得到了第1部分(在imap_fetchbody中)——您可能希望在片段上循环以获得所需的片段

更新
还有一件事我注意到了你的代码。您正在执行
imap\u fetchbody($inbox,$email\u number,1.1)
。第三个参数应该是字符串,而不是数字。改为这样做:

imap_fetchbody($inbox, $email_number, '1.1')

给定的代码只处理最多有一个子部分且没有编码的简单文本消息。这基本上是最简单的电子邮件。世界曾经是那么简单,可悲的是不再是这样了

要处理更多电子邮件,必须扩展代码以处理:

  • 多部件
  • 编码
  • “多部分”是指单个电子邮件(一组数据)可分为多个部分的概念。在最简单的情况下,只有一部分:消息的文本。在下一种最简单的情况下,存在带有单个附件的消息文本。下一种最简单的情况是消息文本加上多个附件。然后,当消息的文本引用内联或嵌入附件时,它开始变得困难(想象一个带有图像的HTML消息——该图像可能是一个与“本地”CSS链接的附件,或者嵌入为例如base64数据url)

    编码是指电子邮件需要容纳Internet上SMTP服务器的最低公分母。从1971到90年代初,字符集——和SMTP邮件在中间依赖于这个7位框架。随着对字符集的需求变得越来越明显,同时需要发送二进制数据(如图像),出现了8位SMTP邮件,以及将数据转换为7位的各种方法。这些包括和。尽管如此,我们仍然需要跨越这段历史的所有障碍

    PHP.net上有一段很好的代码,可以处理多部分编码的消息,而不是重新发明轮子。请参阅作者的评论。您可以这样使用该代码:

    $mailbox = imap_open($service, $username, $password) or die('Cannot open mailbox');
    
    // for all messages
    $emails = imap_fetch_overview($mailbox, '1:1'/* . imap_check($mbox)->Nmsgs*/);
    foreach ($emails as $email) {
        // get the info
        getmsg($mailbox, $email->msgno);
    
        // now you have info from this message in these global vars:
        // $charset,$htmlmsg,$plainmsg,$attachments
        echo $plainmsg; // for example
    }
    imap_close($mailbox);
    
    (旁注:他的代码有三个解析错误,他是这么做的。”=“意思是”。”。修复这些错误,你就可以开始了。)


    另外,如果您正在寻找一个关于“从头开始”这样做的好博客,请查看以下内容:

    将第三个参数设置为字符串根本不起作用其他代码如何,使用imap_base64()和imap_qprint()?如果不是这样,是否检查所有部分(MIME可以有许多部分)?例如imap_fetchbody($inbox,$email_number,'1.2')?我不确定我应该把imap_base64还是imap_qprint放进去-你能再解释一下吗?电子邮件可以有6种传输编码之一#3是base64编码(通常是二进制数据)而#4是(使用ASCII在7位线上传输8位数据)。检查邮件源的标题内容传输编码,并使用必要的解码方法。此外,您要查找的消息文本可能不在子部分1中——您是否已使用我先前评论中的“1.2”字符串检查了子部分2?这对我从gmail帐户获取数据很有帮助。您正在回显$plainmessage,但我无论如何都看不到该变量请在这些全局变量中的“代码中查看注释”。函数的编写方式是更新全局变量。我不会用这种方式为产品编写代码,但要按原样重用
    getmsg()
    ,这是您必须做的。您还需要什么其他细节?我通过我链接的库运行了示例电子邮件,结果显示为所需的文本。