首先,主要是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("
", $mailer->errors));
}
}
else
{
$this->show_warning("Hacking Attempt");
}
}
tls方式没有测试过。