PHP中的imap_open函数有时会看到空白消息体
我正在使用PHP中的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($
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
指的是从返回的egimap\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')
给定的代码只处理最多有一个子部分且没有编码的简单文本消息。这基本上是最简单的电子邮件。世界曾经是那么简单,可悲的是不再是这样了 要处理更多电子邮件,必须扩展代码以处理:
$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()
,这是您必须做的。您还需要什么其他细节?我通过我链接的库运行了示例电子邮件,结果显示为所需的文本。