diff options
Diffstat (limited to 'include/email.php')
-rw-r--r-- | include/email.php | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/include/email.php b/include/email.php new file mode 100644 index 000000000..c7a006da0 --- /dev/null +++ b/include/email.php @@ -0,0 +1,110 @@ +<?php + +function email_connect($mailbox,$username,$password) { + if(! (local_user() && function_exists('imap_open'))) + return false; + + $mbox = imap_open($mailbox,$username,$password); + + return $mbox; +} + +function email_poll($mbox,$email_addr) { + + if(! ($mbox && $email_addr)) + return false; + + $search = imap_search($mbox,'FROM "' . $email_addr . '"', SE_UID); + return $search; +} + + +function construct_mailbox_name($mailacct) { + $ret = '{' . $mailacct['server'] . (($mailacct['port']) ? ':' . $mailacct['port'] : ''); + $ret .= (($mailacct['ssltype']) ? '/' . $mailacct['ssltype'] . '/novalidate-cert' : ''); + $ret .= '}' . $mailacct['mailbox']; + return $ret; +} + + +function getmsg($mbox,$mid) { + // input $mbox = IMAP stream, $mid = message id + // output all the following: + global $charset,$htmlmsg,$plainmsg,$attachments; + $htmlmsg = $plainmsg = $charset = ''; + $attachments = array(); + + // HEADER + $h = imap_header($mbox,$mid); + // add code here to get date, from, to, cc, 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; + + // DECODE DATA + $data = ($partno)? + imap_fetchbody($mbox,$mid,$partno): // multipart + imap_body($mbox,$mid); // simple + // 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); + + // 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']) { + // 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 + 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 + $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==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. + } +}
\ No newline at end of file |