首先,主要是ecmall使用的phpmailer版本太低,不支持加密连接。
然后,得对相应代码做一定调整。
1. 覆盖phpmailer
请从附件进行下载:
http://files.cnblogs.com/x3d/ecmall_phpmailer_lib.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(0 => Lang::get('no'),1 => 'SSL',2 => '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方式没有测试过。