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邮箱当垃圾邮件拦截了,后来增加了这一项才可以。
本文有2条批注
之前用纯ipv6服务器发送邮件失败,应该是因为目前大部分服务都是优先支持ipv4的,这一点需要注意。
php禁用fwrite和fopen函数,会导致phpmailer不能发送邮件,不知道为什么。