最近做一个项目需要添加发邮件的功能,一次我收集了一些邮件配置的功能。并且实现将Yii移植到BAE上时实现同样的功能,向某个邮箱发送一份BAE的消息邮件,分享给大家,希望能给大家带来帮组。


本地Yii实现发邮件实例:

步骤一:

下载Yii的mailer扩展:

官方扩展链接:http://www.yiiframework.com/extension/mailer/

下载后解压放置在protected/extensions/下

步骤二:

申请一个邮箱作为发件箱,以下我们以163邮箱为例

步骤三:

public function actionMail(){
        $message = 'mail success!!!';
        $mailer = Yii::createComponent('application.extensions.mailer.EMailer');
        $mailer->Host = 'smtp.163.com';
        $mailer->IsSMTP();
        $mailer->SMTPAuth = true;
        $mailer->From = 'XXXXXX@163.com';         //设置发件地址
        $mailer->AddReplyTo('XXXXX@163.com');
        $mailer->AddAddress('XXXXX@qq.com'); //设置收件件地址
        $mailer->FromName = 'XXXXXX';   //这里设置发件人姓名
        $mailer->Username = 'XXXXXXXX@163.com';    //这里输入发件地址的用户名
        $mailer->Password = 'XXXX';    //这里输入发件地址的密码
        $mailer->SMTPDebug = true;   //设置SMTPDebug为true,就可以打开Debug功能,根据提示去修改配置
        $mailer->CharSet = 'UTF-8';
        $mailer->Subject = Yii::t('demo', 'Yii rulez!'); //设置邮件的主题
        $mailer->Body = $message;
        $mailer->Send();
    }

步骤四:

在浏览器中输入http://hostname/index.php?r=site/mail, 查看收件箱看是否收到邮件。如果设置正确一般不会出什么问题。


由于我们需要把应用部署到云端,而云端禁用mail函数,这是我们需要使用BAE给我提供的API来实现邮件服务。我们如果了解百度云定制的Yii框架,我们可以使用email邮箱来接受Yii运行的一些调试信息。这各主要是通过,CEmailLog类来实现这一功能,而百度云的定制框架上也实现了这个类。但需要更改一些东西。

更改/framework/baeconfig目录下的baeconfig.php文件,添加消息队列和收件箱。

'log'=>array(
            'class'=>'CLogRouter',
            'routes'=>array(
                array(
                    'class'=>'CBaeLogRoute',
                    'levels'=>'error, warning,trace',
                ),
                array(
                    'class'=>'CEmailLogRoute',
                    'levels'=>'error, warning',
                    'queueName'=>'XXXXXXXX', //这里是消息队列的名称
                    'emails'=>'XXXXXX@qq.com',//这里是收件箱的名称
                ),
            ),
        ),


下面我贴出BAE的CEmailLog类的实现代码:


<?php
/**
 * CEmailLogRoute class file.
 *
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @link http://www.yiiframework.com/
 * @copyright Copyright &copy; 2008-2011 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */
/**
 * CEmailLogRoute sends selected log messages to email addresses.
 *
 * The target email addresses may be specified via {@link setEmails emails} property.
 * Optionally, you may set the email {@link setSubject subject}, the
 * {@link setSentFrom sentFrom} address and any additional {@link setHeaders headers}.
 *
 * @property array $emails List of destination email addresses.
 * @property string $subject Email subject. Defaults to CEmailLogRoute::DEFAULT_SUBJECT.
 * @property string $sentFrom Send from address of the email.
 * @property array $headers Additional headers to use when sending an email.
 *
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @version $Id: CEmailLogRoute.php 3426 2011-10-25 00:01:09Z alexander.makarow $
 * @package system.logging
 * @since 1.0
 */
