From 6008e3df111c722e6f2e01be81d197fed33dfd42 Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Fri, 1 Dec 2017 14:41:27 -0500 Subject: [PATCH] Email to src Create Email class and update/rename functions and function calls. --- include/dbstructure.php | 2 +- include/email.php | 317 -------------------------------------- mod/invite.php | 5 +- mod/item.php | 6 +- mod/settings.php | 7 +- src/Network/Probe.php | 10 +- src/Protocol/Email.php | 333 ++++++++++++++++++++++++++++++++++++++++ src/Util/Emailer.php | 7 +- src/Worker/Delivery.php | 18 +-- src/Worker/OnePoll.php | 20 +-- 10 files changed, 370 insertions(+), 355 deletions(-) delete mode 100644 include/email.php create mode 100644 src/Protocol/Email.php diff --git a/include/dbstructure.php b/include/dbstructure.php index dde3dc6f18..05b2bc07cc 100644 --- a/include/dbstructure.php +++ b/include/dbstructure.php @@ -95,7 +95,7 @@ function update_fail($update_id, $error_message) { )); $subject=sprintf(t('Update Error at %s'), System::baseUrl()); require_once('include/email.php'); - $subject = email_header_encode($subject,'UTF-8'); + $subject = Email::emailHeaderEncode($subject,'UTF-8'); mail($a->config['admin_email'], $subject, $email_msg, 'From: ' . 'Administrator' . '@' . $_SERVER['SERVER_NAME']."\n" .'Content-type: text/plain; charset=UTF-8'."\n" diff --git a/include/email.php b/include/email.php deleted file mode 100644 index b3bd52a668..0000000000 --- a/include/email.php +++ /dev/null @@ -1,317 +0,0 @@ - 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 = str_replace("\r",'',$raw_header); - $ret = array(); - $h = explode("\n",$raw_header); - if (count($h)) - foreach ($h as $line ) { - if (preg_match("/^[a-zA-Z]/", $line)) { - $key = substr($line,0,strpos($line,':')); - $value = substr($line,strpos($line,':')+1); - - $last_entry = strtolower($key); - $ret[$last_entry] = trim($value); - } - else { - $ret[$last_entry] .= ' ' . trim($line); - } - } - return $ret; -} - - -function email_get_msg($mbox,$uid, $reply) { - $ret = array(); - - $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, '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, '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, $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) && $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']) && $params['filename']) || (isset($params['name']) && $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)==$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 - } - - // 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) && $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 - $end = "?="; - $start = "=?" . $charset . "?B?"; - $spacer = $end . "\r\n " . $start; - - // determine length of encoded text within chunks - // and ensure length is even - $length = 75 - strlen($start) - strlen($end); - - /* - [EDIT BY danbrown AT php DOT net: The following - is a bugfix provided by (gardan AT gmx DOT de) - on 31-MAR-2005 with the following note: - "This means: $length should not be even, - but divisible by 4. The reason is that in - base64-encoding 3 8-bit-chars are represented - by 4 6-bit-chars. These 4 chars must not be - split between two encoded words, according - to RFC-2047. - */ - $length = $length - ($length % 4); - - // encode the string and split it into chunks - // with spacers after each chunk - $out_str = base64_encode($out_str); - $out_str = chunk_split($out_str, $length, $spacer); - - // remove trailing spacer and - // add start and end delimiters - $spacer = preg_quote($spacer,'/'); - $out_str = preg_replace("/" . $spacer . "$/", "", $out_str); - $out_str = $start . $out_str . $end; - } - return $out_str; -} - -/** - * 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); -} diff --git a/mod/invite.php b/mod/invite.php index 4f7abf36a3..eb1ac8860a 100644 --- a/mod/invite.php +++ b/mod/invite.php @@ -11,8 +11,7 @@ use Friendica\App; use Friendica\Core\Config; use Friendica\Core\PConfig; use Friendica\Core\System; - -require_once('include/email.php'); +use Friendica\Protocol\Email; function invite_post(App $a) { @@ -78,7 +77,7 @@ function invite_post(App $a) { $nmessage = $message; } - $res = mail($recip, email_header_encode( t('Please join us on Friendica'),'UTF-8'), + $res = mail($recip, Email::emailHeaderEncode(t('Please join us on Friendica'),'UTF-8'), $nmessage, "From: " . $a->user['email'] . "\n" . 'Content-type: text/plain; charset=UTF-8' . "\n" diff --git a/mod/item.php b/mod/item.php index fbedcd86ba..97abce0ef6 100644 --- a/mod/item.php +++ b/mod/item.php @@ -24,11 +24,11 @@ use Friendica\Model\GlobalContact; use Friendica\Network\Probe; use Friendica\Object\Contact; use Friendica\Protocol\Diaspora; +use Friendica\Protocol\Email; use Friendica\Util\Emailer; require_once 'include/crypto.php'; require_once 'include/enotify.php'; -require_once 'include/email.php'; require_once 'include/tags.php'; require_once 'include/files.php'; require_once 'include/threads.php'; @@ -1030,9 +1030,9 @@ function item_post(App $a) { $disclaimer .= sprintf( t('You may visit them online at %s'), System::baseUrl() . '/profile/' . $a->user['nickname']) . EOL; $disclaimer .= t('Please contact the sender by replying to this post if you do not wish to receive these messages.') . EOL; if (!$datarray['title']=='') { - $subject = email_header_encode($datarray['title'], 'UTF-8'); + $subject = Email::emailHeaderEncode($datarray['title'], 'UTF-8'); } else { - $subject = email_header_encode('[Friendica]' . ' ' . sprintf( t('%s posted an update.'), $a->user['username']), 'UTF-8'); + $subject = Email::emailHeaderEncode('[Friendica]' . ' ' . sprintf( t('%s posted an update.'), $a->user['username']), 'UTF-8'); } $link = '' . $a->user['username'] . '

