git-svn-id: https://192.168.0.254/svn/Proyectos.Incam_PROFIND_Web/trunk@34 3fe1ab16-cfe0-e34b-8c9f-7d8c168d430d
253 lines
7.3 KiB
PHP
253 lines
7.3 KiB
PHP
<?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;
|
|
|
|
|
|
protected $logger;
|
|
|
|
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) {
|
|
$counter = 0;
|
|
if ($this->logging===true) self::log($message);
|
|
if ($this->dryRun===true) $counter = count($message->to);
|
|
else $counter = $this->getMailer()->send($message->message, $failedRecipients);
|
|
if ($this->logging===true) Yii::log(CVarDumper::dumpAsString($this->logger->dump()), CLogger::LEVEL_INFO, 'ext.yii-mail.YiiMail');
|
|
return $counter;
|
|
}
|
|
|
|
/**
|
|
* 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());
|
|
|
|
if ($this->logging===true) {
|
|
$this->logger = new Swift_Plugins_Loggers_ArrayLogger();
|
|
$this->mailer->registerPlugin(new Swift_Plugins_LoggerPlugin($this->logger));
|
|
}
|
|
|
|
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';
|
|
}
|
|
} |