WordPress不能在别人评论后给我发送邮件的解决办法
这是一个非常诡异的问题.
遇到问题后, 我google了一下. 发现有些人遇到了和我类似的问题. 但是他们的问题原因仅仅是服务器不支持php的mail函数, 他们只需要安装wp mail smtp组件就可以发送了.
而我确定我的服务器支持mail函数.
我对于php还是新手, 还不知道怎么在windows上测试php的mail函数. 所以就只能在本地把文件改改, 然后上传到服务器上做发送邮件测试.
WordPress调用的是PHPMailer组件发送邮件, 经过几个小时的调试之后, 我发现问题的原因在于2点:
-
PHPMailer的Sender属性为空. 这个属性为空将直接导致不会发送任何邮件.
-
PHPMail的MailSend方法中是这么调用mail函数的:
$rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
我注意到如果把$this->EncodeHeader($this->SecureHeader($this->Subject))替换成固定的字符串, 并且将Sender属性设置为我的email地址, WordPress就可以给我发送评论邮件了.
关于字符编码的问题我不是很懂, 大概看看这个EncodeHeader函数, 没看懂.
$this->Subject的内容是"[想当摄影师的程序员] Comment: "Symbian S60 V3系统不破解也能提升权限""
如果直接用var_dump($this->EncodeHeader($this->SecureHeader($this->Subject))), 会得到一串加了编码前缀的base64字符串. "=?utf-8?B?W+aDs+W9k+aRhOW9seW4iOeahOeoi+W6j+WRmF0gTmV3IENvbW1lbnQgT24=?= =?utf-8?B?OiBTeW1iaWFuIFM2MCBWM+ezu+e7n+S4jeegtOino+S5n+iDveaPkOWNhw==?= =?utf-8?B?5p2D6ZmQ?="
bin2hex函数可以将任意内容转换成十六进制的字符串.
于是我调用了两次bin2hex方法.
var_dump(bin2hex($this->EncodeHeader($this->SecureHeader($this->Subject))))
var_dump(bin2hex("=?utf-8?B?W+aDs+W9k+aRhOW9seW4iOeahOeoi+W6j+WRmF0gTmV3IENvbW1lbnQgT24=?= =?utf-8?B?OiBTeW1iaWFuIFM2MCBWM+ezu+e7n+S4jeegtOino+S5n+iDveaPkOWNhw==?= =?utf-8?B?5p2D6ZmQ?="))
发现转出来的十六进制码竟然有差别.
3d3f7574662d383f423f572b6144732b57396b2b6152684f573973655734694f6561684f656f692b57366a2b57 526d463067546d563349454e766257316c626e51675432343d3f3d0a203d3f7574662d383f423f4f694254655 731696157467549464d324d4342574d2b657a752b65376e2b53346a656567744f696e6f2b53356e2b6944766 561506b4f574e68773d3d3f3d0a203d3f7574662d383f423f35703244365a6d513f3d
3d3f7574662d383f423f572b6144732b57396b2b6152684f573973655734694f6561684f656f692b57366a2b57 526d463067546d563349454e766257316c626e51675432343d3f3d203d3f7574662d383f423f4f694254655 731696157467549464d324d4342574d2b657a752b65376e2b53346a656567744f696e6f2b53356e2b6944766 561506b4f574e68773d3d3f3d203d3f7574662d383f423f35703244365a6d513f3d
你会看到第一个方法比第二个方法多出两个0a
不知道为什么.
为了不使用PHPMailer的EncodeHeader函数, 我调用了PHP自带的函数. 做了以下修改:
$subject = '=?UTF-8?B? ' . base64_encode($this->Subject) . '?= '; $rt = @mail($to, $subject, $body, $header, $params);
这样我就可以收到邮件了.
关于刚才说的第一个问题, 我也不清楚是怎么回事.
干脆我就直接给Sender属性赋值好了. 将以下两句加到MailSend函数的开头.
$this->Sender = '这里填上自己的email地址 ';
- ← Previous
Symbian S60 V3系统不破解也能提升权限 - Next →
用胶片或者刷墨汁的玻璃能看日全食吗?