How to Download all mail with attachments to server using PHP IMAP?

后端 未结 1 1235
情深已故
情深已故 2021-01-31 13:09

Using PHP IMAP function i can read email, but i need to run autoamtically or manually to download messages , how can i download all email messages with or without attachments an

1条回答
  •  梦如初夏
    2021-01-31 13:43

    Please try this code to fetch the email and store attachments in a directory.

    You can also delete the mail using imap_delete and imap_expunge, after you have fetched it from the mailbox.

    In the below code set your website name, mailbox username, password and path for storing attachments.

    if( $mbox = imap_open("{yoursitename.com:110/pop3/notls}INBOX", "username of mailbox", "password of mailbox")){
        $path = "set path here for where the attachments are store";
        $check = imap_mailboxmsginfo($mbox);     
        function getmsg($mbox,$mid) {   
            global $charset,$htmlmsg,$plainmsg,$attachments,$from,$to,$subj,$timages,$path;
            $htmlmsg = $plainmsg = $charset = '';
            $attachments = array();
            // HEADER
            $h = imap_headerinfo($mbox,$mid);
            // add code here to get date, from, to, cc, subject...
            $date = $h->date;
            $from = $h->fromaddress;
            $to = $h->toaddress;
              $subj = htmlspecialchars($h->Subject);
            // BODY
            $s = imap_fetchstructure($mbox,$mid);
            if (!$s->parts)  // simple
            getpart($mbox,$mid,$s,0);  // pass 0 as part-number
            else {  // multipart: cycle through each part
            foreach ($s->parts as $partno0=>$p)
              getpart($mbox,$mid,$p,$partno0+1);
            }
        }
    
        function getpart($mbox,$mid,$p,$partno) {
            // $partno = '1', '2', '2.1', '2.1.3', etc for multipart, 0 if simple
            global $htmlmsg,$plainmsg,$charset,$attachments,$partid,$last_mail_id,$patterns,$pic,$newstr,$c,$ok,$timages,$subj,$path;
            $patterns = array();
            $pic =  array();
            $image=array();
            $data = ($partno) ? imap_fetchbody($mbox,$mid,$partno) : imap_body($mbox,$mid);  // simple
            if ($p->encoding==4)
            $data = quoted_printable_decode($data);
            else if ($p->encoding==3)
            $data = base64_decode($data);
            // PARAMETERS    // get all parameters, like charset, filenames of attachments, etc.
            $params = array();
            if ($p->parameters)
            foreach ($p->parameters as $x)
                $params[strtolower($x->attribute)] = $x->value;
            if ($p->dparameters)
            foreach ($p->dparameters as $x)
                $params[strtolower($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']) {
            $partid = htmlentities($p->id,ENT_QUOTES);
    
               // 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
            //store id and filename in array
            $image[$key] = $filename;
    
            }
            //save the attachments in the directory
            foreach( $attachments as $key => $val){
              $fname = $key;
              $fp = fopen("$path/$fname","w");
              fwrite($fp, $val);
              fclose($fp);
            }
                // TEXT
                if ($p->type==0 && $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
                    //preg_match_all('/]+>/i',$data, $result);
                    $htmlmsg .= $data."

    "; $charset = $params['charset']; // assume all parts are same charset } // There are no PHP functions to parse embedded messages, so this just appends the raw source to the main message. else if ($p->type==2 && $data) { $plainmsg .= $data."\n\n"; } // SUBPART RECURSION if ($p->parts) { foreach ($p->parts as $partno0=>$p2) getpart($mbox,$mid,$p2,$partno.'.'.($partno0+1)); // 1.2, 1.2.1, etc. } } $attachments = array(); $num_msg = imap_num_msg($mbox); if($num_msg>0) { getmsg($mbox,1); }else { echo "Sorry!...No Messages in MailBox...
    "; } //imap_delete and imap_expunge are used to delete the mail after fetching....Uncomment it if you want to delete the mail from mailbox //imap_delete($mbox,1); //imap_expunge($mbox); imap_close($mbox); }else { exit ("Can't connect: " . imap_last_error() ."\n"); echo "FAIL!\n"; };

    0 讨论(0)
提交回复
热议问题