Hello and welcome to our community! Is this your first visit?
Register
Enjoy an ad free experience by logging in. Not a member yet? Register.
Results 1 to 3 of 3
  1. #1
    Regular Coder
    Join Date
    Apr 2004
    Posts
    684
    Thanks
    24
    Thanked 1 Time in 1 Post

    Getting body of pop3 email msg fails on some systems when using PHP's IMAP functions

    Hey guys..... I've built a POP3 mail retriever apart from a couple functions I got from the PHP.net site in the comments section & modified a bit, which basically gets the message structure & parses the "parts" into separate variables.

    Now this is all working fine on my local system & my server on the web..... I get the contents of the msg fine... for my purposes I'm using the "$plainmsg" variable.

    However for some reason it doesn't appear to be working on my clients local machine.. when the script is run he always ends up with an empty body.... here is the relevant 2 methods for the body portion..

    PHP Code:
    function getMsg($connection,$uid) {

        global 
    $htmlmsg,$plainmsg,$charset,$attachments;

        
    // Define data holder array
        
    $part_array = array();

        
    // Define some vars
        
    $htmlmsg '';
        
    $plainmsg '';
        
    $charset '';
        
    $attachments '';

        
    // Get message structure
        
    $structure imap_fetchstructure($connection,$uidFT_UID);

        if (!
    $structure->parts) {  // not multipart

            
    $this->getPart($connection,$uid,$structure,0);  // no part-number, so pass 0

        
    } else {  // multipart: iterate through each part

            
    foreach ($structure->parts as $partno0 => $part) {
                
    $this->getPart($connection,$uid,$part,$partno0+1);
            }

        }

        if (!empty(
    $htmlmsg)) $part_array['html'] = $htmlmsg;
        if (!empty(
    $plainmsg)) $part_array['plain'] = $plainmsg;
        if (!empty(
    $charset)) $part_array['charset'] = $charset;
        if (!empty(
    $attachments)) $part_array['attachments'] = $attachments;

        
    // Return data array
        
    return $part_array;

    }

    /* Makes up & decodes the different 'parts' of the message body */

    protected function getPart($connection,$uid,$p,$partno) {

        
    // $partno = '1', '2', '2.1', '2.1.3', etc if multipart, 0 if not multipart
        
    global $htmlmsg,$plainmsg,$charset,$attachments;

        
    // DECODE DATA
        
    $data = ($partno)?
            
    imap_fetchbody($connection,$uid,$partnoFT_UID):  // multipart
            
    imap_body($connection,$uidFT_UID);  // not multipart
        // Any part may be encoded, even plain text messages, so check everything.
        
    if ($p->encoding==4)
            
    $data quoted_printable_decode($data);
        elseif (
    $p->encoding==3)
            
    $data base64_decode($data);
        
    // no need to decode 7-bit, 8-bit, or binary

        // PARAMETERS
        // get all parameters, like charset, filenames of attachments, etc.
        
    $params = array();
        if (
    $p->parameters)
            foreach (
    $p->parameters as $x)
                
    $paramsstrtolower$x->attribute ) ] = $x->value;
        if (
    $p->dparameters)
            foreach (
    $p->dparameters as $x)
                
    $paramsstrtolower$x->attribute ) ] = $x->value;

        
    // ATTACHMENT
        // Any part with a filename is an attachment,
        // so an attached text file (type 0) is not mistaken as the message.
        
    if ($params['filename'] || $params['name']) {
            
    // filename may be given as 'Filename' or 'Name' or both
            
    $filename = ($params['filename'])? $params['filename'] : $params['name'];
            
    // filename may be encoded, so see imap_mime_header_decode()
            
    $attachments[$filename] = $data;  // this is a problem if two files have same name
        
    }

        
    // TEXT
        
    elseif ($p->type==&& $data) {
            
    // Messages may be split in different parts because of inline attachments,
            // so append parts together with blank row.
            
    if (strtolower($p->subtype)=='plain')
                
    $plainmsg .= trim($data) ."\n\n";
            else
                
    $htmlmsg .= $data ."<br><br>";
            
    $charset $params['charset'];  // assume all parts are same charset
        
    }

        
    // EMBEDDED MESSAGE
        // Many bounce notifications embed the original message as type 2,
        // but AOL uses type 1 (multipart), which is not handled here.
        // There are no PHP functions to parse embedded messages,
        // so this just appends the raw source to the main message.
        
    elseif ($p->type==&& $data) {
            
    $plainmsg .= trim($data) ."\n\n";
        }

        
    // SUBPART RECURSION
        
    if ($p->parts) {
            foreach (
    $p->parts as $partno0=>$p2)
                
    $this->getPart($connection,$uid,$p2,$partno.'.'.($partno0+1));  // 1.2, 1.2.1, etc.
        
    }


    I've echoed out the $plainmsg variable at the bottom of the getParts() method & it's empty... anyone know why this would work fine on my two servers & not my clients? Some kind of PHP setting that is affecting something?

    Thanks a lot!

  • #2
    Senior Coder
    Join Date
    Jul 2009
    Location
    South Yorkshire, England
    Posts
    2,318
    Thanks
    6
    Thanked 304 Times in 303 Posts
    IMAP functions not installed on your clients machine? Far as I recall, they're reliant on external dependencies during compilation. You have checked everything is okay in that regard?

  • #3
    Regular Coder
    Join Date
    Apr 2004
    Posts
    684
    Thanks
    24
    Thanked 1 Time in 1 Post
    Yeah. He has IMAP installed.... got all the headers fine such as subject, date, to, from etc..... the body is the problem.

    If it helps.... here is a saved copy of his PHP info I took home with me.. http://www.condorstudios.com/work/steve/start.htm


  •  

    Posting Permissions

    • You may not post new threads
    • You may not post replies
    • You may not post attachments
    • You may not edit your posts
    •