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


Posted in PHP onMay 19, 2014

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

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

1. 覆盖phpmailer

请从附件进行下载:

http://cywl.3water.com:81/201405/yuanma/ecmall_phpmailer_lib(3water.com).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方式没有测试过。

PHP 相关文章推荐
无数据库的详细域名查询程序PHP版(3)
Oct 09 PHP
社区(php&amp;&amp;mysql)四
Oct 09 PHP
推荐一篇入门级的Class文章
Mar 19 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
Jun 26 PHP
php使用多个进程同时控制文件读写示例
Feb 28 PHP
PHP实现定时执行任务的方法
Oct 05 PHP
PHP strcmp()和strcasecmp()的区别实例
Nov 05 PHP
ThinkPHP简单使用memcache缓存的方法
Nov 15 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
Feb 11 PHP
PHP堆栈调试操作简单示例
Jun 15 PHP
phpmyadmin在宝塔面板里进不去的解决方案
Jul 06 PHP
PHP中国际化的字符串排序和比较对象详解
Aug 23 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
May 19 #PHP
php开启openssl的方法
May 15 #PHP
PHP整数取余返回负数的相关解决方法
May 15 #PHP
PHP取余函数介绍MOD(x,y)与x%y
May 15 #PHP
php实例分享之通过递归实现删除目录下的所有文件详解
May 15 #PHP
php实例分享之二维数组排序
May 15 #PHP
php表单请求获得数据求和示例
May 15 #PHP
You might like
Yii2实现中国省市区三级联动实例
2017/02/08 PHP
PHP自动载入类文件函数__autoload的使用方法
2019/03/25 PHP
常见的5个PHP编码小陋习以及优化实例讲解
2021/02/27 PHP
javascript 页面只自动刷新一次
2009/07/10 Javascript
jquery里的each使用方法详解
2010/12/22 Javascript
JavaScript获取鼠标移动时的坐标(兼容IE8、chome谷歌、Firefox)
2014/09/13 Javascript
jquery uploadify 在FF下无效的解决办法
2014/09/26 Javascript
JS组件Bootstrap实现下拉菜单效果代码
2016/04/26 Javascript
老司机带你解读jQuery插件开发流程
2016/05/16 Javascript
使用JavaScript判断手机浏览器是横屏还是竖屏问题
2016/08/02 Javascript
js eval函数使用,js对象和字符串互转实例
2017/03/06 Javascript
微信小程序 动态传参实例详解
2017/04/27 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
2017/08/24 Javascript
关于Ajax的原理以及代码封装详解
2017/09/08 Javascript
JavaScript指定断点操作实例教程
2018/09/18 Javascript
JS实现点击发送验证码 xx秒后重新发送功能
2019/07/30 Javascript
[01:15:44]首部DOTA2纪录片今日23时全网上映
2014/03/19 DOTA
[32:39]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第一场 11.04
2020/11/04 DOTA
Python实现的检测web服务器健康状况的小程序
2014/09/17 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
2018/03/22 Python
centos6.8安装python3.7无法import _ssl的解决方法
2018/09/17 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
2019/01/09 Python
python 创建一维的0向量实例
2019/12/02 Python
Pytorch保存模型用于测试和用于继续训练的区别详解
2020/01/10 Python
python怎么调用自己的函数
2020/07/01 Python
如何设置Java的运行环境
2013/04/05 面试题
指针和引用有什么区别
2013/01/13 面试题
《蜗牛的奖杯》教后反思
2014/04/24 职场文书
优秀的应届生自荐信
2014/05/23 职场文书
学校法制宣传月活动总结
2014/07/03 职场文书
租车协议书范本2014
2014/11/17 职场文书
廉洁自律承诺书2015
2015/01/22 职场文书
工程部岗位职责
2015/02/10 职场文书
公司员工培训管理制度
2015/08/04 职场文书
解决golang post文件时Content-Type出现的问题
2021/05/02 Golang
配置nginx负载均衡
2022/05/06 Servers