Вход Регистрация
Файл: protected/extensions/yii-mail/YiiMail.php
Строк: 265
<?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===trueself::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 nullSwift_Mailer_RecipientIterator $it null) {
        if (
$this->logging===trueself::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===trueself::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($msgCLogger::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';
    }
}
Онлайн: 0
Реклама