php发送邮件
给自己的网站增加了每新增一条评论或者文章,或者文章正文被修改,都会给我设置的邮箱发送一条邮件的功能。因为我目前设置的评论发表后不能被修改,文章可以被修改。
找来找去还是这个简单,就需要引入2个php文件就可以了。
过程总结,用phpmailer发送邮件,
1,下载phpmailer核心文件,我用了两个文件
1个核心文件,PHPMailer.php,必备
1个SMTP.php 发送邮件用
先载入
use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; require __DIR__.'/PHPMailer.php'; require __DIR__.'/SMTP.php';
2,然后编了一个函数,后续可在多处调用
function mails($url,$title,$body){ $mail = new PHPMailer(true); $mail->isSMTP(); $mail->Host = 'smtp服务器地址'; $mail->SMTPAuth = true; $mail->Username = '账号'; $mail->Password = '密码或者授权码(看情况)'; $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; $mail->Port = 465; $mail->setFrom('发件人', '发件人昵称'); $mail->addAddress($url, '用户称呼'); $mail->CharSet = 'UTF-8'; // 设置字符编码为 UTF-8 $mail->isHTML(true); // 设置邮件格式为 HTML $mail->Subject = $title; $mail->Body = $body; $mail->send(); }
3,调用,使用创建子进程的方式,不然要等一会,发送成功才会显示页面。
例子:在发布评论成功后调用
$pid = pcntl_fork(); if($pid<1){ mails("邮件地址",'新增一条评论',"<p>".$mms."</p>); $pid||exit; }
代码解释,创建子进程会返回-1,0,1其中一个,-1失败,1成功,当前在父进程,0当前在子进程。
如果创建失败直接发送邮件,在父进程就啥也不干,子进程执行完毕直接退出。
出错点:
1,我第一次本来直接设置587端口改成了465端口,导致失败。因为我看到QQ邮箱用的465端口。
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; $mail->Port = 465; 或者 $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; $mail->Port = 587;
两个要一起改。
2,本来已经成功一次了,但是每次评论,需要等待一会儿,之前没有这情况,我怀疑是发送邮件导致进程阻塞,就问Ai。
办法是创建子进程,随后修改代码,结果,修改后不发送邮件了。
我怀疑是宝塔禁用了pcntl_fork这个函数,因为我知道宝塔面板默认php禁用的函数就有好多个,就找到php的禁用函数里,果然找到了,删除这个禁用,就成功了。这样发送邮件就是异步的了。
3,刚开始没有设置$mail->CharSet = 'UTF-8';发送测试邮件没事,但是当我的评论中有代码开始时,成了乱码,被126邮箱当垃圾邮件拦截了,后来增加了这一项才可以。