背景:用戶通過測評系統以後,會生成一份測評報告,可是因爲郵件系統和測評系統是兩份獨立的系統,某天忽然有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