为什么我不能通过WordPress发送电子邮件,而可以通过PHP脚本发送?

3
我已将运行版本为4.9.8的Wordpress服务器从Ubuntu迁移到CentOS,但来自WordPress的电子邮件似乎无法正确发送。我正在通过创建与各种电子邮件地址相关联的新用户来测试发送电子邮件。
我安装了Postfix,并进行了配置,使其与原始配置尽可能匹配。我这样说是因为在实现Postfix方面存在一些细微差别。
我能够通过命令行和托管在与WordPress相同服务器(php-fpm)上的PHP脚本向各种地址发送电子邮件。
然而,当我尝试通过在wp-admin中创建新用户向WordPress中相同的地址发送电子邮件时,它们无法到达收件人。我已检查了WordPress配置文件,并且没有看到任何覆盖默认邮件操作的内容。当通过我的PHP脚本触发电子邮件时,/var/log/maillog中没有新条目:
<?php
// the message
$msg = "First line of text\nSecond line of text";

// use wordwrap() if lines are longer than 70 characters
$msg = wordwrap($msg,70);

// send email
mail("me@{mydomain}","My subject",$msg);
?>

在从WordPress触发电子邮件后,也没有任何条目。

编辑:我打开了调试记录文件,并添加了一个捕获wp_mail错误的函数。当尝试时,我看到的错误是:

(
            [wp_mail_failed] => Array
                (
                    [0] => Invalid address:  (setFrom) wordpress@{mydomain}
                )

        )

发件人电子邮件地址与原始服务器中的相同。

编辑2:

我已经在functions.php中添加了一些自定义代码以设置发件人,并尝试了几个不同的发件人电子邮件地址 - 这些地址都是有效的电子邮件地址。所有这些都会出现“无效地址”的错误。奇怪的是,PHP的邮件函数将电子邮件发送为wordpress@ {mydomain},而这可以正常工作。


使用WordPress内置的wp_mail()函数。 - APAD1
我不是在尝试创建自定义代码...我正在尝试让从管理控制台向用户发送电子邮件的内置功能正常工作。 - Ken J
你提供的代码是自定义的。我只是建议使用WordPress内置的邮件功能来处理电子邮件的发送。如果你只是谈论标准的PHP邮件功能,为什么要打WordPress的标签呢? - APAD1
1
这个 PHP 脚本是一个在没有 WordPress 的情况下发送电子邮件的示例。我的问题是:为什么我可以使用 PHP 的原生邮件功能发送电子邮件,但 WordPress 本身无法向同一地址发送电子邮件? - Ken J
最终我不得不对validateAddress进行黑客攻击。不确定为什么它一直拒绝地址,但在将其锁定到noregex后,它可以正常工作并发送电子邮件。 - Ken J
1个回答

2

我的最初解决方案是直接将class-phpmailer.php更改为“noregex”,但感谢Wordpress论坛上的@diondesigns,我发现可以在我的主题的functions.php中添加一行:

add_filter( 'wp_mail_from', function($from){PHPMailer::$validator = 'noregex'; return $from;} );

现在邮件已经成功发送。

更新:

我想补充说明的是,主要问题在于PHP编译时使用了PCRE2而不是PCRE。这破坏了PHPMailer中的validateAddress功能。升级到使用了PCRE编译的PHP版本后,我不再遇到此问题。我建议使用此方法来解决问题,而非使用临时解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接