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中日期加减法运算实现代码
Dec 08 PHP
PHP基础陷阱题(变量赋值)
Sep 12 PHP
phpmyadmin配置文件现在需要绝密的短密码(blowfish_secret)的2种解决方法
May 07 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
Jun 30 PHP
PHPUnit安装及使用示例
Oct 29 PHP
ThinkPHP模板Volist标签嵌套循环输出多维数组的方法
Mar 23 PHP
Yii CFileCache 获取不到值的原因分析
Feb 08 PHP
thinkPHP5 tablib标签库自定义方法详解
May 10 PHP
php实现用户注册密码的crypt加密
Jun 08 PHP
PHP封装的XML简单操作类完整实例
Nov 13 PHP
Laravel5.4框架使用socialite实现github登录的方法
Mar 20 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
Mar 26 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
利用PHP动态生成VRML网页
2006/10/09 PHP
php is_file()和is_dir()用于遍历目录时用法注意事项
2010/03/02 PHP
php随机输出名人名言的代码
2012/10/07 PHP
解析php类的注册与自动加载
2013/07/05 PHP
WampServer搭建php环境时遇到的问题汇总
2015/07/23 PHP
url 特殊字符 传递参数解决方法
2010/01/01 Javascript
node.js中的fs.utimes方法使用说明
2014/12/15 Javascript
jQuery实现延迟跳转的方法
2015/06/05 Javascript
jQuery+AJAX实现无刷新下拉加载更多
2015/07/03 Javascript
js实现的简单radio背景颜色选择器代码
2015/08/18 Javascript
javascript实现延时显示提示框特效代码
2016/04/27 Javascript
新入门node.js必须要知道的概念(必看篇)
2016/08/10 Javascript
详解使用vue-router进行页面切换时滚动条位置与滚动监听事件
2017/03/08 Javascript
JavaScript实现前端实时搜索功能
2020/03/26 Javascript
vue移动端路由切换实例分析
2018/05/14 Javascript
jQuery动态移除与增加onclick属性的方法详解
2018/06/07 jQuery
微信小程序踩坑记录之解决tabBar.list[3].selectedIconPath大小超过40kb
2018/07/04 Javascript
vue 录制视频并压缩视频文件的方法
2018/07/27 Javascript
angular将html代码输出为内容的实例
2018/09/30 Javascript
Vue的Options用法说明
2020/08/14 Javascript
微信小程序实现点赞业务
2021/02/10 Javascript
python代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍
2016/09/21 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
2019/10/14 Python
关于多元线性回归分析——Python&amp;SPSS
2020/02/24 Python
在keras中实现查看其训练loss值
2020/06/16 Python
详解Python中string模块除去Str还剩下什么
2020/11/30 Python
借助HTML5 Canvas API制作一个简单的猜字游戏
2016/03/25 HTML / CSS
西班牙多品牌鞋店连锁店:Krack
2018/11/30 全球购物
ETO男装官方网店:ETO Jeans
2019/02/28 全球购物
Yahoo的PHP面试题
2014/05/26 面试题
浙大网新C/C++面试解惑
2015/05/27 面试题
优秀社区干部事迹材料
2014/02/03 职场文书
人民调解员培训方案
2014/06/05 职场文书
医院领导班子查摆问题对照检查材料思想汇报
2014/10/08 职场文书
小班上学期个人总结
2015/02/12 职场文书
Python实现Matplotlib,Seaborn动态数据图
2022/05/06 Python