WordPress拒绝发送邮件,“ ...您的主机可能已禁用mail()函数”


9

我最近在我的网站上实现了评论区,并试图使电子邮件通知正常工作。做出新评论时,它似乎不想发送电子邮件通知。

只是为了查看PHP是否可以发送电子邮件,我试图重置密码(因为您将通过邮件获得一个新密码),然后收到消息:

电子邮件无法发送。可能的原因:您的主机可能已禁用mail()函数

我已经检查了“设置”->“讨论”中的复选框,并且该电子邮件有效,因此这不是设置问题。我尝试创建一个PHP文件并使用发送mail(),并且发送成功。因此,WordPress一定有些奇怪的事情。

有任何想法吗?


Answers:


9

循序渐进:首先找到出现错误消息的文件。我使用Notepad ++和CTRL+ F命令搜索文件。仅搜索错误消息的前几个单词是一个好主意,因为某些错误消息是由不同的消息组合而成的。

您的错误消息wp-login.php仅在此出现,并且很幸运。现在让我们来看看为什么会发生此错误。

if ( $message && !wp_mail($user_email, $title, $message) )

有两个条件。$message必须为true(非空字符串,false,null等)。并且wp_mail()不应该返回false。

上面的一行有一个filter $message = apply_filters('retrieve_password_message', $message, $key);,因此插件(或主题)可能会使用此filter并返回不为true的值(空字符串,false,null等)。

但是,检查是否wp_mail()正常工作要容易得多。编写一个小插件,向您自己发送测试邮件:

<?php
/**
 * Plugin Name: Stackexchange Testplugin
 * Plugin URI:  http://yoda.neun12.de
 * Description: Send me a test email
 * Version:     0.1
 * Author:      Ralf Albert
 * Author URI:  http://yoda.neun12.de
 * Text Domain:
 * Domain Path:
 * Network:
 * License:     GPLv3
 */

namespace WordPressStackexchange;

add_action( 'init', __NAMESPACE__ . '\plugin_init' );

function plugin_init(){
    $to      = 'your-email-adress@some-domain.tld';
    $subject = 'Testemail';
    $message = 'FooBarBaz Testmail is working';

    wp_mail( $to, $subject, $message );
}

(这是PHP5.3代码。如果您正在运行PHP5.2,请删除名称空间内容)

激活后,插件应立即发送测试邮件。如果没有,应该调用一些后端页面(例如仪表板)。

如果测试邮件没有到达,则可能是您的问题wp_mail()。所以打开调试:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', true );
@ini_set( 'display_errors',1 );

将此代码放入您的系统,wp-config.php然后重试向自己发送测试邮件。现在,您应该会收到一些错误消息,并且也应该将其登录wp-content/debug.log(如果由于插件和/或主题引起的更多错误,调试日志会变得非常大)。

在这一点上,如果wp_mail()失败,您将获得很好的信息,如果失败,为什么。如果wp_mail()工作正常且测试邮件已到达,请返回顶部,找出为什么$message不正确。

如果您对遇到问题wp_mail(),请记住wp_mail()不要使用PHP mail()函数。WordPress使用PHP类(PHPMailer)。也许您只需要一个插件即可使用SMTP而不是sendmail。或者问题出在另一个地方。我们不知道 你必须调查。


