Answers:
循序渐进:首先找到出现错误消息的文件。我使用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。或者问题出在另一个地方。我们不知道 你必须调查。
mail()
。至少在某些情况下(请参阅第732行wp-includes/class-phpmailer.php
。我没有访问ftp atm的权限,但是我会尽快尝试您的建议。当然这一定会带我到某个地方。非常感谢!
wp_mail()
一下,看来工作正常,我按预期收到了邮件。WP仍然不会发送评论/密码重置电子邮件,并且日志文件中没有任何内容(未创建),因此我尝试安装SMTP邮件插件并设置了新的电子邮件帐户WordPress的。现在可以使用了,但是我仍然不明白为什么以前无法发送。谢谢!
这是一个超级烦人的错误消息,因为它可能有很多事情,并且没有揭示实际的错误(该错误通常在代码的其他部分中被忽略)。
当wp_mail()
函数返回false时,会出现此错误,如果phpmailer->Send()
返回false或引发异常,则可能会发生此错误。
mail()
函数显示警告这些默认情况下通常默认为静音,但是不幸的是WordPress从未捕获它们。向他们展示,只需删除@
从标志@mail(...
中wp-includes/class-phpmailer.php
的mailPassthru()
功能:
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()
在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;
}
它将转储引发异常的位置的所有详细信息。不幸的是,它有时会包含以下无用的异常消息:“ 无法实例化邮件功能 ”。是的,感谢WordPress,这真的很有帮助。
通过查看异常,您可以找到错误的行号,并希望可以通过代码追溯到该行以找到真正的原因。
祝好运。希望WordPress在将来的某个时候可以改善电子邮件错误处理。
我在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
然后检查单词按电子邮件功能。
如果这里其他好的答案没有帮助,请尝试以下操作:
我遇到了同样的问题,在WordPress的任何建议中我都找不到解决方案。
然后,我开始调查是否是PHP安装本身禁用了邮件功能,但这些都不起作用。一切看起来都已正确配置。
当我将服务器升级到使用SELinux(安全增强型Linux)的CentOS 7时,所有这些问题对我来说都是开始的。最近几周,我在SELinux上了解到,如果某些功能无法正常工作,但一切看起来像它应该可以正常工作……这意味着SELinux在后台无声无息地阻止了您。
还有中提琴
如果您正在运行并且使用SELinux的操作系统,只需以root用户身份执行以下命令:
setsebool -P httpd_can_sendmail=1
有一个安全设置可以从本质上阻止Web服务器发送电子邮件。当您按下该开关并告诉SELinux时,网络服务器可以发送电子邮件,一切突然就可以了。
我不知道这是否仍然与您相关,但是由于没有选择答案,我想让我尝试一下。
实际上,我遇到了完全相同的问题,因为我的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!');*/
}
而且有效!
我遇到了同样的错误,两个函数(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,只需为该地址添加电子邮件帐户,它将自动将其添加到“受信任的列表”中。
它称为-管理用于通过脚本发送邮件的已注册电子邮件ID,即(Wordpress)
我有这个错误已有很长时间了,并尝试了许多行不通的解决方案。我在AWS EC2上安装了自定义Wordpress。首先,请确保通过支持启用了您的AWS SES邮件,它们必须位于SES和EC2中的同一(或关闭)区域中。我使用Google suite(gsuite)接收和发送邮件的电子邮件。
确保测试电子邮件以AWS SES和Gsuite的形式发送。
安装Wordpress插件WP Mail SMTP,使用选项“其他SMTP”,从AWS SES获取您的SMTP凭据,这就是我遇到的问题。
您必须启用“ SSL”复选框以进行加密,这对我来说将端口更改为465。最后,我从Worpdress发送的电子邮件测试成功。