首先,主要是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方式沒有測試過。