使用Zend框架无法从收件箱中获取某些邮件的邮件正文? [英] Can't get message body of certain emails from inbox using the Zend framework?

查看:150
本文介绍了使用Zend框架无法从收件箱中获取某些邮件的邮件正文?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在试图通过电子邮件收件箱读取我的应用程序 - 我在这里使用zend框架。问题是我无法检索某些电子邮件的邮件正文。以下是我的代码,我如何做:

  $ mail = new Zend_Mail_Storage_Imap($ mail_options); 

$ all_messages = array();

$ page = isset($ _ GET ['page'])$ _ GET ['page']:1;
$ limit = isset($ _ GET ['limit'])?$ _ GET ['limit']:20;

$ offset =(($ page-1)* $ limit)+1;

$ end =($ page * $ limit)> $ c?$ c:($ page * $ limit);
($ i = $ offset; $ i <= $ end; $ i ++){

$ h2t = new html2text();
$ h2t-> set_allowed_tags('< a>');

if(!$ mail [$ i])
break;
else {
$ one_message = $ mail-> getMessage($ i);
$ one_message-> id = $ i;
$ one_message-> UID = $ mail-> getUniqueId($ i);

$ one_message-> parts = array();
$ one_message-> body ='';
$ count = 1;
foreach(new RecursiveIteratorIterator($ mail-> getMessage($ i))as $ ii => $ part){

try {
$ tpart = $ part;
// $ tpart-> _content ='';
$ one_message-> parts [$ count] = $ tpart;
$ count ++;
//检查html body
if(strtok($ part-> contentType,';')=='text / html'){
$ b = $ part->的getContent();

if($ part-> contentTransferEncoding =='quoted-printable')
$ b = quoted_printable_decode($ b);

$ one_message-> html_body = $ b;
$ h2t-> set_html($ b);
$ one_message-> body = $ h2t-> get_text();
}

//检查文本正文

if(strtok($ part-> contentType,';')=='text / plain') {
$ b = $ part-> getContent();

if($ part-> contentTransferEncoding =='quoted-printable')
$ b = quoted_printable_decode($ b);

$ one_message-> text_body = $ b;

$ one_message-> body = $ b; // $ part-> getContent();
}

} catch(Zend_Mail_Exception $ e){
//忽略
}

}

$ all_messages [] = $ one_message;

}
}

问题是随机的一些消息不要返回一个textbody或一个html的body。即使我检查使用webvmail客户端,这些电子邮件也有一个消息体。我在这里缺少什么?

解决方案

在循环部件之前,您需要先检查邮件是否是多部分消息。如果它不是多部分,那么身体将通过 $ mail-> getContent()而不是部分暴露。基本示例:

  if($ mail-> isMultiPart()){
//此处处理的多部分消息
foreach(){
//循环部分
}
} else {
//在这里处理的非多部分消息

//默认text_body
$ one_message-> text_body = $ mail-> getContent();

if(strtok($ msg-> contentType,';')=='text / html'){
//没有纯文本替代的HTML电子邮件,设置两个值
$ one_message-> body = $ mail-> getContent();
$ one_message-> text_body = strip_tags($ mail-> getContent());
}
}


Hi guys I'm trying to read through an email inbox for my application - I'm using the zend framework here. The problem is that I'm unable to retrieve the message body for certain emails. The following is my code as to how I'm doing this:

$mail = new Zend_Mail_Storage_Imap($mail_options);

$all_messages = array();

$page = isset($_GET['page'])?$_GET['page']:1;
$limit = isset($_GET['limit'])?$_GET['limit']:20;

$offset = (($page-1)*$limit)+1;

$end = ($page*$limit)>$c?$c:($page*$limit);
for ($i=$offset;$i<=$end;$i++){

    $h2t = new html2text();
    $h2t->set_allowed_tags('<a>');

    if(!$mail[$i])
        break;
    else{
        $one_message = $mail->getMessage($i);
        $one_message->id = $i;
        $one_message->UID = $mail->getUniqueId($i);

        $one_message->parts = array();
        $one_message->body = '';
        $count = 1;
        foreach (new RecursiveIteratorIterator($mail->getMessage($i)) as $ii=>$part) {

            try {
                $tpart = $part;
                //$tpart->_content = '';
                $one_message->parts[$count] =  $tpart;
                $count++;
                // check for html body
                if (strtok($part->contentType, ';') == 'text/html') {
                    $b = $part->getContent();

                    if($part->contentTransferEncoding == 'quoted-printable')
                        $b = quoted_printable_decode($b);

                    $one_message->html_body = $b;
                    $h2t->set_html($b);
                    $one_message->body = $h2t->get_text();
                }

                //check for text body

                if (strtok($part->contentType, ';') == 'text/plain') {
                    $b = $part->getContent();

                    if($part->contentTransferEncoding == 'quoted-printable')
                        $b = quoted_printable_decode($b);

                    $one_message->text_body = $b;

                    $one_message->body = $b;//$part->getContent();
                }

            } catch (Zend_Mail_Exception $e) {
                // ignore
            }

        }

        $all_messages[] = $one_message;

    }
}

The problem is that randomly some messages don't return even a textbody or an html body. Even though if I check using a webvmail client those emails have a message body as well. WHat am I missing here?

解决方案

You need to check if the mail is multipart message first, before looping over the parts. If it's not multipart, then the body will be exposed via $mail->getContent() instead of a part. Basic example:

if ($mail->isMultiPart()) {
     // Multipart messages handled here
     foreach() {
        // loop over parts
     }
} else {
     // Non multipart messages handled here

     // default text_body
     $one_message->text_body = $mail->getContent();

     if (strtok($msg->contentType, ';') == 'text/html') {
         // HTML email with no plain text alternative, set both values
         $one_message->body = $mail->getContent();
         $one_message->text_body = strip_tags($mail->getContent());
     }
}

这篇关于使用Zend框架无法从收件箱中获取某些邮件的邮件正文?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