时光绘梦集
0
位置:PHP正文

超级用户 2025/03/23 周7

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条评论