class CEmailLogRoute extends CLogRoute
{
    /**
     * @var array list of destination email addresses.
     */
    private $_email=array();
    /**
     * @var string email subject
     */
    private $_subject;
    /**
     * @var string email sent from address
     */
    private $_from;
    /**
     * @var array list of additional headers to use when sending an email.
     */
    private $_headers=array();
    /**
         *the queueName of BCMS
         */
    public $queueName='';
    /**
         *initilize the queueName
         */
    public function __construct($queueName='')
        {
                $this->queueName=$queueName;
        }
    /**
     * Sends log messages to specified email addresses.
     * @param array $logs list of log messages
     */
    protected function processLogs($logs)
    {
        $message='';
        foreach($logs as $log)
            $message.=$this->formatLogMessage($log[0],$log[1],$log[2],$log[3]);
        $message=wordwrap($message,70);
        $subject=$this->getSubject();
        if($subject===null)
            $subject=Yii::t('yii','Application Log');
        if(IS_BAE)
        {
            $this->sendEmail($this->getEmails(),$subject,$message);
        }
        else
        {
            foreach($this->getEmails() as $email)
            $this->sendEmail($email,$subject,$message);
        }
    }
    /**
     * Sends an email.
     * @param string $email single email address
     * @param string $subject email subject
     * @param string $message email content
     */
    protected function sendEmail($email,$subject,$message)
    {
        if(IS_BAE)
        {
             require_once ( "Bcms.class.php" ) ;
                 $bcms = new Bcms();
                     $ret = $bcms->mail ( $this->queueName, $message,json_encode($email)) ;
                if ( false === $ret )
                {
                    Yii::trace("send log to email is failed");
                }
                        else
                        {
                    Yii::trace("send log to email success");
                        }
        }
        else
        {
            $headers=$this->getHeaders();
            if(($from=$this->getSentFrom())!==null)
            $headers[]="From: {$from}";
            mail($email,$subject,$message,implode("\r\n",$headers));
        }
    }
    /**
     * @return array list of destination email addresses
     */
    public function getEmails()
    {
        return $this->_email;
    }
    /**
     * @param mixed $value list of destination email addresses. If the value is
     * a string, it is assumed to be comma-separated email addresses.
     */
    public function setEmails($value)
    {
        if(IS_BAE)
        {
            if(is_array($value))
                            $this->_email=$value;
                    else
                $this->_email=preg_split('/[\s,]+/',$value,-1,PREG_SPLIT_NO_EMPTY);                        
        }
        else  
        { 
            if(is_array($value))
            $this->_email=$value;
            else
            $this->_email=preg_split('/[\s,]+/',$value,-1,PREG_SPLIT_NO_EMPTY);
        } 
    }
    /**
     * @return string email subject. Defaults to CEmailLogRoute::DEFAULT_SUBJECT
     */
    public function getSubject()
    {
        return $this->_subject;
    }
    /**
     * @param string $value email subject.
     */
    public function setSubject($value)
    {
        $this->_subject=$value;
    }
    /**
     * @return string send from address of the email
     */
    public function getSentFrom()
    {
        return $this->_from;
    }
    /**
     * @param string $value send from address of the email
     */
    public function setSentFrom($value)
    {
        $this->_from=$value;
    }
    /**
     * @return array additional headers to use when sending an email.
     * @since 1.1.4
     */
    public function getHeaders()
    {
        return $this->_headers;
    }
    /**
     * @param mixed $value list of additional headers to use when sending an email.
     * If the value is a string, it is assumed to be line break separated headers.
     * @since 1.1.4
     */
    public function setHeaders($value)
    {
        if (is_array($value))
            $this->_headers=$value;
        else
            $this->_headers=preg_split('/\r\n|\n/',$value,-1,PREG_SPLIT_NO_EMPTY);
    }
}

BAE上发送邮件通过bae的云消息API的Mail函数实现的。

public function mail($queueName,$message,$address,$optional=array())


以下是我修改后的Mailer类(仿CEmailLog)

Yii框架怎么整合发邮件模块_百度云


