WordPress的邮件发送问题

在刚把博客搬到Linode的时候自己也遇上了WordPress的邮件发送问题,查了下资料,发现大部分人都遇上了这个问题,因为与自己的主机商有关系。解决方案有多种不同的版本。

主要原因有:
1.主机不支持mai()函数
2.PHP的fsockopen()被禁用
因为不支持mail()函数,一般都使用给WordPress装对应的smtp插件(eg: wp-mail-smtp插件)来实现邮件发送功能,从而又遇上了fsockopen的问题。
使用wp-mail-smtp发送测试邮件给出的错误提示为: SMTP -> ERROR: Failed to connect to server:()
一般搜到的方案都是这样:

找到wp-includes/class.smtp.php,用pfsockopen()函数直接替换掉 fsockopen() :
$this->smtp_conn = @fsockopen   —> $this->smtp_conn = @pfsockopen
不知道是不是版本问题(或者大家都是copy的?),我使用的是最新版本3.4.2,在wp-includes中并没有发现名为class.smtp.php的文件,正确的文件名为class-smtp.php。并且发现在此目录下所有class.xxx.php的格式都变为class-xxx.php,不知网络上class.xxx.php是哪个版本中的。

在class-smtp.php中改用pfsockopen()方法后也并没有好用。通过phpinfo()上检查了一番,发现不只fsockopen()被禁用,连pfsockopen()也一起禁用了。
正确的解决办法:

在服务器安装的php目录下找到php.ini文件,如果你是lnmp安装的,那么应该在/usr/local/php/etc/下,
查找allow_url_fopen

allow_url_fopen = On

配置是指允许访问网络文件,如果是Off,请改为On
接着找disable_functions

disable_functions = passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,fsockopent_status,pfsockopen,ini_alter,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,fsockopen

里面都是被禁用的方法,从中可以发现含有pfsockopen与fsockopen,想解禁哪一个就看你自己了。因为前面已经改用pfsockopen()了,所以我解禁了它。改完后重启php服务再到phpinfo()中去看如果被禁函数里没有了pfsockopen那么说明成功了。然后再去测试SMTP插件,显示成功!

另外看到有人提示还可以使用stream_socket_client方法来替代,但是stream_socket_client参数是不同的,需要做如下修改:

修改前:

$fp = fsockopen($host, 80, $errno, $errstr, 30);

修改后

$fp = stream_socket_client($host."80", $errno, $errstr, 30);

我没有测试这个方案,但发现是有问题的,我的参数格式为:

$this->smtp_conn = @pfsockopen($host, $port, $errno, $errstr, $tval);

和所示的不同。所以如何改就不得而知了~欢迎大家给出最新的方案。