最近做郵件傳送的時候嘗試了一下phpmailer,但是在用的過程中還是遇到一些問題,在這裡記一下。做的過程中主要遇到這幾個問題。
1.在做常規測試的時候,發現郵件傳送特別慢。這裡主要找到是這句造成的:
$this->smtp_conn = @stream_socket_client( $host . ":" . $port, $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $socket_context );
遇到這個問題,需要將$SMTPDebug設定成2。預設設定是0什麼也不處理;
2.在郵件傳送中需要新增抄送人。可以這麼設定:
if(is_string($addCC)){
$mail->addCC("xxx@qq.com");// 設定郵件抄送人,可以只寫地址,上述的設定也可以只寫地址
}else if(is_array($addCC)){
foreach ($addCC as $k=>$v){
$mail->addCC($v);
}
}
3.新增附件
if($is_attachment){
$mail->AddAttachment($attachment_add); //可以新增附件
}
4.新版有時候還會報
MAIL FROM command failed: 501 mail from address must be same as authorization user
這個錯誤;這裡主要是沒有設定來源:$mail->setFrom("xxx@qq.com", "測試");
5.有時需要新增抄送功能,可以這麼設定。陣列的時候是批量新增抄送,字串是單個抄送。
if(is_string($addCC)){
$mail->addCC("wangqian@jiguo.com");// 設定郵件抄送人,可以只寫地址,上述的設定也可以只寫地址
}else if(is_array($addCC)){
foreach ($addCC as $k=>$v){
$mail->addCC($v);
}
}
最後附上一個簡單的實現函式
/**
* $username 使用者名稱
* $password 密碼
* $setFromusername 傳送人姓名
* $send_mail 需要傳送的郵件地址
* $addCC 需要抄送的郵件地址
* $title 郵件標題
* $content 郵件內容
* $is_attachment 是都需要附件
* $attachment_add 附件地址
*/
function send($username, $password, $setFromusername,$send_mail, $addCC,$title,$content="",$is_attachment=0, $attachment_add=""){
$mail = new PHPMailer();
if(is_string($send_mail)){
$send_mail[] = $send_mail;
}
foreach ($send_mail as $k=>$v){
$mail->IsSMTP();
$mail->CharSet =`UTF-8`; //設定郵件的字元編碼,這很重要,不然中文亂碼
$mail->SMTPAuth = true; //開啟認證
$mail->Port = 465;
$mail->Host = "smtp.exmail.qq.com";
$mail->Username = $username;
$mail->Password = $password;
$mail->SMTPSecure = `ssl`;
$mail->setFrom($username, $setFromusername);
$to = $v;
$mail->AddAddress($to);
if(is_string($addCC)){
$mail->addCC($addCC);// 設定郵件抄送人,可以只寫地址,上述的設定也可以只寫地址
}else if(is_array($addCC)){
foreach ($addCC as $k=>$v){
$mail->addCC($v);
}
}
$mail->Subject = $title;
$mail->Body = $content ? $content : $title;
$mail->AltBody = $content ? $content : $title;; //當郵件不支援html時備用顯示,可以省略
$mail->WordWrap = 80; // 設定每行字串的長度
if($is_attachment){
$mail->AddAttachment($attachment_add); //可以新增附件
}
$mail->IsHTML(true);
$mail->Send();
}
echo `郵件已傳送`;
}