是啊,我试图挖掘到核心部分,它使我得到PHPMailer的,它实际上不会使用PHP的mail()。至少在某些情况下(请参阅第732行wp-includes/class-phpmailer.php。我没有访问ftp atm的权限,但是我会尽快尝试您的建议。当然这一定会带我到某个地方。非常感谢!
qwerty 2013年

我测试了wp_mail()一下,看来工作正常,我按预期收到了邮件。WP仍然不会发送评论/密码重置电子邮件,并且日志文件中没有任何内容(未创建),因此我尝试安装SMTP邮件插件并设置了新的电子邮件帐户WordPress的。现在可以使用了,但是我仍然不明白为什么以前无法发送。谢谢!
qwerty

我没有收到任何错误,甚至没有邮件
baldraider

2

这是一个超级烦人的错误消息,因为它可能有很多事情,并且没有揭示实际的错误(该错误通常在代码的其他部分中被忽略)。

wp_mail()函数返回false时,会出现此错误,如果phpmailer->Send()返回false或引发异常,则可能会发生此错误。


如何从PHP mail()函数显示警告

这些默认情况下通常默认为静音,但是不幸的是WordPress从未捕获它们。向他们展示,只需删除@从标志@mail(...wp-includes/class-phpmailer.phpmailPassthru()功能:

if (ini_get('safe_mode') || !($this->UseSendmailOptions)) {
    $rt = @mail($to, $this->encodeHeader($this->secureHeader($subject)), $body, $header);
} else {
    $rt = @mail($to, $this->encodeHeader($this->secureHeader($subject)), $body, $header, $params);
}


如何寻找其他可能的原因:

  1. wp_mail()在in 的底部添加一行/wp-includes/pluggable.php

    // Send!
    try {
        return $phpmailer->Send();
    } catch ( phpmailerException $e ) {
        //------------- This next line is the one to add -------------------
        if (WP_DEBUG) echo '<pre>' . esc_html(print_r($e, TRUE)) . '</pre>';
        return false;
    }
  2. 它将转储引发异常的位置的所有详细信息。不幸的是,它有时会包含以下无用的异常消息:“ 无法实例化邮件功能 ”。是的,感谢WordPress,这真的很有帮助。

  3. 通过查看异常,您可以找到错误的行号,并希望可以通过代码追溯到该行以找到真正的原因。

祝好运。希望WordPress在将来的某个时候可以改善电子邮件错误处理。


2

我在Amazon EC2上的Ubuntu服务器遇到相同的问题。在使用重置密码链接时出现问题,并且其他通知电子邮件也无法正常工作。

所以这是对我有用的解决方案.Word-press使用wp_mail()功能发送电子邮件,PHPMailer该邮件需要使用php mailer存储在中的类/usr/sbin/sendmail

首先使用此简单的php函数检查php邮件

<?php
$to = "example@gmail.com";
$subject = "Test Email Function";
$txt = "Hello world!";
$headers = "From: webmaster@example.com" . "\r\n" .
"CC: xyz@example.com";

mail($to,$subject,$txt,$headers);
?>

如果这不起作用,那么您需要安装php mailer。使用此命令在Ubuntu服务器上安装php邮件。

sudo apt-get install sendmail

然后检查单词按电子邮件功能。


这个答案是任何人都应该尝试的其他答案之前的方式,这就是要走的路
hatenine

1

如果这里其他好的答案没有帮助,请尝试以下操作:

我遇到了同样的问题,在WordPress的任何建议中我都找不到解决方案。

然后,我开始调查是否是PHP安装本身禁用了邮件功能,但这些都不起作用。一切看起来都已正确配置。

当我将服务器升级到使用SELinux(安全增强型Linux)的CentOS 7时,所有这些问题对我来说都是开始的。最近几周,我在SELinux上了解到,如果某些功能无法正常工作,但一切看起来像它应该可以正常工作……这意味着SELinux在后台无声无息地阻止了您。

还有中提琴

如果您正在运行并且使用SELinux的操作系统,只需以root用户身份执行以下命令:

setsebool -P httpd_can_sendmail=1

有一个安全设置可以从本质上阻止Web服务器发送电子邮件。当您按下该开关并告诉SELinux时,网络服务器可以发送电子邮件,一切突然就可以了。


0

我今天碰到了这个 在我的情况下,发生这种情况是因为服务器的hosts文件具有与电子邮件地址相同的域名,指向localhost。mx记录指向另一台服务器,但是hosts文件覆盖了DNS,WP正在尝试在本地传递电子邮件。从主机文件中删除域并重新启动sendmail解决了此问题。


0

我不知道这是否仍然与您相关,但是由于没有选择答案,我想让我尝试一下。

实际上,我遇到了完全相同的问题,因为我的openshift主机今天突然全部让步并停止发送邮件。深入研究代码和法典,我了解了wp_mail()函数,最后google将我引到了这里,我看到了如何覆盖它。

以@ Ralf912的答案为基础,我对脚本进行了一些修改,以便代码使用sendgrid.com的网络api发送邮件,而不是使用wordpress默认邮件(我认为:

<?php

function sendgridmail($to, $subject, $message, $headers)
{
    $url = 'https://api.sendgrid.com/';
    //$user = 'yourUsername';
    //$pass = 'yourPassword';

    $params = array(
        'api_user'  => $user,
        'api_key'   => $pass,
        'to'        => $to,
        'subject'   => $subject,
        'html'      => '',
        'text'      => $message,
        'from'      => 'abc@hotmail.com',
      );


    $request =  $url.'api/mail.send.json';

    // Generate curl request
    $session = curl_init($request);
    // Tell curl to use HTTP POST
    curl_setopt ($session, CURLOPT_POST, true);
    // Tell curl that this is the body of the POST
    curl_setopt ($session, CURLOPT_POSTFIELDS, $params);
    // Tell curl not to return headers, but do return the response
    curl_setopt($session, CURLOPT_HEADER, false);
    curl_setopt($session, CURLOPT_RETURNTRANSFER, true);

    // obtain response
    $response = curl_exec($session);
    curl_close($session);

    // print everything out
    //print_r($response);
}

//only for testing:
/*$to      = 'abc@yahoo.com';
$subject = 'Testemail';
$message = 'It works!!';
echo 'To is: ' + $to;
#wp_mail( $to, $subject, $message, array() );
sendgridmail($to, $subject, $message, $headers);
print_r('Just sent!');*/

if (!function_exists('wp_mail')) {
    function wp_mail($to, $subject, $message, $headers = '', $attachments = array())
    {
        // use the PHP GnuPG library here to send mail.
        sendgridmail($to, $subject, $message, $headers);
    }
}

function plugin_init()
{
   /* $to      = 'xyz@yahoo.com';
    $subject = 'Testemail';
    $message = 'It works Live!';
    //echo 'To is: ' + $to;
    wp_mail( $to, $subject, $message, array() );
    //print_r('Just sent!');*/
}

而且有效!


0

我遇到了同样的错误,两个函数(mail和wp_mail)都起作用了,但是我仍然遇到这个烦人的错误。修复非常容易,但是花了我几个小时才找到原因。因此,我将在这里分享与您的(或可能不一样)问题的解决方案。

我尝试过mail()函数,但是它起作用了,但是当您对其进行测试时,没有在mail()函数中指定最后一个称为“ parameters”的参数。WP确实使用它。

@mail("example@exmaple.com",$title,$body,$headers,"-fexample@exmaple.com");

因此,基本上,带有标志“ -f”的此参数(“ -fexample@exmaple.com”)使mail()函数检查电子邮件地址“ example@exmaple.com”是否在“受信任的电子邮件”列表中列出。

因此,如果没有,它将返回false,这会使wp_mail()返回false并导致错误消息。

因此,解决方案是要求托管服务商为您执行此操作,或者,如果您使用的是cPanel,只需为该地址添加电子邮件帐户,它将自动将其添加到“受信任的列表”中。


0

它称为-管理用于通过脚本发送邮件的已注册电子邮件ID,即(Wordpress)

  1. 登录您的Cpanel。
  2. 转到电子邮件部分>,然后单击注册的电子邮件ID。
  3. 然后添加(wordpress@yourdomain.com)或您的wordpress托管位置。即(wordpress@blog.yourdomain.com)。然后提交,这需要几分钟来激活,等待15分钟到1小时取决于您的托管服务提供商,然后它将起作用。

0

我有这个错误已有很长时间了,并尝试了许多行不通的解决方案。我在AWS EC2上安装了自定义Wordpress。首先,请确保通过支持启用了您的AWS SES邮件,它们必须位于SES和EC2中的同一(或关闭)区域中。我使用Google suite(gsuite)接收和发送邮件的电子邮件。

确保测试电子邮件以AWS SES和Gsuite的形式发送。

安装Wordpress插件WP Mail SMTP,使用选项“其他SMTP”,从AWS SES获取您的SMTP凭据,这就是我遇到的问题。

您必须启用“ SSL”复选框以进行加密,这对我来说将端口更改为465。最后,我从Worpdress发送的电子邮件测试成功。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.