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

时间:2013-04-08 作者:qwerty

我最近在我的网站上设置了一个评论区,并试图让电子邮件通知发挥作用。它似乎不想在发表新评论时发送电子邮件通知。

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

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

我选中了设置->讨论中的复选框,并且电子邮件有效,因此这不是设置问题。我尝试创建一个PHP文件并使用mail(), 发送成功。所以WordPress肯定有点奇怪。

有什么想法吗?

10 个回复
SO网友:Ralf912

逐步:首先查找出现错误消息的文件。我使用记事本++和CTRL+F命令来搜索文件。最好只搜索错误消息的前几个单词,因为一些错误消息是由不同消息组合而成的。

您的错误消息出现在wp-login.php 祝你好运,就在那里。让我们看看为什么会发生这种错误。

if ( $message && !wp_mail($user_email, $title, $message) )
有两个条件。$message必须为true(非空字符串、非false、非null等)。和wp_mail() 不应返回false。

上面一行是过滤器$message = apply_filters(\'retrieve_password_message\', $message, $key);, 因此,插件(或主题)可能会使用此过滤器并返回一个非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      = \'[email protected]\';
    $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() 不使用PHPsmail() 作用WordPress使用PHP类(PHPMailer). 也许你只是需要a plugin to use SMTP 而不是sendmail。或者问题位于其他位置。我们不知道。你必须调查。

SO网友:Simon East

这是一条非常恼人的错误消息,因为它可能是许多事情,并且它不会揭示实际的错误(在代码的其他部分通常会被沉默)。

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);
}

如何找出其他可能的原因:在wp_mail() 在里面/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;
}
它将转储引发异常的位置的完整详细信息。不幸的是,它有时包含这条毫无帮助的异常消息:“em>无法实例化邮件功能”。是的,谢谢WordPress,这真的很有帮助。

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

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

SO网友:CyberAbhay

我对亚马逊EC2上的Ubuntu服务器也有同样的问题。我在使用重置密码链接时遇到问题,其他通知电子邮件也无法工作。

所以这里有一些对我有效的解决方案。使用的Word presswp_mail() 发送需要的电子邮件的功能PHPMailer 使用存储在中的php mailer的类/usr/sbin/sendmail.

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

<?php
$to = "[email protected]";
$subject = "Test Email Function";
$txt = "Hello world!";
$headers = "From: [email protected]" . "\\r\\n" .
"CC: [email protected]";

mail($to,$subject,$txt,$headers);
?>
如果这不起作用,那么您需要安装php mailer。使用此命令在Ubuntu服务器上安装php邮件。

sudo apt-get install sendmail
然后检查word press电子邮件功能。

SO网友:Kenny Wyland

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

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

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

所有这些问题都是在我将服务器升级到使用SELinux(安全增强型Linux)的CentOS 7后开始出现的,在过去几周的SELinux学习中,我学到的是,如果某些东西不起作用,但一切看起来都应该起作用。。。这意味着SELinux会在后台悄悄地屏蔽你。

还有维奥拉。

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

setsebool -P httpd_can_sendmail=1

有一个固有的安全设置可以阻止Web服务器发送电子邮件。当您打开开关并告诉SELinux Web服务器可以发送电子邮件时,一切都会突然正常。

SO网友:user16081

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

SO网友:Prahlad Yeri

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

事实上,自从我的openshift主机今天突然崩溃并停止发送邮件以来,我就面临着完全相同的问题。通过对代码和codex的深入研究,我逐渐了解了wp\\u mail()函数,最后谷歌把我带到了这里,我看到了如何重写它。

基于@Ralf912的答案,我对脚本进行了一些修改,使代码使用sendgrid。com的web api来发送邮件,而不是wordpress的默认api(我认为:

<?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\'      => \'[email protected]\',
      );


    $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      = \'[email protected]\';
$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      = \'[email protected]\';
    $subject = \'Testemail\';
    $message = \'It works Live!\';
    //echo \'To is: \' + $to;
    wp_mail( $to, $subject, $message, array() );
    //print_r(\'Just sent!\');*/
}
成功了!

SO网友:user3696815

我也有同样的错误,两个功能(mail和wp\\u mail)都正常工作,但我仍然有这个恼人的错误。修复很容易,但我花了几个小时才找到原因。因此,我将在这里分享我对这个问题的解决方案,它可能与您的(或可能不)相同。

我尝试了mail()函数,但在测试它时,没有在mail()函数中指定最后一个名为“parameters”的参数。WP确实使用了它。

@mail("[email protected]",$title,$body,$headers,"[email protected]");
所以,基本上,这个参数(“[email protected]“)带“-f”标志,使mail()函数检查电子邮件地址”[email protected]”列在“受信任的电子邮件”列表中。

因此,如果没有,则返回false,这使得wp\\u mail()返回false并导致错误消息。

所以,解决方案是让hoster为您这样做,或者如果您使用的是cPanel,只需为该地址添加电子邮件帐户,它就会自动将其添加到“受信任列表”中。

SO网友:Amrit Bhandari

它调用-管理注册的电子邮件ID,以便通过脚本ie(Wordpress)发送邮件

登录您的Cpanel

SO网友:Archie Butler

我有这个错误很久了,尝试了太多的解决方案,但都没有成功。我在AWS EC2上安装了自定义Wordpress。首先确保您的AWS SES邮件通过支持启用,它们必须位于SES和EC2中的相同(或关闭)区域。我使用Google suite(gsuite)收发邮件。

确保测试电子邮件发送到AWS SES和Gsuite。

安装Wordpress插件WP Mail SMTP,使用“其他SMTP”选项,从AWS SES获取您的SMTP凭据,这就是我卡住的地方。

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

SO网友:baptx

我通过更改;来自电子邮件;在我的本地测试环境中wordpress@localhost到[email protected],例如使用WordPress插件,如;WP Mail SMTP;并选择默认的PHP邮件程序,而不是使用SMTP。

这个问题甚至在所有其他插件都被禁用的情况下也发生了,我过去没有这个问题。直接使用PHP邮件功能时也不会出现此问题,因此可能是因为WordPress最近的一次更改。

我使用Postfix在本地计算机上收发电子邮件。

结束

相关推荐

Wp-config.php文件权限

我已经在本地Ubuntu机器上安装了Wordpress,带有标准的LAMP配置和phpMyAdmin。安装目录为localhost:///var/www/blog.在安装的第二步,在我进入MySQL配置后,出现以下消息:Sorry, but I can’t write the wp-config.php file. 当前权限为:-rw-r--r-- 1 adam adam 2.0K Oct 23 2010 wp-links-opml.php -rw-r--r-- 1 adam adam