[dev] Questions about using Horde_Imap_Client

Michael J Rubinsky mrubinsk at horde.org
Tue Jan 3 13:32:08 UTC 2012


Quoting Michael M Slusarz <slusarz at horde.org>:

> Quoting Michael J Rubinsky <mrubinsk at horde.org>:
>
>> Sending to the list, but this question is mostly directed towards Michael:
>>
>> Anyway, I have tried to get only the plaintext body from the email  
>> message like so (simplified from my code):
>>
>> <code>
>> $q = new Horde_Imap_Fetch_Query();
>> $q->envelope();
>> $q->structure();
>> $q->fullText(array('peek' => true));
>
> This is more correct:
>
> $q = new Horde_Imap_Fetch_Query();
> // For the example you provided, you don't need envelope, although I  
> am guessing you may be using envelope
> // information elsewhere...
> // $q->envelope();
> $q->structure();
>
> You do NOT need fullText() (see below).
>
>> // Obviously $mbox is a Horde_Imap_Client_Mailbox object
>> // and $ids is a Horde_Imap_Client_Ids object.
>> $list = $client->fetch($mbox, $q, array('ids' => $ids));
>>
>> $email = array_pop($list);
>> $part = $email->getStructure();
>> $id = $part->findBody();
>> $body = $part->getPart($id);
>
> This is correct so far.  $part contains the Horde_Mime_Part  
> representation of the full message.  $body contains the  
> Horde_Mime_Part object of the body part.  However, neither of these  
> contains the contents of that message/part.  You haven't yet  
> requested that information from the server.
>
>> echo $body->getContents(); // <--- Always returns an empty string.
>
> As mentioned above, the empty string is expected here.  Nowhere has  
> the contents been added to the MIME part.
>
>> The only way I've been able to do what I want is to parse the  
>> entire message text with Horde_Mime_Part::parseMessage();
>>
>> <code>
>> $msg = Horde_Mime_Part::parseMessage($data->getFullMsg());
>> $id = $msg->findBody();
>> $body = $msg->getPart($id);
>> echo $body->getContents(); // <--- Shows plaintext message body.
>> </code>
>>
>> ..am I missing something, or do I completely misunderstand what I'm doing?
>
> Don't do this.  This is excessive overhead - you will have to  
> download the entire source of the original message (which may be  
> many MB, even if you only want the several KB text/plain part), and  
> then have to parse this entire message on the PHP side.  Instead,  
> you should let the IMAP server do the parsing for you, and then only  
> ship the information needed.
>
> Thus, after you have determined the body ID (in the above code, it  
> is in the $id variable), you just need to request the body part text  
> from the IMAP server:
>
> $q2 = new Horde_Imap_Fetch_Query();
> $q2->bodyPart($id, array(
>     // Attempt to decode server-side if possible.  Falls-back to  
> providing unencoded data.
>     'decode' => true,
>     'peek' => true
> ));
> $list2 = $client->fetch($mbox, $q2, array('ids' => $ids));
> $email2 = array_pop($list2);
>
> $text = $email2->getBodyPart($id);
> if (!$email2->getBodyPartDecode($id)) {
>     // Quick way to transfer decode contents
>     $body->setContents($email2->getBodyPart($id));
>     $text = $body->getContents();
> }
>
> The plaintext representation will now be in $text.
>
>> The EAS client may request to truncate the email body. Is it  
>> possible to use the imap library's ability to only return the  
>> truncated body data while still being able to parse out only the  
>> plaintext portion of the body? i.e., If the IMAP client only  
>> returns a portion of the body, I am assuming that it would be  
>> impossible to properly parse the body for the different parts,  
>> right?  Currently, since I'm parsing the fullMsg anyway, I truncate  
>> in the ActiveSync code if needed.
>
> Yes.  Meaning: you grab the structure data, determine the body part  
> ID, and then request a portion of the text for a body part ID:
>
> $q2->bodyPart($id, array(
>     // Attempt to decode server-side if possible.  Falls-back to  
> providing unencoded data.
>     'decode' => true,
>     'length' => $data_length
>     'peek' => true
> ));


Awesome! Thanks for the clarification.


-- 
mike

The Horde Project (www.horde.org)
mrubinsk at horde.org



More information about the dev mailing list