我最近在我的网站上设置了一个评论区,并试图让电子邮件通知发挥作用。它似乎不想在发表新评论时发送电子邮件通知。
为了看看PHP是否可以发送电子邮件,我尝试重置密码(因为您将通过邮件获得新密码),我收到了以下消息:
无法发送电子邮件。可能的原因:您的主机可能已禁用mail()函数
我选中了设置->讨论中的复选框,并且电子邮件有效,因此这不是设置问题。我尝试创建一个PHP文件并使用mail()
, 发送成功。所以WordPress肯定有点奇怪。
有什么想法吗?
我最近在我的网站上设置了一个评论区,并试图让电子邮件通知发挥作用。它似乎不想在发表新评论时发送电子邮件通知。
为了看看PHP是否可以发送电子邮件,我尝试重置密码(因为您将通过邮件获得新密码),我收到了以下消息:
无法发送电子邮件。可能的原因:您的主机可能已禁用mail()函数
我选中了设置->讨论中的复选框,并且电子邮件有效,因此这不是设置问题。我尝试创建一个PHP文件并使用mail()
, 发送成功。所以WordPress肯定有点奇怪。
有什么想法吗?
逐步:首先查找出现错误消息的文件。我使用记事本++和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 = \'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()
不使用PHPsmail()
作用WordPress使用PHP类(PHPMailer). 也许你只是需要a plugin to use SMTP 而不是sendmail。或者问题位于其他位置。我们不知道。你必须调查。
这是一条非常恼人的错误消息,因为它可能是许多事情,并且它不会揭示实际的错误(在代码的其他部分通常会被沉默)。
当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()
在里面/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能在将来的某个时候改进电子邮件错误处理。
我对亚马逊EC2上的Ubuntu服务器也有同样的问题。我在使用重置密码链接时遇到问题,其他通知电子邮件也无法工作。
所以这里有一些对我有效的解决方案。使用的Word presswp_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
然后检查word press电子邮件功能。如果这里的其他好答案没有帮助,请尝试以下方法:
我遇到了同样的问题,我在WordPress的任何建议中都找不到解决问题的方法。
然后我开始调查是否是PHP安装本身禁用了邮件功能,但这些都不起作用。一切看起来都配置正确。
所有这些问题都是在我将服务器升级到使用SELinux(安全增强型Linux)的CentOS 7后开始出现的,在过去几周的SELinux学习中,我学到的是,如果某些东西不起作用,但一切看起来都应该起作用。。。这意味着SELinux会在后台悄悄地屏蔽你。
还有维奥拉。
如果您正在运行使用SELinux的操作系统,只需以root用户身份执行以下命令:
setsebool -P httpd_can_sendmail=1
我今天碰到了这个;在我的例子中,发生这种情况是因为服务器的hosts文件具有与电子邮件地址相同的域名,指向localhost。mx记录指向不同的服务器,但主机文件正在覆盖DNS,WP正在尝试在本地传递电子邮件。从主机文件中删除域并重新启动sendmail解决了此问题。
我不知道这是否仍然与您相关,但由于没有选择答案,我想让我尝试一下。
事实上,自从我的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\' => \'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\\u mail)都正常工作,但我仍然有这个恼人的错误。修复很容易,但我花了几个小时才找到原因。因此,我将在这里分享我对这个问题的解决方案,它可能与您的(或可能不)相同。
我尝试了mail()函数,但在测试它时,没有在mail()函数中指定最后一个名为“parameters”的参数。WP确实使用了它。
@mail("example@exmaple.com",$title,$body,$headers,"-fexample@exmaple.com");
所以,基本上,这个参数(“-fexample@exmaple.com“)带“-f”标志,使mail()函数检查电子邮件地址”example@exmaple.com”列在“受信任的电子邮件”列表中。因此,如果没有,则返回false,这使得wp\\u mail()返回false并导致错误消息。
所以,解决方案是让hoster为您这样做,或者如果您使用的是cPanel,只需为该地址添加电子邮件帐户,它就会自动将其添加到“受信任列表”中。
它调用-管理注册的电子邮件ID,以便通过脚本ie(Wordpress)发送邮件
登录您的Cpanel
我有这个错误很久了,尝试了太多的解决方案,但都没有成功。我在AWS EC2上安装了自定义Wordpress。首先确保您的AWS SES邮件通过支持启用,它们必须位于SES和EC2中的相同(或关闭)区域。我使用Google suite(gsuite)收发邮件。
确保测试电子邮件发送到AWS SES和Gsuite。
安装Wordpress插件WP Mail SMTP,使用“其他SMTP”选项,从AWS SES获取您的SMTP凭据,这就是我卡住的地方。
您必须启用复选框“SSL”进行加密,这会将端口更改为465。最后,我的电子邮件测试从Worpdress成功发送。
我通过更改;来自电子邮件;在我的本地测试环境中wordpress@localhost到wordpress@localhost.localdomain,例如使用WordPress插件,如;WP Mail SMTP;并选择默认的PHP邮件程序,而不是使用SMTP。
这个问题甚至在所有其他插件都被禁用的情况下也发生了,我过去没有这个问题。直接使用PHP邮件功能时也不会出现此问题,因此可能是因为WordPress最近的一次更改。
我使用Postfix在本地计算机上收发电子邮件。
我已经在本地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