折腾emlog5.3.1邮件插件
我的站点用的是老版本的emlog5.3.1,已经没法从官方下载到插件了
所以找了deepseek,给我全网找我5.3.1版本的邮件插件
我下载了kl-sendmail-heighten,然后就开始了折腾修复之旅...
修复:
1. 后台设置保存失败的问题
2. 邮件发送失败:查了一下是因为我使用SSL的465端口进行发送,但是插件代码里面的$isSSL入参是写死的false,我直接通过判断端口是465就走SSL。
3. SMTP协议修复:
3.1. 原PHPMailer.php文件中SendMaill.socketRead只fgets读一行,未处理SMTP多行响应
3.2. SendMaill全部命令/MIME用PHP_EOL,Linux上PHP_EOL=\n(仅LF)。SMTP要求CRLF(\r\n),阿里严格不认\n,导致不回包,结果就是fgets 30s超时
4. 连续发送邮件无效:
4.1. 一开始我是点击了几次发送测试邮件,只收到一条,怀疑是阿里对重复内容有限流之类的,后来手动测试提交了几条游客评论,还是没发送成功。
4.2. 求助了WorkBuddy后,发现是原PHPMailer.php文件中SendMaill.sendMail()在构造邮件头时,代码里 Date: 头被注释掉、且没有 Message-ID 、MIME boundary 还是写死的常量——三样全缺,相同邮件在阿里眼里「长得一模一样」,于是被去重。
4.3. WorkBuddy改了什么
PHPMailer.php —— sendMail() 构造邮件头时,原先被注释的 Date: 头已补回,并新增每封邮件唯一的 Message-ID 和随机 MIME boundary :
```
// 每封邮件生成唯一 MIME boundary + Message-ID,避免“相同正文被邮件服务商按内容去重静默丢弃”
// 注意:boundary 必须在下面 Content-Type 声明之前生成,否则头部与正文分界符不一致 → 收件端显示“无内容”
$this->mime_boundary = '----=_NextPart_' . md5(uniqid('', true));
$senderEmail = base64_decode($this->user);
$midDomain = '';
if (preg_match('/@(.+)$/', $senderEmail, $m)) {
$midDomain = $m[1];
}
//构建邮件
$mail = 'From:<'.base64_decode($this->user).'>'.PHP_EOL;
$mail = 'From:<'.$senderEmail.'>'.PHP_EOL;
```
每发一封, uniqid() 都不同 → 阿里眼里「每封都不一样」→ 内容去重失效。
1. 抽取几个发送方法中公共的html/css代码,方便后续统一改邮件模板
2. sendMail()删掉echo "邮件发送成功",发送成功不用在网页输出
3. 删除文件头部实际没用到的require
```
require_once(EMLOG_ROOT.'*/class/class.*.php');```
后续计划:
⬜ 将邮件发送改为异步队列
⬜ 完善后台的“邮件设置”页面
发表评论