X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=classes%2Fplmailer.php;h=e3e348d27c6815cab2474b390d82180021a87f75;hb=0d40ddec57550773766a877a250d60dd8dd3052a;hp=b65d257fea2c294610d249640bd674a1e2869f4f;hpb=5b21237dd71df96849421c33d87298f15709d0d9;p=platal.git diff --git a/classes/plmailer.php b/classes/plmailer.php index b65d257..e3e348d 100644 --- a/classes/plmailer.php +++ b/classes/plmailer.php @@ -1,6 +1,6 @@ template_dir = $globals->spoolroot . "/templates/"; $this->compile_dir = $globals->spoolroot . "/spool/mails_c/"; $this->config_dir = $globals->spoolroot . "/configs/"; - + array_unshift($this->plugins_dir, $globals->spoolroot."/plugins/"); $this->register_outputfilter(Array($this, 'mail_format')); $this->register_function('from', Array($this, 'setFrom')); @@ -47,6 +47,7 @@ class PlMail extends Smarty $this->register_function('bcc', Array($this, 'addBcc')); $this->register_function('subject', Array($this, 'setSubject')); $this->register_function('add_header', Array($this, 'addHeader')); + $this->assign_by_ref('globals', $globals); } public static function &get(&$mailer, $tpl) @@ -63,13 +64,16 @@ class PlMail extends Smarty { $this->assign('mail_part', $version); $text = $this->fetch($this->tpl); + if ($version == 'text') { + return wordwrap($text, 78); + } return $text; } /** used to remove the empty lines due to {from ...}, {to ...} ... functions */ static public function mail_format($output, &$smarty) { - return wordwrap("\n".trim($output)."\n",75); + return "\n".trim($output)."\n"; } static protected function format_addr(&$params) @@ -120,7 +124,7 @@ class PlMail extends Smarty } /** template function : subject. - * {subject text=...} + * {subject text=...} */ public function setSubject($params, &$smarty) { @@ -159,11 +163,19 @@ class PlMailer extends Mail_Mime { } } + static private function formatUser(PlUser $user) + { + return '"' . $user->fullName() . '" <' . $user->bestEmail() . '>'; + } + /** * converts all : Foo Bar Baz into "Foo Bar Baz" which is RFC compliant */ private function correct_emails($email) { + if ($email instanceof PlUser) { + $email = self::formatUser($email); + } return preg_replace('!(^|, *)([^<"]+?) *(<[^>]*>)!u', '\1"\2" \3', $email); } @@ -192,6 +204,20 @@ class PlMailer extends Mail_Mime { return parent::setFrom($this->correct_emails($email)); } + static function encodeQP($char) + { + return sprintf('=%02X', ord($char)); + } + + public function setSubject($subject) + { + if (!preg_match('/^[\x20-\x7e]*$/', $subject)) { + $subject = '=?UTF-8?Q?' . preg_replace('/[^\x21-\x3C\x3e-\x7e]/e', 'PlMailer::encodeQP("\0")', $subject) + . '?='; + } + return parent::setSubject($subject); + } + public function addHeader($hdr,$val) { switch($hdr) { @@ -231,7 +257,7 @@ class PlMailer extends Mail_Mime { $this->page->assign($var, $value); } } - + public function assign_by_ref($var, &$value) { if (!is_null($this->page)) { @@ -245,7 +271,7 @@ class PlMailer extends Mail_Mime { $this->page->register_modifier($var, $callback); } } - + public function register_function($var, $callback) { if (!is_null($this->page)) { @@ -257,12 +283,15 @@ class PlMailer extends Mail_Mime { { $this->wiki = $wiki; } - + private function processPage($with_html = true) { - $level = error_reporting(0); if (!is_null($this->page)) { - $level = error_reporting(0); + global $globals; + if (!($globals->debug & DEBUG_SMARTY)) { + $level = error_reporting(0); + } + $this->page->assign_by_ref('globals', $globals); $this->page->run('head'); // process page headers $this->wiki = trim($this->page->run('wiki')); // get wiki if (!$this->wiki) { @@ -274,22 +303,30 @@ class PlMailer extends Mail_Mime { } } } - error_reporting($level); + if (!($globals->debug & DEBUG_SMARTY)) { + error_reporting($level); + } } if ($this->wiki) { - $this->setTxtBody(MiniWiki::WikiToText($this->wiki, true, 0, 78)); + $this->setTxtBody(MiniWiki::WikiToText($this->wiki, false, 0, 78)); if ($with_html) { - $this->setHtmlBody(MiniWiki::WikiToHtml($this->wiki, true)); + $this->setHtmlBody('' . MiniWiki::WikiToHtml($this->wiki, true) . ''); } } } + public function sendTo(PlUser &$user) + { + $this->addTo($user); + $this->assign_by_ref('user', $user); + return $this->send($user->isEmailFormatHtml()); + } + public function send($with_html = true) { $this->processPage($with_html); - if (S::v('forlife')) { - global $globals; - $this->addHeader('X-Org-Mail', S::v('forlife') . '@' . $globals->mail->domain); + if (S::user()) { + $this->addHeader('X-Org-Mail', S::user()->forlifeEmail()); } $addrs = Array(); foreach(Array('To', 'Cc', 'Bcc') as $hdr) { @@ -304,12 +341,24 @@ class PlMailer extends Mail_Mime { if(empty($addrs)) { return false; } - + $dests = Array(); foreach($addrs as $a) { $dests[] = "{$a->mailbox}@{$a->host}"; } - + + // Support for "catch-all" mail address : all emails are sent to + // admin_email instead of actual recipients + global $globals; + if($globals->catchmail) { + require_once 'Mail/RFC822.php'; + if(@Mail_RFC822::isValidInetAddress($globals->admin_email)){ + $dests = array($globals->admin_email); + }else if(@Mail_RFC822::isValidInetAddress($globals->core->admin_email)){ + $dests = array($globals->core->admin_email); + } + } + // very important to do it in THIS order very precisely. $body = $this->get(array('text_charset' => $this->charset, 'text_encoding' => '8bit',