'; $html = prepare_body($datarray); diff --git a/mod/settings.php b/mod/settings.php index 8ad82b023d..1d7ac91782 100644 --- a/mod/settings.php +++ b/mod/settings.php @@ -10,6 +10,7 @@ use Friendica\Core\PConfig; use Friendica\Database\DBM; use Friendica\Model\GlobalContact; use Friendica\Model\User; +use Friendica\Protocol\Email; require_once 'include/group.php'; @@ -259,12 +260,12 @@ function settings_post(App $a) { ); if (DBM::is_result($r)) { $eacct = $r[0]; - require_once('include/email.php'); - $mb = construct_mailbox_name($eacct); + $mb = Email::constructMailboxName($eacct); + if (strlen($eacct['server'])) { $dcrpass = ''; openssl_private_decrypt(hex2bin($eacct['pass']), $dcrpass, $a->user['prvkey']); - $mbox = email_connect($mb, $mail_user, $dcrpass); + $mbox = Email::emailConnect($mb, $mail_user, $dcrpass); unset($dcrpass); if (!$mbox) { $failed = true; diff --git a/src/Network/Probe.php b/src/Network/Probe.php index 6001489ec7..2216d7dcce 100644 --- a/src/Network/Probe.php +++ b/src/Network/Probe.php @@ -15,6 +15,7 @@ use Friendica\Core\Cache; use Friendica\Core\Config; use Friendica\Database\DBM; use Friendica\Object\Profile; +use Friendica\Protocol\Email; use Friendica\Util\XML; use dba; @@ -22,7 +23,6 @@ use DomXPath; use DOMDocument; require_once 'include/feed.php'; -require_once 'include/email.php'; require_once 'include/network.php'; /** @@ -1517,16 +1517,16 @@ class Probe $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d AND `server` != '' LIMIT 1", intval($uid)); if (DBM::is_result($x) && DBM::is_result($r)) { - $mailbox = construct_mailbox_name($r[0]); + $mailbox = Email::constructMailboxName($r[0]); $password = ''; openssl_private_decrypt(hex2bin($r[0]['pass']), $password, $x[0]['prvkey']); - $mbox = email_connect($mailbox, $r[0]['user'], $password); + $mbox = Email::emailConnect($mailbox, $r[0]['user'], $password); if (!mbox) { return false; } } - $msgs = email_poll($mbox, $uri); + $msgs = Email::emailPoll($mbox, $uri); logger('searching '.$uri.', '.count($msgs).' messages found.', LOGGER_DEBUG); if (!count($msgs)) { @@ -1546,7 +1546,7 @@ class Probe $data["notify"] = 'smtp '.random_string(); $data["poll"] = 'email '.random_string(); - $x = email_msg_meta($mbox, $msgs[0]); + $x = Email::emailMsgMeta($mbox, $msgs[0]); if (stristr($x[0]->from, $uri)) { $adr = imap_rfc822_parse_adrlist($x[0]->from, ''); } elseif (stristr($x[0]->to, $uri)) { diff --git a/src/Protocol/Email.php b/src/Protocol/Email.php new file mode 100644 index 0000000000..d147da1166 --- /dev/null +++ b/src/Protocol/Email.php @@ -0,0 +1,333 @@ + array(array()) is probably redundant now + return ((count($ret)) ? $ret : array()); + } + + /** + * @brief Check addons, not called from main friendica project + */ + function email_msg_headers($mbox, $uid) { + $raw_header = (($mbox && $uid) ? @imap_fetchheader($mbox,$uid,FT_UID) : ''); + $raw_header = str_replace("\r",'',$raw_header); + $ret = array(); + $h = explode("\n",$raw_header); + if (count($h)) + foreach ($h as $line ) { + if (preg_match("/^[a-zA-Z]/", $line)) { + $key = substr($line,0,strpos($line,':')); + $value = substr($line,strpos($line,':')+1); + + $last_entry = strtolower($key); + $ret[$last_entry] = trim($value); + } + else { + $ret[$last_entry] .= ' ' . trim($line); + } + } + return $ret; + } + + public static function emailGetMsg($mbox, $uid, $reply) + { + $ret = array(); + + $struc = (($mbox && $uid) ? @imap_fetchstructure($mbox,$uid,FT_UID) : null); + + if (! $struc) + return $ret; + + if (! $struc->parts) { + $ret['body'] = self::emailGetPart($mbox,$uid,$struc,0, 'html'); + $html = $ret['body']; + + if (trim($ret['body']) == '') + $ret['body'] = self::emailGetPart($mbox,$uid,$struc,0, 'plain'); + else + $ret['body'] = html2bbcode($ret['body']); + } + else { + $text = ''; + $html = ''; + foreach ($struc->parts as $ptop => $p) { + $x = self::emailGetPart($mbox,$uid,$p,$ptop + 1, 'plain'); + if ($x) { + $text .= $x; + } + + $x = self::emailGetPart($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 + + private static function emailGetPart($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) && $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']) && $params['filename']) || (isset($params['name']) && $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)==$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 + } + + // 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) && $p->parts) { + $x = ""; + foreach ($p->parts as $partno0=>$p2) { + $x .= self::emailGetPart($mbox,$uid,$p2,$partno . '.' . ($partno0+1), $subtype); // 1.2, 1.2.1, etc. + //if ($x) { + // return $x; + //} + } + return $x; + } + } + + public static function emailHeaderEncode($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 + $end = "?="; + $start = "=?" . $charset . "?B?"; + $spacer = $end . "\r\n " . $start; + + // determine length of encoded text within chunks + // and ensure length is even + $length = 75 - strlen($start) - strlen($end); + + /* + [EDIT BY danbrown AT php DOT net: The following + is a bugfix provided by (gardan AT gmx DOT de) + on 31-MAR-2005 with the following note: + "This means: $length should not be even, + but divisible by 4. The reason is that in + base64-encoding 3 8-bit-chars are represented + by 4 6-bit-chars. These 4 chars must not be + split between two encoded words, according + to RFC-2047. + */ + $length = $length - ($length % 4); + + // encode the string and split it into chunks + // with spacers after each chunk + $out_str = base64_encode($out_str); + $out_str = chunk_split($out_str, $length, $spacer); + + // remove trailing spacer and + // add start and end delimiters + $spacer = preg_quote($spacer,'/'); + $out_str = preg_replace("/" . $spacer . "$/", "", $out_str); + $out_str = $start . $out_str . $end; + } + return $out_str; + } + + /** + * emailSend 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 + */ + public static function emailSend($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); + } + + public static 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); + } + + public static 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); + } +} diff --git a/src/Util/Emailer.php b/src/Util/Emailer.php index a2be983d6c..434c3da798 100644 --- a/src/Util/Emailer.php +++ b/src/Util/Emailer.php @@ -5,8 +5,7 @@ namespace Friendica\Util; use Friendica\Core\PConfig; - -require_once 'include/email.php'; +use Friendica\Protocol\Email; /** * @breif class to handle emailing @@ -38,8 +37,8 @@ class Emailer $email_textonly = PConfig::get($params['uid'], "system", "email_textonly"); } - $fromName = email_header_encode(html_entity_decode($params['fromName'], ENT_QUOTES, 'UTF-8'), 'UTF-8'); - $messageSubject = email_header_encode(html_entity_decode($params['messageSubject'], ENT_QUOTES, 'UTF-8'), 'UTF-8'); + $fromName = Email::emailHeaderEncode(html_entity_decode($params['fromName'], ENT_QUOTES, 'UTF-8'), 'UTF-8'); + $messageSubject = Email::emailHeaderEncode(html_entity_decode($params['messageSubject'], ENT_QUOTES, 'UTF-8'), 'UTF-8'); // generate a mime boundary $mimeBoundary =rand(0, 9)."-" diff --git a/src/Worker/Delivery.php b/src/Worker/Delivery.php index c47e98287b..7d800f54f7 100644 --- a/src/Worker/Delivery.php +++ b/src/Worker/Delivery.php @@ -12,13 +12,13 @@ use Friendica\Database\DBM; use Friendica\Object\Contact; use Friendica\Protocol\Diaspora; use Friendica\Protocol\DFRN; +use Friendica\Protocol\Email; require_once 'include/queue_fn.php'; require_once 'include/html2plain.php'; require_once 'include/datetime.php'; require_once 'include/items.php'; require_once 'include/bbcode.php'; -require_once 'include/email.php'; /// @todo This is some ugly code that needs to be split into several methods @@ -418,36 +418,36 @@ class Delivery { if ($r1 && $r1[0]['reply_to']) $reply_to = $r1[0]['reply_to']; - $subject = (($it['title']) ? email_header_encode($it['title'],'UTF-8') : t("\x28no subject\x29")) ; + $subject = (($it['title']) ? Email::emailHeaderEncode($it['title'],'UTF-8') : t("\x28no subject\x29")) ; // only expose our real email address to true friends if (($contact['rel'] == CONTACT_IS_FRIEND) && !$contact['blocked']) { if ($reply_to) { - $headers = 'From: '.email_header_encode($local_user[0]['username'],'UTF-8').' <'.$reply_to.'>'."\n"; + $headers = 'From: '.Email::emailHeaderEncode($local_user[0]['username'],'UTF-8').' <'.$reply_to.'>'."\n"; $headers .= 'Sender: '.$local_user[0]['email']."\n"; } else { - $headers = 'From: '.email_header_encode($local_user[0]['username'],'UTF-8').' <'.$local_user[0]['email'].'>'."\n"; + $headers = 'From: '.Email::emailHeaderEncode($local_user[0]['username'],'UTF-8').' <'.$local_user[0]['email'].'>'."\n"; } } else { - $headers = 'From: '. email_header_encode($local_user[0]['username'],'UTF-8') .' <'. t('noreply') .'@'.$a->get_hostname() .'>'. "\n"; + $headers = 'From: '. Email::emailHeaderEncode($local_user[0]['username'],'UTF-8') .' <'. t('noreply') .'@'.$a->get_hostname() .'>'. "\n"; } //if ($reply_to) // $headers .= 'Reply-to: '.$reply_to . "\n"; - $headers .= 'Message-Id: <'. iri2msgid($it['uri']).'>'. "\n"; + $headers .= 'Message-Id: <'. Email::iri2msgid($it['uri']).'>'. "\n"; //logger("Mail: uri: ".$it['uri']." parent-uri ".$it['parent-uri'], LOGGER_DEBUG); //logger("Mail: Data: ".print_r($it, true), LOGGER_DEBUG); //logger("Mail: Data: ".print_r($it, true), LOGGER_DATA); if ($it['uri'] !== $it['parent-uri']) { - $headers .= "References: <".iri2msgid($it["parent-uri"]).">"; + $headers .= "References: <".Email::iri2msgid($it["parent-uri"]).">"; // If Threading is enabled, write down the correct parent if (($it["thr-parent"] != "") && ($it["thr-parent"] != $it["parent-uri"])) - $headers .= " <".iri2msgid($it["thr-parent"]).">"; + $headers .= " <".Email::iri2msgid($it["thr-parent"]).">"; $headers .= "\n"; if (!$it['title']) { @@ -469,7 +469,7 @@ class Delivery { if (strncasecmp($subject,'RE:',3)) $subject = 'Re: '.$subject; } - email_send($addr, $subject, $headers, $it); + Email::emailSend($addr, $subject, $headers, $it); } break; diff --git a/src/Worker/OnePoll.php b/src/Worker/OnePoll.php index 356fce4337..3f00454b2a 100644 --- a/src/Worker/OnePoll.php +++ b/src/Worker/OnePoll.php @@ -8,6 +8,7 @@ use Friendica\Core\Config; use Friendica\Core\PConfig; use Friendica\Database\DBM; use Friendica\Object\Contact; +use Friendica\Protocol\Email; use Friendica\Protocol\PortableContact; use dba; @@ -20,7 +21,6 @@ Class OnePoll require_once 'include/datetime.php'; require_once 'include/items.php'; - require_once 'include/email.php'; require_once 'include/queue_fn.php'; logger('onepoll: start'); @@ -328,10 +328,10 @@ Class OnePoll $condition = array("`server` != '' AND `uid` = ?", $importer_uid); $mailconf = dba::select('mailacct', array(), $condition, array('limit' => 1)); if (DBM::is_result($x) && DBM::is_result($mailconf)) { - $mailbox = construct_mailbox_name($mailconf); + $mailbox = Email::constructMailboxName($mailconf); $password = ''; openssl_private_decrypt(hex2bin($mailconf['pass']), $password, $x['prvkey']); - $mbox = email_connect($mailbox, $mailconf['user'], $password); + $mbox = Email::emailConnect($mailbox, $mailconf['user'], $password); unset($password); logger("Mail: Connect to " . $mailconf['user']); if ($mbox) { @@ -344,12 +344,12 @@ Class OnePoll } if ($mbox) { - $msgs = email_poll($mbox, $contact['addr']); + $msgs = Email::emailPoll($mbox, $contact['addr']); if (count($msgs)) { logger("Mail: Parsing ".count($msgs)." mails from ".$contact['addr']." for ".$mailconf['user'], LOGGER_DEBUG); - $metas = email_msg_meta($mbox,implode(',', $msgs)); + $metas = Email::emailMsgMeta($mbox,implode(',', $msgs)); if (count($metas) != count($msgs)) { logger("onepoll: for " . $mailconf['user'] . " there are ". count($msgs) . " messages but received " . count($metas) . " metas", LOGGER_DEBUG); } else { @@ -361,10 +361,10 @@ Class OnePoll $datarray = array(); $datarray['verb'] = ACTIVITY_POST; $datarray['object-type'] = ACTIVITY_OBJ_NOTE; - // $meta = email_msg_meta($mbox, $msg_uid); - // $headers = email_msg_headers($mbox, $msg_uid); + // $meta = Email::emailMsgMeta($mbox, $msg_uid); + // $headers = email_msg_headers($mbox, $msg_uid); - $datarray['uri'] = msgid2iri(trim($meta->message_id, '<>')); + $datarray['uri'] = Email::msgid2iri(trim($meta->message_id, '<>')); // Have we seen it before? $fields = array('deleted', 'id'); @@ -416,7 +416,7 @@ Class OnePoll $refs_arr = explode(' ', $raw_refs); if (count($refs_arr)) { for ($x = 0; $x < count($refs_arr); $x ++) { - $refs_arr[$x] = "'" . msgid2iri(str_replace(array('<', '>', ' '),array('', '', ''),dbesc($refs_arr[$x]))) . "'"; + $refs_arr[$x] = "'" . Email::msgid2iri(str_replace(array('<', '>', ' '),array('', '', ''),dbesc($refs_arr[$x]))) . "'"; } } $qstr = implode(',', $refs_arr); @@ -466,7 +466,7 @@ Class OnePoll $datarray['parent-uri'] = $datarray['uri']; } - $r = email_get_msg($mbox, $msg_uid, $reply); + $r = Email::emailGetMsg($mbox, $msg_uid, $reply); if (!$r) { logger("Mail: can't fetch msg ".$msg_uid." for ".$mailconf['user']); continue;