diff options
Diffstat (limited to 'protected/extensions/yii-mail/YiiMail.php')
| -rw-r--r-- | protected/extensions/yii-mail/YiiMail.php | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/protected/extensions/yii-mail/YiiMail.php b/protected/extensions/yii-mail/YiiMail.php new file mode 100644 index 0000000..038a774 --- /dev/null +++ b/protected/extensions/yii-mail/YiiMail.php @@ -0,0 +1,242 @@ +<?php +/** +* YiiMail class file. +* +* @author Jonah Turnquist <poppitypop@gmail.com> +* @link https://code.google.com/p/yii-mail/ +* @package Yii-Mail +*/ + +/** +* YiiMail is an application component used for sending email. +* +* You may configure it as below. Check the public attributes and setter +* methods of this class for more options. +* <pre> +* return array( +* ... +* 'import => array( +* ... +* 'ext.mail.YiiMailMessage', +* ), +* 'components' => array( +* 'mail' => array( +* 'class' => 'ext.yii-mail.YiiMail', +* 'transportType' => 'php', +* 'viewPath' => 'application.views.mail', +* 'logging' => true, +* 'dryRun' => false +* ), +* ... +* ) +* ); +* </pre> +* +* Example usage: +* <pre> +* $message = new YiiMailMessage; +* $message->setBody('Message content here with HTML', 'text/html'); +* $message->subject = 'My Subject'; +* $message->addTo('johnDoe@domain.com'); +* $message->from = Yii::app()->params['adminEmail']; +* Yii::app()->mail->send($message); +* </pre> +*/ +class YiiMail extends CApplicationComponent +{ + /** + * @var bool whether to log messages using Yii::log(). + * Defaults to true. + */ + public $logging = true; + + /** + * @var bool whether to disable actually sending mail. + * Defaults to false. + */ + public $dryRun = false; + + /** + * @var string the delivery type. Can be either 'php' or 'smtp'. When + * using 'php', PHP's {@link mail()} function will be used. + * Defaults to 'php'. + */ + public $transportType = 'php'; + + /** + * @var string the path to the location where mail views are stored. + * Defaults to 'application.views.mail'. + */ + public $viewPath = 'application.views.mail'; + + /** + * @var string options specific to the transport type being used. + * To set options for STMP, set this attribute to an array where the keys + * are the option names and the values are their values. + * Possible options for SMTP are: + * <ul> + * <li>host</li> + * <li>username</li> + * <li>password</li> + * <li>port</li> + * <li>encryption</li> + * <li>timeout</li> + * <li>extensionHandlers</li> + * </ul> + * See the SwiftMailer documentaion for the option meanings. + */ + public $transportOptions; + + /** + * @var mixed Holds the SwiftMailer transport + */ + protected $transport; + + /** + * @var mixed Holds the SwiftMailer mailer + */ + protected $mailer; + + private static $registeredScripts = false; + + /** + * Calls the {@link registerScripts()} method. + */ + public function init() { + $this->registerScripts(); + parent::init(); + } + + /** + * Send a {@link YiiMailMessage} as it would be sent in a mail client. + * + * All recipients (with the exception of Bcc) will be able to see the other + * recipients this message was sent to. + * + * If you need to send to each recipient without disclosing details about the + * other recipients see {@link batchSend()}. + * + * Recipient/sender data will be retreived from the {@link YiiMailMessage} + * object. + * + * The return value is the number of recipients who were accepted for + * delivery. + * + * @param YiiMailMessage $message + * @param array &$failedRecipients, optional + * @return int + * @see batchSend() + */ + public function send(YiiMailMessage $message, &$failedRecipients = null) { + if ($this->logging===true) self::log($message); + if ($this->dryRun===true) return count($message->to); + else return $this->getMailer()->send($message->message, $failedRecipients); + } + + /** + * Send the given {@link YiiMailMessage} to all recipients individually. + * + * This differs from {@link send()} in the way headers are presented to the + * recipient. The only recipient in the "To:" field will be the individual + * recipient it was sent to. + * + * If an iterator is provided, recipients will be read from the iterator + * one-by-one, otherwise recipient data will be retreived from the + * {@link YiiMailMessage} object. + * + * Sender information is always read from the {@link YiiMailMessage} object. + * + * The return value is the number of recipients who were accepted for + * delivery. + * + * @param YiiMailMessage $message + * @param array &$failedRecipients, optional + * @param Swift_Mailer_RecipientIterator $it, optional + * @return int + * @see send() + */ + public function batchSend(YiiMailMessage $message, &$failedRecipients = null, Swift_Mailer_RecipientIterator $it = null) { + if ($this->logging===true) self::log($message); + if ($this->dryRun===true) return count($message->to); + else return $this->getMailer()->batchSend($message->message, $failedRecipients, $it); + } + + /** + * Sends a message in an extremly simple but less extensive way. + * + * @param mixed from address, string or array of the form $address => $name + * @param mixed to address, string or array of the form $address => $name + * @param string subject + * @param string body + */ + public function sendSimple($from, $to, $subject, $body) { + $message = new YiiMailMessage; + $message->setSubject($subject) + ->setFrom($from) + ->setTo($to) + ->setBody($body, 'text/html'); + + if ($this->logging===true) self::log($message); + if ($this->dryRun===true) return count($message->to); + else return $this->getMailer()->send($message); + } + + /** + * Logs a YiiMailMessage in a (hopefully) readable way using Yii::log. + * @return string log message + */ + public static function log(YiiMailMessage $message) { + $msg = 'Sending email to '.implode(', ', array_keys($message->to))."\n". + implode('', $message->headers->getAll())."\n". + $message->body + ; + Yii::log($msg, CLogger::LEVEL_INFO, 'ext.yii-mail.YiiMail'); // TODO: attempt to determine alias/category at runtime + return $msg; + } + + /** + * Gets the SwiftMailer transport class instance, initializing it if it has + * not been created yet + * @return mixed {@link Swift_MailTransport} or {@link Swift_SmtpTransport} + */ + public function getTransport() { + if ($this->transport===null) { + switch ($this->transportType) { + case 'php': + $this->transport = Swift_MailTransport::newInstance(); + if ($this->transportOptions !== null) + $this->transport->setExtraParams($this->transportOptions); + break; + case 'smtp': + $this->transport = Swift_SmtpTransport::newInstance(); + foreach ($this->transportOptions as $option => $value) + $this->transport->{'set'.ucfirst($option)}($value); // sets option with the setter method + break; + } + } + + return $this->transport; + } + + /** + * Gets the SwiftMailer {@link Swift_Mailer} class instance + * @return Swift_Mailer + */ + public function getMailer() { + if ($this->mailer===null) + $this->mailer = Swift_Mailer::newInstance($this->getTransport()); + + return $this->mailer; + } + + /** + * Registers swiftMailer autoloader and includes the required files + */ + public function registerScripts() { + if (self::$registeredScripts) return; + self::$registeredScripts = true; + require dirname(__FILE__).'/vendors/swiftMailer/classes/Swift.php'; + Yii::registerAutoloader(array('Swift','autoload')); + require dirname(__FILE__).'/vendors/swiftMailer/swift_init.php'; + } +}
\ No newline at end of file |
