使用PHPMailer实现可视化邮件群发器

By | 2014/09/22

一.平台与工具

1.Ubuntu  14.04 LTS

2.Apache/2.4.7(Ubuntu)

3.PHP 5-5-9 下载页面  版本最好要>5.2.0,要用到json_encode()函数来编码json数据

4.jQuery 1.11.1 下载页面 javascript的一个函数库,文档出色

5.Bootstrap 3.2.0  下载页面  主要用到它的css库,几乎每个主要标签的样式都有好几种风格,美工的福音:-)

6.PHPMailer 下载页面  PHP的一个扩展库,用于更安全和容易的收发送邮件,这次用到的文件有class.phpmailer.php和class.smtp.php

二.实现思路

image

三.实现要点

1.将常用的或关键信息单独放在配置文件中
将必要的信息用php文件来保存,当需要的时候使用require或include包含进来即可(关于require和include的区别,可以看http://developer.51cto.com/art/200909/153687.htm
发件邮箱可以使用二维数组来存储,易于以后扩展及更改,如
[code lang=”PHP”]
$address1 = array(‘mailhost’ => ‘smtp.gmail.com’ ,
‘mailport’ => ‘587’, ‘smtpsecure’ => ‘tls’ , ‘address’
=> ‘xxx@gmail.com’ , ‘pwd’ => ‘xxx’);
$address2 = array(‘mailhost’ => ‘smtp.sina.com’ ,
‘mailport’ => ’25’ ,’smtpsecure’ => ” ,’address’
=> ‘xxx@sina.com’, ‘pwd’ => ‘xxx’);
$address3= array(‘mailhost’ => ‘smtp.163.com’ ,
‘mailport’ => ’25’, ‘smtpsecure’ => ” , ‘address’
=> ‘xxx@163.com’ , ‘pwd’ => ‘xxx’);

$address = array($address1 , $address2 , $address3 );
[/code]
用define声明数据库相关信息
[code lang=”PHP”]
define("DATABASE_HOST",’localhost’);//数据库信息常量
define("DATABASE_USER","root");
define("DATABASE_PWD","xxxx");
define("DATABASE_NAME","xxxx");
define("TABLE_ONE","xxxx");
define("TABLE_TWO","xxxx");
[/code]

2.异步请求的发送
使用jQuery的ajax对象来实现异步请求,ajax对象的更多参数使用http://api.jquery.com/jquery.ajax/
因为需要php动态的更改查询字符串,以下代码写在php里,用echo输出
[code lang=”PHP”]
echo <<<EOF
var interval = function(){
sent_times++; /*请求发送次数自赠1,默认为0*/
var rand_mail = sent_times % {$mail_count}; /*确定此次请求FROM邮箱的序号*/
var count_per = {$count_per}; /*每次发送邮件的数量*/
var request = $.ajax({
type:GET,  /*要用到查询字符串,故用GET*/
/*rand_mail:哪个邮箱进行发送,count_per:每次请求发送的邮件数*/
url:’send_index.php?send_account=’ + rand_mail + ‘&count_per=’ + count_per ,
async:true,  /*默认为true,表示异步发送,若接下来的操作需要
用到请求返回的数据,则使用false*/
success:function(msg){
if(msg == ‘CONN_FAIL’){
alert(‘sorry,database connect failed!’);
}
else if(msg == ‘QUERY_NONE’){
alert(‘sorry,database hava no record!’);
}
else{
/*解析返回的JSON字符串 并用prepend()动态添加到table顶部*/
var obj = $.parseJSON(msg);
for(var i =0;i<obj.length;i++){
$(".table").prepend("<tr><td>" + obj[i].mail_from +"</td>
<td>" + obj[i].mail_to +
"</td><td><button onclick=’javascript:void(0);’
class=’btn btn-primary’>" + obj[i].mail_status + "</button></td></tr>");
}}
});
});
EOF;
[/code]

3.邮件发送
注意PHP全局变量的作用域不包括函数,如要在函数内部使用全局变量,方法一:传参,方法二,在函数内的变量前使用global修饰或使用$GLOBALS[‘变量名’]进行关联,此处使用方法一
[code lang=”PHP”]
function sendMail($mailhost,$mailport,$smtpsecure,$addr,
$pwd,$to,$firstname,$mysqli,$table,$subject) {
/*检验To:mail有效性,减少发送至无效邮箱进入黑名单的风险*/
if(!filter_var($to,FILTER_VALIDATE_EMAIL)){
/*将无效电邮对应数据库记录中的isvalid字段置为0*/
$sql = "UPDATE $table SET isvalid = 0 where address = ‘$to’";
$mysqli->query($sql);
return;
}
$mail = new PHPMailer(); /*实例化PHPMailer对象*/
$mail->IsSMTP(); /*使用SMTP协议进行发送*/
$mail->CharSet="UTF-8"; /*字符集*/
$mail->Encoding = "base64"; /*字符编码*/
$mail->SMTPSecure = $smtpsecure;
$mail->Host = $mailhost; /*SMTP服务器*/
$mail->Port = $mailport; /*SMTP端口*/
//$mail->SMTPDebug = 1; /*SMTP调试模式1*/
$mail->Username = $addr; /*用户名,一般填发件箱*/
$mail->Password = $pwd; /*邮箱密码*/
$mail->SMTPAuth = true; /*SMTP验证开启*/
$mail->FromName = "Young"; /*发件人姓名,可以自定义*/
$mail->From = $addr; /*添加发送邮箱*/
$mail->AddAddress($to); /*添加接受邮箱*/
$mail->IsHTML(true); /**/
/*若Firstname存在,将第一个字母设为大写*/
if(!empty($firstname)) {$firstname = ucfirst($firstname);}
/*若Firstname为空,统一设为’Hi’*/
$mail->Subject = (empty($firstname)) ? "Hi,{$subject}" : "{$firstname},{$subject}";
$mailcontent = <<<EOF
<div>
<p>Hello {$fname},</p>
<p>this is a test.
</p>
</div>
EOF;
$mail->Body = $mailcontent;
if(!$mail->Send()){
/*将此次的FROM,TO,STATUS存入一维数组并push到二维数组*/
$arr = array(‘mail_from’=>"$addr",’mail_to’=>"$to",’mail_status’=>’Failed’);
/*二维数组保存发送情况,并在所有邮件发送完之后使用
json_encode()编码为JSON字符串反馈到前台*/
array_push($GLOBALS[‘responseArray’],$arr);
}
else {
$arr = array("mail_from" => "$addr","mail_to" => "$to","mail_status" => "Success");
array_push($GLOBALS[‘responseArray’],$arr);
/*将电邮对应数据库记录中的sentcount字段自增1*/
$sql = "UPDATE $table SET sentcount = sentcount + 1 where address = ‘$to’";
$mysqli->query($sql);
}
}
[/code]

4.定时发送请求
定时发送使用的是javascript自带的setInterval()方法(它与setTimeout()的差别在于如果没有clearInterval()来停止或关闭浏览器,它的函数体一直周期性运行下去,而setTimeout则运行一次)
前台有两个按钮,id分别为’start’,’pause’,表示开始发送请求和暂停发送请求
[code lang=”PHP”]
$(‘#start’).click(function(){
$(‘#pause’).css(‘color’,’#FFFFFF’);
$(‘#start’).css(‘color’,’#428BCA’);
alert(‘Send start!’);
interval(); /*点击后立即发送请求,因为setInterval()需要在时间间隔到了后才运行*/
clearIntervalFun = setInterval(interval,{$rand_time}); /*设置随机间隔来发送请求*/
});

$(‘#pause’).click(function() {
$(‘#start’).css(‘color’,’#FFFFFF’);
$(‘#pause’).css(‘color’,’#428BCA’);
alert(‘Send pause!’);
clearInterval(clearIntervalFun); /*取消发送请求*/
});
[/code]

四.实现效果
xg

One thought on “使用PHPMailer实现可视化邮件群发器

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据