发送邮件提示 smtp error could not connect to smtp host
主要有2种情况,要么是商禁用了smtp功能,要么是关闭了fsockopen函数,下面看sjy分别来做讲解。
禁用了smtp功能
既然禁用了smtp功能,只好用mailsend来替代smtp了,方法是打开phpmailer目录下的class.phpmailer.php文件,大概在363行找到如下代码
public function issmtp() { $this->mailer = 'smtp'; }
把小写的smtp改成大写的smtp
这个地方的修改不是使用了smtp来发送邮件,而是使用了另外一种方式发送邮件,在class.phpmailer.php文件大概572行,可以找到以下代码
switch($this->mailer) { case 'sendmail': return $this->sendmailsend($header, $body); case 'smtp': return $this->smtpsend($header, $body); default: return $this->mailsend($header, $body); }
从这段代码可以看出,由于smtp和smtp不相等 所以选择的是下面mailsend发送邮件 并不是使用smtp发送邮件。实际上上面的smtp改成任意名称,都会执行默认的 mailsend
禁用了fsockopen函数
在主机商禁用mail()函数的时候,我们只能通过smtp插件来发送邮件,而smtp插件则是通过phpmailer连接远程smtp来发送邮件,如果服务器禁用了fsockopen()函数就会出现错误 could not connect to smtp host
打开phpmailer目录中的class.smtp.php文件,wordpress程序则打开wp-includes/class.smtp.php 文件 搜索 fsockopen 应该只有一个结果,替换为 pfsockopen
如果主机商同时禁用了pfsockopen函数,那么就用 stream_socket_client 下面是我替换的代码,供大家参考
$this->smtp_conn = @fsockopen($host, // the host of the server $port, // the port to use $errno, // error number if any $errstr, // error message if any $tval); // give up after ? secs
替换为
$this->smtp_conn = @stream_socket_client("tcp://".$host.":".$port, $errno, $errstr, $tval);
如有不明白的,就参考 fsockopen函数被禁用的kb88凯时官网登录的解决方案