PHPMailer發送郵件

  背景:用戶通過測評系統以後,會生成一份測評報告,可是因爲郵件系統和測評系統是兩份獨立的系統,某天忽然有500封測評報告產生,須要在24小時以內將測評報告發送給測評着。每一個人的測評報告都是惟一的,所以附件內容都不一致。php

  利用PHPMailer批量發送附件內容,只要將用戶的附件和郵箱匹配成功就能夠發送。所以,這個難題就變成了如何在短期內發送500封郵件。html

  再分析一下,就是個人數據庫中有500條記錄,須要一一處理掉,這不就是又成了熟悉的生產者和消費者的事情了嗎?sql

  直接用crontab的定時腳本執行郵件發送的方法就OK了。shell

  代碼設置以下:數據庫

定時腳本,每隔10秒鐘從池子中去消費,逐一發郵件。定時shell腳本以下:服務器

1 #!/bin/sh
2 cd /root/pengjun/vipEmail/PHPMailer/
3 step=10 #間隔的秒數,不能大於60
4 for (( i = 0; i < 60; i=(i+step) )); do
5     $(/usr/local/php/bin/php 'sendEmail.php')
6     sleep $step
7 done
8 exit 0
*/1 * * * * root sh  /root/pengjun/sh/perVipMail.sh

sendEmail.php的代碼以下:ui

<?php


//郵件發送的流程
/**
 * 1. 從數據庫或者文件中讀取郵箱,準備一一發送
 * 2. 讀取附件內容,進行郵件發送
 * 3. 每次發送以後,須要記住是否發送成功、失敗, 發送成功寫入,成功的文件 ,記住發送失敗的郵箱,寫入發送失敗文件
 *
 * 數據格式 array("郵箱"=>"附件")
 */

require('class.phpmailer.php');
include_once "./DB/DBHelper.php";
define('HOST', '192.168.1.188');
define('USER', 'root');
define('PASSWORD', 'root');
define('DBNAME', 'test');

class db extends DBHelper{

    function __construct()
    {
        parent::__construct();
    }

    public function getEmail(){
        $sql = "SELECT name , email from sendEmail where status = 0 limit 1";
        $ret = $this->find($sql);
        return $ret;
    }

    public function updateEmail($email){
         $sql = "UPDATE sendEmail set status = 1 where email = '{$email}' and status = 0";
         return $this->executesql($sql);
    }
}


$dbMail = new db();
$mail = new PHPMailer(); //實例化

$mail->IsSMTP(); // 啓用SMTP

$mail->Host = "smtp.163.com"; //SMTP服務器 163郵箱例子
//$mail->Host = "smtp.126.com"; //SMTP服務器 126郵箱例子
//$mail->Host = "smtp.qq.com"; //SMTP服務器 qq郵箱例子

$mail->Port = 25;  //郵件發送端口
$mail->SMTPAuth   = true;  //啓用SMTP認證

$mail->CharSet  = "UTF-8"; //字符集
$mail->Encoding = "base64"; //編碼方式

$mail->Username = "18025439531@163.com";  //你的郵箱
$mail->Password = "#######";  //你的密碼
$mail->Subject = "【主題】這是郵件的主題"; //郵件標題

$mail->From = "18025439531@163.com";  //發件人地址(也就是你的郵箱)
$mail->FromName = "彭軍";   //發件人姓名


$name_email = $dbMail->getEmail();
/*$name_email = array(
    array("name" => "彭軍" , "email" =>"pengjun@shixiba.com"),
    array("name" => "彭小軍" , "email" =>"1098325951@qq.com"),
    array("name" => "彭f軍" , "email" =>"pengjun132@foxmail.com"),
    array("name" => "張琳" , "email" =>"zhanglin@shixiba.com"),
    array("name" => "邢傑" , "email" =>"xingjie@shixiba.com"),
    );*/
$path = "./sendEmail/";
$template = file_get_contents("./template.html");//定義發送模版
foreach ($name_email as $key => $value) {

    $address = $value['email'];//收件人email
    $mail->AddAddress($address,$value['email']);    //添加收件人1(地址,暱稱)
    $attachment = $value['name']."-".$value['email'];
    $file = $path.$value['email']."-vip.html";
    $mail->AddAttachment($file,$attachment.".html"); // 添加附件,並指定名稱,,記住要添加附件尾椎

    $mail->IsHTML(true); //支持html格式內容
    //$mail->AddEmbeddedImage("test.jpg", "my-attach", "test.jpg"); //設置郵件中的圖片
    $mail->Body = $template; //郵件主體內容

    //發送
    if(!$mail->Send()) {
      echo $attachment."===發送失敗\n";
      file_put_contents("error.txt", $attachment."===發送失敗\n" , FILE_APPEND);
      echo "error: " . $mail->ErrorInfo;
      continue ;
    } else {
        $status = $dbMail->updateEmail($value['email']);
        if ($status) {
            echo $attachment."===發送成功\n";
            file_put_contents("success.txt", $attachment."===發送成功-".date('Y-m-d H:i:s')."\r\n" , FILE_APPEND);
        }else{
            echo $attachment."===發送失敗\n";
            file_put_contents("error.txt", $attachment."===發送失敗".date('Y-m-d H:i:s')."\r\n", FILE_APPEND);
        }
    }
}

?>

郵件發送,會使用到phpmailer這個類,這個類只須要到網上下載便可。http://download.csdn.net/download/qq_23885541/10024847this

相關文章
相關標籤/搜索