ECMall支持SSL连接邮件服务器的配置方法详解


首先,主要是ecmall使用的phpmailer版本太低,不支持加密连接 。

然后,得对相应代码做一定调整 。

1. 覆盖phpmailer

请从附件进行下载:

复制代码 代码如下:

http://cywl.jb51.net:81/201405/yuanma/ecmall_phpmailer_lib(jb51.net).zip

2. 改造lib

涉及到两个lib:mail.lib.php 、mail_quequ.lib.php

在这两个类的构造函数中,增加一个参数传递 。如Mailer

复制代码 代码如下:

function __construct($from, $email, $protocol, $host = , $port = , $user = , $pass = , $SMTPSecure = false)//增加$SMTPSecure
    {
        $this->Mailer($from, $email, $protocol, $host, $port, $user, $pass, $SMTPSecure);
    }

    function Mailer($from, $email, $protocol, $host = , $port = , $user = , $pass = , $SMTPSecure = false)
....

MailQueue中同理 。

3. 封装调用函数

global.lib.php 约300行

function &get_mailer()中增加一行:

复制代码 代码如下:

$secure   = Conf::get(email_ssl);//增加这一行
$mailer = new Mailer($sender, $from, $protocol, $host, $port, $username, $password, $secure);//同时传递参数

4. 调整后台email设置界面,增加相关设置项

后台模板:setting.email_setting.html 增加一个配置项

复制代码 代码如下:

<tr>
    <th class="paddingT15">邮件服务器加密方式:</th>
    <td class="paddingT15 wordSpacing5">
       {html_radios name="email_ssl" options=$email_ssl checked=$setting.email_ssl}
        <label class="field_notice">此功能要求您的php必须支持OpenSSL模块, 如果您要使用此功能,请联系您的空间商确认支持此模块</label>
    </td>
</tr>

同时,修改邮件测试的参数传递

复制代码 代码如下:

<script type="text/javascript">
$(function(){
    $(#send_test_email).click(send_test_email);
});
function send_test_email(){
    var email_type = $(input[name="email_type"]:checked).val();
    var email_ssl = $(input[name="email_ssl"]:checked).val();//增加这一行
    $.ajax({
        type:"POST",
        url:"index.php",
        data:app=setting&act=send_test_email&email_type=+email_type+&email_host=+$("#email_host").val()+&email_port=+$("#email_port").val()+&email_addr=+$("#email_addr").val()+&email_id=+$("#email_id").val()+&email_pass=+$("#email_pass").val()+&email_test=+$("#email_test").val()+&email_ssl=+email_ssl,
        dataType:"json",
        success:function(data){
            if(data.done){
            alert(data.msg);
            }
            else{
                alert(data.msg);
            }
        },
        error: function(){alert({$lang.mail_send_failure});}
    });
}
</script>

然后还需要修改setting.app.php

复制代码 代码如下:

/**
     *    EMAIL 设置
     *
     *    @author    Hyber
     *    @return    void
     */
    function email_setting()
    {
        $model_setting = &af(settings);
        $setting = $model_setting->getAll(); //载入系统设置数据
        if (!IS_POST)
        {
            $this->assign(setting, $setting);
            $this->assign(mail_type, array(
                MAIL_PROTOCOL_SMTP  => Lang::get(smtp),
                MAIL_PROTOCOL_LOCAL => Lang::get(email),
            ));
        //增加
            $this->assign(email_ssl, array(
=> Lang::get(no),
 => SSL,
 => TLS,
            ));
            $this->display(setting.email_setting.html);
        }
        else
        {
            $data[email_type]     = $_POST[email_type];
            $data[email_host]     = $_POST[email_host];
            $data[email_ssl]       = $_POST[email_ssl];//增加
            $data[email_port]     = $_POST[email_port];
            $data[email_addr]     = $_POST[email_addr];
            $data[email_id]       = $_POST[email_id];
            $data[email_pass]     = $_POST[email_pass];
            $data[email_test]     = $_POST[email_test];
            $model_setting->setAll($data);

            $this->show_message(edit_email_setting_successed);
        }
    }

以及测试邮件方法 。

复制代码 代码如下:

function send_test_email()
    {
        if (IS_POST)
        {
            $email_from = Conf::get(site_name);
            $email_type = $_POST[email_type];
            $email_host = $_POST[email_host];
            $email_ssl = $_POST[email_ssl];//增加
            $email_port = $_POST[email_port];
            $email_addr = $_POST[email_addr];
            $email_id   = $_POST[email_id];
            $email_pass = $_POST[email_pass];
            $email_test = $_POST[email_test];
            $email_subject = Lang::get(email_subjuect);
            $email_content = Lang::get(email_content);

            /* 使用mailer类 */
            import(mailer.lib);
            $mailer = new Mailer($email_from, $email_addr, $email_type, $email_host, $email_port, $email_id, $email_pass, $email_ssl);//增加
            $mail_result = $mailer->send($email_test, $email_subject, $email_content, CHARSET, 1);
            if ($mail_result)
            {
                $this->json_result(, mail_send_succeed);
            }
            else
            {
                $this->json_error(mail_send_failure, implode("\n", $mailer->errors));
            }
        }
        else
        {
            $this->show_warning(Hacking Attempt);
        }
    }

tls方式没有测试过 。