X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Femail.php;h=0f24a424975eae75d1c4507a43dad8f89c9c1e21;hb=be40fb8186bc18e3562d780a7153f76ee7d5e90f;hp=7e0351e94690ce8ee19fe8d56d56f0e4277fb4b8;hpb=44d5c90af446537ddd292caff0cd85370a7339ab;p=friendica.git diff --git a/include/email.php b/include/email.php index 7e0351e946..0f24a42497 100644 --- a/include/email.php +++ b/include/email.php @@ -1,10 +1,13 @@ array(array()) is probably redundant now + return ((count($ret)) ? $ret : array()); } function email_msg_headers($mbox,$uid) { - $raw_header = (($mbox && $uid) ? imap_fetchheader($mbox,$uid,FT_UID) : ''); + $raw_header = (($mbox && $uid) ? @imap_fetchheader($mbox,$uid,FT_UID) : ''); $raw_header = str_replace("\r",'',$raw_header); $ret = array(); - $h = split("\n",$raw_header); + $h = explode("\n",$raw_header); if(count($h)) foreach($h as $line ) { if (preg_match("/^[a-zA-Z]/", $line)) { @@ -64,104 +74,143 @@ function email_msg_headers($mbox,$uid) { } -function email_get_msg($mbox,$uid) { +function email_get_msg($mbox,$uid, $reply) { $ret = array(); - $struc = (($mbox && $uid) ? imap_fetchstructure($mbox,$uid,FT_UID) : null); + $struc = (($mbox && $uid) ? @imap_fetchstructure($mbox,$uid,FT_UID) : null); if(! $struc) return $ret; if(! $struc->parts) { - $ret['body'] = email_get_part($mbox,$uid,$struc,0); + $ret['body'] = email_get_part($mbox,$uid,$struc,0, 'html'); + $html = $ret['body']; + + if (trim($ret['body']) == '') + $ret['body'] = email_get_part($mbox,$uid,$struc,0, 'plain'); + else + $ret['body'] = html2bbcode($ret['body']); } else { + $text = ''; + $html = ''; foreach($struc->parts as $ptop => $p) { - $x = email_get_part($mbox,$uid,$p,$ptop + 1); - if($x) - $ret['body'] = $x; + $x = email_get_part($mbox,$uid,$p,$ptop + 1, 'plain'); + if($x) $text .= $x; + + $x = email_get_part($mbox,$uid,$p,$ptop + 1, 'html'); + if($x) $html .= $x; } + if (trim($html) != '') + $ret['body'] = html2bbcode($html); + else + $ret['body'] = $text; } + + $ret['body'] = removegpg($ret['body']); + $msg = removesig($ret['body']); + $ret['body'] = $msg['body']; + $ret['body'] = convertquote($ret['body'], $reply); + + if (trim($html) != '') + $ret['body'] = removelinebreak($ret['body']); + + $ret['body'] = unifyattributionline($ret['body']); + return $ret; } // At the moment - only return plain/text. // Later we'll repackage inline images as data url's and make the HTML safe -function email_get_part($mbox,$uid,$p,$partno) { - // $partno = '1', '2', '2.1', '2.1.3', etc for multipart, 0 if simple - global $htmlmsg,$plainmsg,$charset,$attachments; - - echo $partno; - - // DECODE DATA - $data = ($partno) - ? imap_fetchbody($mbox,$uid,$partno, FT_UID|FT_PEEK) - : imap_body($mbox,$uid,FT_UID|FT_PEEK); - - // 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 - } +function email_get_part($mbox,$uid,$p,$partno, $subtype) { + // $partno = '1', '2', '2.1', '2.1.3', etc for multipart, 0 if simple + global $htmlmsg,$plainmsg,$charset,$attachments; + + //echo $partno."\n"; + + // DECODE DATA + $data = ($partno) + ? @imap_fetchbody($mbox,$uid,$partno, FT_UID|FT_PEEK) + : @imap_body($mbox,$uid,FT_UID|FT_PEEK); + + // 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 (isset($p->dparameters) and $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 ((isset($params['filename']) and $params['filename']) || (isset($params['name']) and $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') - return (trim($data) ."\n\n"); - else + // 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)==$subtype) { + $data = iconv($params['charset'], 'UTF-8//IGNORE', $data); + return (trim($data) ."\n\n"); + } else $data = ''; // $htmlmsg .= $data ."

"; - $charset = $params['charset']; // assume all parts are same charset - } + $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) { - $x = email_get_part($mbox,$uid,$p2,$partno . '.' . ($partno0+1)); // 1.2, 1.2.1, etc. - if($x) - return $x; + // 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 (isset($p->parts) and $p->parts) { + $x = ""; + foreach ($p->parts as $partno0=>$p2) { + $x .= email_get_part($mbox,$uid,$p2,$partno . '.' . ($partno0+1), $subtype); // 1.2, 1.2.1, etc. + //if($x) + // return $x; } - } + return $x; + } } function email_header_encode($in_str, $charset) { $out_str = $in_str; + $need_to_convert = false; + + for($x = 0; $x < strlen($in_str); $x ++) { + if((ord($in_str[$x]) == 0) || ((ord($in_str[$x]) > 128))) { + $need_to_convert = true; + } + } + + if(! $need_to_convert) + return $in_str; + if ($out_str && $charset) { // define start delimimter, end delimiter and spacer @@ -193,9 +242,64 @@ function email_header_encode($in_str, $charset) { // remove trailing spacer and // add start and end delimiters - $spacer = preg_quote($spacer); + $spacer = preg_quote($spacer,'/'); $out_str = preg_replace("/" . $spacer . "$/", "", $out_str); $out_str = $start . $out_str . $end; } return $out_str; -} \ No newline at end of file +} + +/** + * email_send is used by NETWORK_EMAIL and NETWORK_EMAIL2 code + * (not to notify the user, but to send items to email contacts + * + * TODO: this could be changed to use the Emailer class + */ +function email_send($addr, $subject, $headers, $item) { + //$headers .= 'MIME-Version: 1.0' . "\n"; + //$headers .= 'Content-Type: text/html; charset=UTF-8' . "\n"; + //$headers .= 'Content-Type: text/plain; charset=UTF-8' . "\n"; + //$headers .= 'Content-Transfer-Encoding: 8bit' . "\n\n"; + + $part = uniqid("", true); + + $html = prepare_body($item); + + $headers .= "Mime-Version: 1.0\n"; + $headers .= 'Content-Type: multipart/alternative; boundary="=_'.$part.'"'."\n\n"; + + $body = "\n--=_".$part."\n"; + $body .= "Content-Transfer-Encoding: 8bit\n"; + $body .= "Content-Type: text/plain; charset=utf-8; format=flowed\n\n"; + + $body .= html2plain($html)."\n"; + + $body .= "--=_".$part."\n"; + $body .= "Content-Transfer-Encoding: 8bit\n"; + $body .= "Content-Type: text/html; charset=utf-8\n\n"; + + $body .= ''.$html."\n"; + + $body .= "--=_".$part."--"; + + //$message = '' . $html . ''; + //$message = html2plain($html); + logger('notifier: email delivery to ' . $addr); + mail($addr, $subject, $body, $headers); +} + +function iri2msgid($iri) { + if (!strpos($iri, "@")) + $msgid = preg_replace("/urn:(\S+):(\S+)\.(\S+):(\d+):(\S+)/i", "urn!$1!$4!$5@$2.$3", $iri); + else + $msgid = $iri; + return($msgid); +} + +function msgid2iri($msgid) { + if (strpos($msgid, "@")) + $iri = preg_replace("/urn!(\S+)!(\d+)!(\S+)@(\S+)\.(\S+)/i", "urn:$1:$4.$5:$2:$3", $msgid); + else + $iri = $msgid; + return($iri); +}