ahxxx 2019-06-25
最近做邮件发送的时候尝试了一下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("[email protected]");// 设置邮件抄送人,可以只写地址,上述的设置也可以只写地址
}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("[email protected]", "测试");5.有时需要添加抄送功能,可以这么设置。数组的时候是批量添加抄送,字符串是单个抄送。
if(is_string($addCC)){
$mail->addCC("[email protected]");// 设置邮件抄送人,可以只写地址,上述的设置也可以只写地址
}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 '邮件已发送';
}