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 '邮件已发送'; }