X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=classes%2Fplmailer.php;h=e928a0a56b56006106277a67fa8f497f5cbf4da6;hb=7446ea512d015e4b6b07ed378bed4bb9fd5418ba;hp=2106d5024b91098f057d2d2c9523ea74f2fcb4c9;hpb=2295525912c58294f2df275051c228de14adff80;p=platal.git diff --git a/classes/plmailer.php b/classes/plmailer.php index 2106d50..e928a0a 100644 --- a/classes/plmailer.php +++ b/classes/plmailer.php @@ -1,6 +1,6 @@ assign_by_ref('globals', $globals); } - public static function &get(&$mailer, $tpl) + public static function &get($mailer, $tpl) { static $plmail; if (!isset($plmail) || $plmail->tpl != $tpl) { @@ -71,7 +71,7 @@ class PlMail extends Smarty } /** used to remove the empty lines due to {from ...}, {to ...} ... functions */ - static public function mail_format($output, &$smarty) + static public function mail_format($output, $smarty) { return "\n".trim($output)."\n"; } @@ -91,7 +91,7 @@ class PlMail extends Smarty * {from full=...} for an already formatted address * {from addr=... [text=...]} else */ - public function setFrom($params, &$smarty) + public function setFrom($params, $smarty) { $smarty->mailer->setFrom(PlMail::format_addr($params)); } @@ -100,7 +100,7 @@ class PlMail extends Smarty * {to full=...} for an already formatted address * {to addr=... [text=...]} else */ - public function addTo($params, &$smarty) + public function addTo($params, $smarty) { $smarty->mailer->addTo(PlMail::format_addr($params)); } @@ -109,7 +109,7 @@ class PlMail extends Smarty * {cc full=...} for an already formatted address * {cc addr=... [text=...]} else */ - public function addCc($params, &$smarty) + public function addCc($params, $smarty) { $smarty->mailer->addCc(PlMail::format_addr($params)); } @@ -118,7 +118,7 @@ class PlMail extends Smarty * {bcc full=...} for an already formatted address * {bcc addr=... [text=...]} else */ - public function addBcc($params, &$smarty) + public function addBcc($params, $smarty) { $smarty->mailer->addBcc(PlMail::format_addr($params)); } @@ -126,7 +126,7 @@ class PlMail extends Smarty /** template function : subject. * {subject text=...} */ - public function setSubject($params, &$smarty) + public function setSubject($params, $smarty) { $smarty->mailer->setSubject($params['text']); } @@ -134,7 +134,7 @@ class PlMail extends Smarty /** template function : add_header. * {add_header name=... value=...} */ - public function addHeader($params, &$smarty) + public function addHeader($params, $smarty) { $smarty->mailer->addHeader($params['name'], $params['value']); } @@ -163,12 +163,24 @@ 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) { - return preg_replace('!(^|, *)([^<"]+?) *(<[^>]*>)!u', '\1"\2" \3', $email); + if ($email instanceof PlUser) { + $email = self::formatUser($email); + } + $email = preg_replace('!(^|, *)([^<"]+?) *(<[^>]*>)!u', + '\1 "\2" \3', $email); + return preg_replace('/"([^<]+)"/e', + '"\\"" . PlMailer::encodeStringQP("\1") . "\\""', + $email); } public function addTo($email) @@ -181,6 +193,12 @@ class PlMailer extends Mail_Mime { } } + public function setTo($email) + { + $email = $this->correct_emails($email); + $this->_headers['To'] = $email; + } + public function addCc($email) { return parent::addCc($this->correct_emails($email)); @@ -196,6 +214,26 @@ class PlMailer extends Mail_Mime { return parent::setFrom($this->correct_emails($email)); } + static function encodeStringQP($string) + { + if (!preg_match('/^[\x20-\x7e]*$/', $string)) { + $string = '=?UTF-8?Q?' . preg_replace('/[^\x21-\x3C\x3e\x40-\x7e]/e', 'PlMailer::encodeQP("\0")', $string) + . '?='; + } + return $string; + } + + + static function encodeQP($char) + { + return sprintf('=%02X', ord($char)); + } + + public function setSubject($subject) + { + return parent::setSubject(self::encodeStringQP($subject)); + } + public function addHeader($hdr,$val) { switch($hdr) { @@ -223,7 +261,7 @@ class PlMailer extends Mail_Mime { } } - public function addUploadAttachment(PlUpload &$upload, $name) + public function addUploadAttachment(PlUpload $upload, $name) { $encoding = $upload->isType('text') ? 'quoted-printable' : 'base64'; $this->addAttachment($upload->getContents(), $upload->contentType(), $name, false, $encoding); @@ -269,6 +307,7 @@ class PlMailer extends Mail_Mime { 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) { @@ -292,16 +331,22 @@ class PlMailer extends Mail_Mime { } } + public function sendTo(PlUser $user) + { + $this->setTo($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) { - if(isset($this->_headers[$hdr])) { + foreach (Array('To', 'Cc', 'Bcc') as $hdr) { + if (isset($this->_headers[$hdr])) { require_once 'Mail/RFC822.php'; $parsed = @Mail_RFC822::parseAddressList($this->_headers[$hdr]); if (is_array($parsed)) { @@ -309,15 +354,26 @@ class PlMailer extends Mail_Mime { } } } - if(empty($addrs)) { + if (empty($addrs)) { return false; } $dests = Array(); - foreach($addrs as $a) { + foreach ($addrs as $a) { $dests[] = "{$a->mailbox}@{$a->host}"; } + // Support for a "catch-all" email address, to be used by developers. + // This mode can only be activated when the working copy is in restricted + // mode, to ensure that production plat/al copies are never affected. + global $globals; + if ($globals->email_catchall && $globals->core->restricted_platal) { + require_once 'Mail/RFC822.php'; + if (@Mail_RFC822::isValidInetAddress($globals->email_catchall)) { + $dests = array($globals->email_catchall); + } + } + // very important to do it in THIS order very precisely. $body = $this->get(array('text_charset' => $this->charset, 'text_encoding' => '8bit',