<?php
class Mailer{
    /**
     * @var array list of destination email addresses.
     */
    private $_email=array();
    /**
     * @var string email subject
     */
    private $_subject;
    /**
     * @var string email sent from address
     */
    private $_from;
    /**
     * @var array list of additional headers to use when sending an email.
     */
    private $_headers=array();
    /**
    *the queueName of BCMS
    */
    public $queueName='XXXXXXXXXXXXXXXXXXXXXXXXXXX'; //这里填你的消息队列的名称
    /**
    *initilize the queueName
    */
    public function __construct()
    {
        include_once ( "Bcms.class.php" ) ;
    }
                                                                                                       
    /**
     * Sends an email.
     * @param string $email single email address
     * @param string $subject email subject
     * @param string $message email content
     */
    public function sendEmail($email,$subject,$message)
    {
        if(IS_BAE)
        {
            $log = new Log;
            $bcms = new Bcms();
            $ret = $bcms->mail ( $this->queueName, $message,array($email)) ;
                                                                                                       
            if ( false === $ret )
            {
                $log->fb("send log to email is failed");
                Yii::trace("send log to email is failed");
            }
            else
            {
                $log->fb("send log to email success");
                Yii::trace("send log to email success");
            }
        }
        else
        {
            $headers=$this->getHeaders();
            if(($from=$this->getSentFrom())!==null)
                $headers[]="From: {$from}";
            mail($email,$subject,$message,implode("\r\n",$headers));
        }
    }
                                                                                                       
    /**
     * @return array list of destination email addresses
     */
    public function getEmails()
    {
        return $this->_email;
    }
                                                                                                       
    /**
     * @param mixed $value list of destination email addresses. If the value is
     * a string, it is assumed to be comma-separated email addresses.
     */
    public function setEmails($value)
    {
        if(IS_BAE)
        {
            if(is_array($value))
                $this->_email=$value;
            else
                $this->_email=preg_split('/[\s,]+/',$value,-1,PREG_SPLIT_NO_EMPTY);
        }
        else
        {
            if(is_array($value))
                $this->_email=$value;
            else
                $this->_email=preg_split('/[\s,]+/',$value,-1,PREG_SPLIT_NO_EMPTY);
        }
    }
                                                                                                       
    /**
     * @return string email subject. Defaults to CEmailLogRoute::DEFAULT_SUBJECT
     */
    public function getSubject()
    {
        return $this->_subject;
    }
                                                                                                       
    /**
     * @param string $value email subject.
     */
    public function setSubject($value)
    {
        $this->_subject=$value;
    }
                                                                                                       
    /**
     * @return string send from address of the email
     */
    public function getSentFrom()
    {
        return $this->_from;
    }
                                                                                                       
    /**
     * @param string $value send from address of the email
     */
    public function setSentFrom($value)
    {
        $this->_from=$value;
    }
                                                                                                       
    /**
     * @return array additional headers to use when sending an email.
     * @since 1.1.4
     */
    public function getHeaders()
    {
        return $this->_headers;
    }
                                                                                                       
    /**
     * @param mixed $value list of additional headers to use when sending an email.
     * If the value is a string, it is assumed to be line break separated headers.
     * @since 1.1.4
     */
    public function setHeaders($value)
    {
        if (is_array($value))
            $this->_headers=$value;
        else
            $this->_headers=preg_split('/\r\n|\n/',$value,-1,PREG_SPLIT_NO_EMPTY);
    }
}


步骤二:

实现Mailaction:

public function actionMail(){
        $message = 'Hello World!';
        $mailer = new Mailer;
        $log->fb($mailer);
        $mailer->sendEmail('XXXXXXXXX@qq.com','Yii rulez!',$message);
}

步骤三:

在浏览器中输入http://hostname/index.php?r=site/mail, 查看收件箱是否收到BAE的邮件。

Yii框架怎么整合发邮件模块_YII框架_02