检查wp_mail是否工作正常?

时间:2013-05-20 作者:helle

我想用wp_mail (在本地计算机上测试),但未收到邮件。这个php.inismtp_port = 25 设置和phpmail() 目前正在工作。

我如何检查wp\\U邮件是否正常工作?什么可能会失败?以下是我的邮件功能代码:

function mv_optin_mail($id, $data){

    $url = $id."-".mv_mail_token($id, $data[\'token\']);

    add_filter( \'wp_mail_content_type\', \'set_html_content_type\' );
    add_filter( \'wp_mail_charset\', \'utf8\' );

    $headers[] = \'From: \'.sender_signature.\' <\'.noreply_address.\'>\';    

    ob_start();
    include("optin-mail.php");
    $html_mail = ob_get_contents();
    ob_end_clean();

    wp_mail( $data[\'email\'], \'Some Subject\', $html_mail, $headers );
    remove_filter( \'wp_mail_content_type\', \'set_html_content_type\' );
    remove_filter( \'wp_mail_charset\', \'utf8\' );
}
我没有收到任何错误。有没有办法切换wordpress的错误日志?

这个noreply_addressnoreply@root

6 个回复
最合适的回答,由SO网友:Tobias Beuving 整理而成

Wordpress依靠PHPMailer类通过PHP的mail 作用

自PHPmail 函数在执行后返回的信息很少(只有TRUE或FALSE),我建议暂时剥离mv_optin_mail 函数,以查看wp_mail 功能正常。

示例:

$mailResult = false;
$mailResult = wp_mail( \'[email protected]\', \'test if mail works\', \'hurray\' );
echo $mailResult;
因为您已经测试了PHP的mail 功能已经正常,邮件应该会到达。

如果没有,问题就出在函数的其他语句或PHPMailer类中。

在这种情况下,我通常将函数重命名为:

function mv_optin_mail_backup( $id, $data ) {
并添加一个同名的临时函数来处理类似的问题:

function mv_optin_mail( $id, $data ) {
    $mailResult = false;
    $mailResult = wp_mail( \'[email protected]\', \'test if mail works\', \'hurray\' );
    echo $mailResult;
}
当我找出问题所在后,我再次开始使用备份版本。

要直接使用PHPMailer发送邮件,可以执行以下操作(不用于生产,只用于调试):

add_action( \'phpmailer_init\', \'my_phpmailer_example\' );
function my_phpmailer_example( $phpmailer ) {
    $phpmailer->isSMTP();
    //$phpmailer->Host = \'smtp.example.com\';
    //    $phpmailer->SMTPAuth = true; // Force it to use Username and Password to authenticate
    $phpmailer->Port = 25;
    //    $phpmailer->Username = \'yourusername\';
    //    $phpmailer->Password = \'yourpassword\';

    // Additional settings…
    //$phpmailer->SMTPSecure = "tls"; // Choose SSL or TLS, if necessary for your server
    $phpmailer->setFrom( "[email protected]", "From Name" );
    $phpmailer->addAddress( "[email protected]", "Your name" );
    $phpmailer->Subject    = "Testing PHPMailer";           
    $phpmailer->Body     = "Hurray! \\n\\n Great.";
    if( !$phpmailer->send() ) {
        echo "Mailer Error: " . $phpmailer->ErrorInfo;
    } else {
        echo "Message sent!";
    }                       

}       

SO网友:gbones

您可以使用“wp\\u mail\\u failed”操作捕获发送错误。

https://developer.wordpress.org/reference/hooks/wp_mail_failed/

SO网友:Mateusz Hajdziony

我通常做什么来测试wp_mail() 正确发送电子邮件就是用另一个电子邮件地址在我的网站上注册,看看电子邮件是否到达。如果是这样,就意味着WordPress正确地发送了电子邮件(它使用wp_mail() 发送注册电子邮件),您应该检查邮件发送功能是否有任何错误。要做到这一点,正如@Tobias所建议的,您应该去掉邮件发送功能的所有内容,只保留基本功能:

function wpse_100047() {
    echo wp_mail( \'[email protected]\', \'WP Mail Test\', \'Mail is working\' );
}
此外,WordPress发送的电子邮件(与PHP发送的所有电子邮件一样mail() 某些电子邮件服务器可能会阻止该功能(或将其标记为垃圾邮件),因此最好在live网站上使用SMTP(多个插件)处理电子邮件。

SO网友:Andrew T

我将从启用WP_DEBUG 在wp config中,查看是否显示了有关您的代码或wp\\u邮件功能的代码的任何信息。这就是使用WP进行开箱即用调试的内容。

此外,您可以使用Easy WP SMTP 并启用调试和/或将其设置为使用SMTP。WordPress上也有类似的插件。org,但我知道这个有一个很好的调试选项。如果像GMail这样的东西可以工作,那么你就会知道这是一个服务器设置,而不是这个代码。

SO网友:Douglas.Sesar

如果要停止脚本并只看到$错误对象,请尝试在wp_mail() 方法激发:

add_action(\'wp_mail_failed\', function ($error) {
    wp_die("<pre>".print_r($error, true)."</pre>");
});

SO网友:freedev

这份文件中有非常有趣的建议。

https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

特别是在使用Azure虚拟机时,SELinux配置会阻止传出连接。

如果您看到如下错误SMTP -> ERROR: Failed to connect to server: Permission denied (13) , 您可能遇到SELinux阻止PHP或web服务器发送电子邮件。这在RedHat/Fedora/Centos上尤其可能。使用getsebool 命令我们可以检查是否允许httpd守护程序通过网络建立连接并发送电子邮件:

getsebool httpd_can_sendmail 
getsebool httpd_can_network_connect 
此命令将返回布尔值on或off。如果关闭,我们可以打开它:

sudo setsebool -P httpd_can_sendmail 1 
sudo setsebool -P httpd_can_network_connect 1 
如果您通过fastcgi运行PHP-FPM,则可能需要将其应用于FPM守护程序,而不是httpd。

结束

相关推荐