From c10ed0ca2007d4a657963cd83bcdb8c7764b6007 Mon Sep 17 00:00:00 2001 From: Benjamin Renard Date: Sun, 29 Jan 2023 19:45:38 +0100 Subject: [PATCH] Move email stuff in EesyPHP namespace --- includes/core.php | 11 ++- includes/mail.php | 137 ------------------------------ phpstan.neon | 8 +- src/Email.php | 211 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 225 insertions(+), 142 deletions(-) delete mode 100644 includes/mail.php create mode 100644 src/Email.php diff --git a/includes/core.php b/includes/core.php index 7cb8c6e..42c5f6e 100644 --- a/includes/core.php +++ b/includes/core.php @@ -1,5 +1,6 @@ $to Email recipient(s) - * @param string $subject Email subject - * @param string $msg Email body - * @param boolean $html Set to true to send an HTML email (default: false) - * @param array|null $attachments Email attachments as an array with - * filepath as key and filename as value - * @param array|null $headers Email headers - * @param string|null $encoding Email encoding (default: utf8) - * @param string|null $eol End of line string (default : \n) - * - * @return boolean true If mail was sent, false otherwise - */ -function send_mail($from, $to, $subject, $msg, $html=false, $attachments=null, $headers=null, - $encoding=null, $eol=null) { - global $mail_send_method, $mail_headers, $mail_send_params, $mail_sender, $mail_catch_all; - $mail_obj = & Mail::factory($mail_send_method, $mail_send_params); - - if (!$headers) $headers = array(); - if(isset($mail_headers) && is_array($mail_headers)) { - $headers = array_merge($headers, $mail_headers); - } - - Log :: trace( - 'Mail catch all: %s', - isset($mail_catch_all) && $mail_catch_all? - vardump($mail_catch_all):'not set' - ); - if (isset($mail_catch_all) && $mail_catch_all) { - Log :: debug( - 'Mail catch to %s', - is_array($mail_catch_all)?implode(',', $mail_catch_all):$mail_catch_all - ); - $msg .= sprintf( - ( - $html? - _("

Mail initialy intended for %s.

"): - _("\n\n\nMail initialy intended for %s.") - ), - (is_array($to)?implode(',', $to):$to)); - $headers["X-Orig-To"] = $to; - $to = ( - is_array($mail_catch_all)? - implode(',', $mail_catch_all):$mail_catch_all - ); - } - - if ($subject) { - $headers["Subject"] = $subject; - } - - if (isset($headers['From'])) { - if (!$from) - $from = $headers['From']; - unset($headers['From']); - } - elseif (!$from) { - $from = $mail_sender; - } - - $headers["To"] = $to; - - $to = array ( - 'To' => $to - ); - - foreach(array_keys($headers) as $header) { - if(in_array(strtoupper($header), array('BCC', 'CC'))) { - if (isset($mail_catch_all) && $mail_catch_all) { - Log :: debug("Mail catched: remove $header header"); - $msg .= sprintf( - ( - $html? - _("

%s: %s

"): - _("\n%s: %s") - ), - strtoupper($header), - (is_array($headers[$header])?implode(',', $headers[$header]):$headers[$header])); - unset($headers[$header]); - continue; - } - $to[strtoupper($header)] = $headers[$header]; - } - } - - if (!$encoding) $encoding = "utf8"; - $mime = new Mail_mime( - array( - 'eol' => ($eol?$eol:"\n"), - ($html?'html_charset':'text_charset') => $encoding, - 'head_charset' => $encoding, - ) - ); - - if ($from) - $mime->setFrom($from); - - if ($subject) - $mime->setSubject($subject); - - if ($html) - $mime->setHTMLBody($msg); - else - $mime->setTXTBody($msg); - - if (is_array($attachments) && !empty($attachments)) { - $finfo = new finfo(FILEINFO_MIME_TYPE); - foreach ($attachments as $file => $filename) { - $mime->addAttachment($file, $finfo->file($file), $filename); - } - } - - $body = $mime->get(); - $headers = $mime->headers($headers); - - $ret = $mail_obj -> send($to, $headers, $body); - - if (PEAR::isError($ret)) { - $msg = "Error sending email: ".$ret -> getMessage(); - Log :: error($msg); - return false; - } - return true; -} - -# vim: tabstop=2 shiftwidth=2 softtabstop=2 expandtab diff --git a/phpstan.neon b/phpstan.neon index 7a73eff..3340bfc 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -10,16 +10,16 @@ parameters: ignoreErrors: - message: "#Instantiated class Mail_mime not found\\.#" - path: includes/mail.php + path: src/Email.php - message: "#Call to method (setFrom|setSubject|setHTMLBody|setTXTBody|get|headers|addAttachment)\\(\\) on an unknown class Mail_mime\\.#" - path: includes/mail.php + path: src/Email.php - message: "#Call to static method factory\\(\\) on an unknown class Mail\\.#" - path: includes/mail.php + path: src/Email.php - message: "#Call to static method isError\\(\\) on an unknown class PEAR\\.#" - path: includes/mail.php + path: src/Email.php - message: "#Variable \\$root_dir_path might not be defined\\.#" paths: diff --git a/src/Email.php b/src/Email.php new file mode 100644 index 0000000..91ce3f0 --- /dev/null +++ b/src/Email.php @@ -0,0 +1,211 @@ +|null + */ + protected static $catch_all = null; + + /** + * Default headers to add on all sent emails + * @var array + */ + protected static $headers = array(); + + /** + * PHP PEAR Mail lib path + * @var string + */ + protected static $php_mail_path = 'Mail.php'; + + /** + * PHP PEAR Mail lib path + * @var string + */ + protected static $php_mail_mime_path = 'Mail/mime.php'; + + + /** + * Initialization + * @param string|null $php_mail_path PHP PEAR Mail lib path (optional, default: Mail.php) + * @param string|null $php_mail_mime_path PHP PEAR Mail lib path (optional, default: Mail/mime.php) + * @return void + */ + public static function init($sender=null, $send_method=null, $send_params=null, $catch_all=null, + $headers=null, $php_mail_path=null, $php_mail_mime_path=null) { + if ($sender) self :: $sender = $sender; + if ($send_method) self :: $send_method = $send_method; + if ($send_params) self :: $send_params = $send_params; + if ($catch_all) self :: $catch_all = $catch_all; + if ($headers) self :: $headers = $headers; + if ($php_mail_path) self :: $php_mail_path = $php_mail_path; + if ($php_mail_mime_path) self :: $php_mail_mime_path = $php_mail_mime_path; + } + + + /** + * Send an email + * + * @param string|null $from Email sender + * @param string|array $to Email recipient(s) + * @param string $subject Email subject + * @param string $msg Email body + * @param boolean $html Set to true to send an HTML email (default: false) + * @param array|null $attachments Email attachments as an array with + * filepath as key and filename as value + * @param array|null $headers Email headers + * @param string|null $encoding Email encoding (default: utf8) + * @param string|null $eol End of line string (default : \n) + * + * @return boolean true If mail was sent, false otherwise + */ + public static function send($from, $to, $subject, $msg, $html=false, $attachments=null, + $headers=null, $encoding=null, $eol=null) { + if (!class_exists('Mail')) + require_once(self :: $php_mail_path); + if (!class_exists('Mail_mime')) + require_once(self :: $php_mail_mime_path); + + $mail_obj = Mail::factory(self :: $send_method, self :: $send_params); + + if (!$headers) $headers = array(); + $headers = array_merge($headers, self :: $headers); + + Log :: trace( + 'Mail catch all: %s', + self :: $catch_all? + vardump(self :: $catch_all):'not set' + ); + if (self :: $catch_all) { + Log :: debug( + 'Mail catch to %s', + is_array(self :: $catch_all)?implode(',', self :: $catch_all):self :: $catch_all + ); + $msg .= sprintf( + ( + $html? + _("

Mail initialy intended for %s.

"): + _("\n\n\nMail initialy intended for %s.") + ), + (is_array($to)?implode(',', $to):$to)); + $headers["X-Orig-To"] = $to; + $to = ( + is_array(self :: $catch_all)? + implode(',', self :: $catch_all):self :: $catch_all + ); + } + + if ($subject) { + $headers["Subject"] = $subject; + } + + if (isset($headers['From'])) { + if (!$from) + $from = $headers['From']; + unset($headers['From']); + } + elseif (!$from) { + $from = self :: $sender; + } + + $headers["To"] = $to; + + $to = array ( + 'To' => $to + ); + + foreach(array_keys($headers) as $header) { + if(in_array(strtoupper($header), array('BCC', 'CC'))) { + if (self :: $catch_all) { + Log :: debug("Mail catched: remove $header header"); + $msg .= sprintf( + ( + $html? + _("

%s: %s

"): + _("\n%s: %s") + ), + strtoupper($header), + (is_array($headers[$header])?implode(',', $headers[$header]):$headers[$header])); + unset($headers[$header]); + continue; + } + $to[strtoupper($header)] = $headers[$header]; + } + } + + if (!$encoding) $encoding = "utf8"; + $mime = new Mail_mime( + array( + 'eol' => ($eol?$eol:"\n"), + ($html?'html_charset':'text_charset') => $encoding, + 'head_charset' => $encoding, + ) + ); + + if ($from) + $mime->setFrom($from); + + if ($subject) + $mime->setSubject($subject); + + if ($html) + $mime->setHTMLBody($msg); + else + $mime->setTXTBody($msg); + + if (is_array($attachments) && !empty($attachments)) { + $finfo = new finfo(FILEINFO_MIME_TYPE); + foreach ($attachments as $file => $filename) { + $mime->addAttachment($file, $finfo->file($file), $filename); + } + } + + $body = $mime->get(); + $headers = $mime->headers($headers); + + $ret = $mail_obj -> send($to, $headers, $body); + + if (PEAR::isError($ret)) { + $msg = "Error sending email: ".$ret -> getMessage(); + Log :: error($msg); + return false; + } + return true; + } +} + +# vim: tabstop=2 shiftwidth=2 softtabstop=2 expandtab