今天早晨在测试插件的时候需要发送邮件,突然发现自己网站的邮件发送服务报错,具体报错内容如下:

object(WP_Error)#7623 (2) { ["errors"]=> array(1) { ["wp_mail_failed"]=> array(1) { [0]=> string(82) "SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting" } } ["error_data"]=> array(1) { ["wp_mail_failed"]=> array(6) { ["to"]=> array(1) { [0]=> string(17) "2220379479@qq.com" } ["subject"]=> string(4) "test" ["message"]=> string(4) "test" ["headers"]=> array(0) { } ["attachments"]=> array(0) { } ["phpmailer_exception_code"]=> int(2) } } }

目前站点所使用得到是阿里云的独享虚拟主机,由于国内虚拟主机大多禁用了 mail() 函数,之前一直使用 WP Mail SMTP 配置wp_mail()函数用SMTP发送邮件的,而且之前一直发送正常。最近两天开始使用我爱水煮鱼 WPJAM Basic 插件的发信设置功能来实现邮件的发送,就想是不是插件的问题,停用了 WPJAM Basic 重新启用 WP Mail SMTP 还是失败,怀疑是不是最近几天测试插件、删减数据表等的原因,停用所有插件,更换主题,恢复数据表,重新配置邮件SMTP服务密码……一点点的排查发现都不是。

无奈只能去网上搜索答案,然而网上的答案都大同小异,没有什么实际的解决方案,只能自己再慢慢想办法了,登录阿里云后台,突然想起来之前修改过PHP的版本,是不是PHP版本的问题?将后台的所有PHP版本切换了一遍一一测试发现都不行,测试的过程中突然想起来之前更换PHP版本的时候把 php.ini 的参数修改了一下,查看 php.ini 参数设置,大哭,瞬间明白了,自己把 fsockopen 函数禁用了,重新启用,再次测试邮件发送设置,一切正常。

最后奉上 fsockopen 的一些知识点以供学习理解:

fsockopen用于打开网络的 Socket 链接。而Socket 是用于建立网络通信连接的一对端口号。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口。

fsockopen语法:

int fsockopen(string hostname, int port, int [errno], string [errstr], int [timeout]);

hostname:主机名称;port:端口号;errno:错误号的接受变量;errstr:错误提示的接受变量;timeout:超时时间。

Socket函数原型:

int socket(int domain, int type, int protocol);

domain:协议域,又称协议族;type:指定Socket类型;protocol:指定协议。