折腾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');
      ```


后续计划:


⬜ 将邮件发送改为异步队列

⬜ 完善后台的“邮件设置”页面


发表评论

    微笑 大笑 拽 大哭 奸笑 流汗 喷血 生气 囧 不爽 晕 示爱 卖萌 吃惊 迷离 爱你 吓死了 呵呵

    验证码