使用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
发件邮箱可以使用二维数组来存储,易于以后扩展及更改,如

    $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 );

用define声明数据库相关信息

define("DATABASE_HOST",'localhost');//数据库信息常量		
define("DATABASE_USER","root");
define("DATABASE_PWD","xxxx");
define("DATABASE_NAME","xxxx");
define("TABLE_ONE","xxxx");		
define("TABLE_TWO","xxxx");

2.异步请求的发送
使用jQuery的ajax对象来实现异步请求,ajax对象的更多参数使用http://api.jquery.com/jquery.ajax/
因为需要php动态的更改查询字符串,以下代码写在php里,用echo输出

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;

3.邮件发送
注意PHP全局变量的作用域不包括函数,如要在函数内部使用全局变量,方法一:传参,方法二,在函数内的变量前使用global修饰或使用$GLOBALS[‘变量名’]进行关联,此处使用方法一

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);
    }
}

4.定时发送请求
定时发送使用的是javascript自带的setInterval()方法(它与setTimeout()的差别在于如果没有clearInterval()来停止或关闭浏览器,它的函数体一直周期性运行下去,而setTimeout则运行一次)
前台有两个按钮,id分别为’start’,’pause’,表示开始发送请求和暂停发送请求

$('#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);	    /*取消发送请求*/
 });

四.实现效果
xg

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

发表评论

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.