From 158b65894a086b36e383c2a41e494eb1d45fdb4a Mon Sep 17 00:00:00 2001 From: Friendika Date: Fri, 15 Apr 2011 19:16:37 -0700 Subject: initial checkin mailbox reading functions - lots more to do --- include/imap.php | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 include/imap.php (limited to 'include/imap.php') diff --git a/include/imap.php b/include/imap.php new file mode 100644 index 000000000..018727639 --- /dev/null +++ b/include/imap.php @@ -0,0 +1,107 @@ +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 ."

"; + $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 -- cgit v1.2.3