使用phpmailer发送邮件

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

相关推荐