如何使用第三方图书馆发送电子邮件?

时间:2019-02-14 作者:Badr

我试图通过发送经过正确身份验证的电子邮件(正确的SPF和DKIM配置)来提高我的电子邮件交付能力。我已经完成了SPF部分,但为了使用DKIM,我需要使用第三方库(SwiftMailer) 这允许我用DKIM密钥签署电子邮件。

那么,如何防止WordPress使用通常的wp_mail() 这样我就可以获取所有电子邮件的内容,并使用SwiftMailer发送它们。

我不需要代码,我只是想找到一种方法来实现它(可能有一些钩子……)。

1 个回复
最合适的回答,由SO网友:tmdesigned 整理而成

我认为这里有两个不错的选择。

让WordPress保留它的邮件功能,但一次或两次钩住wp\\u mail()有几个钩子,可以帮助您替换内置行为,基本上就是使用php的简单小邮件程序。

以下是我认为您可能会使用的一些有用的挂钩,因为这正是您所要求的:

//Filter the message (recipient, subject, body, etc.)

add_filter( \'wp_mail\', \'your_filter_function\', 11, 1);
function your_filter_function( $args ){
    //$args is an array of \'to\', \'subject\', \'message\', \'headers\', and \'attachments\'
    //do whatever you want to the message
}
更重要的是,要取代WordPress对phpmailer的使用:

//Runs after phpmailer is initialized, and passes the phpmailer instance by reference

add_action( \'phpmailer_init\', \'your_mailer_function\', 99, 1 );
function your_mailer_function( &$phpmailer ){
    //$phpmailer is a direct reference to the phpmailer instance WordPress started
    //set it to something else, i.e. an SMTP mailer object, to override
    //you may also want to configure the "from" email at this point to match the 
    //SMTP account you\'re using
}
重要的部分是使用上面的第二个钩子,我们实际上通过引用(即通过内存地址)获得phpmailer实例,因此我们可以直接修改它。钩子运行后,WordPress的下一个代码是:

return $phpmailer->send();
因此,如果此时您替换了$phpmailer,它将调用对象的send方法。

选项2-替换WordPress的邮件功能wp\\U mail是WordPress的可插入功能之一,这意味着您可以完全重新定义它。

原始函数定义如下所示:

function wp_mail( $to, $subject, $message, $headers = \'\', $attachments = array() ) {
因此,如果您重新定义它并保留相同的参数,那么将调用您的函数。

由于WordPress只允许对每个可插入函数(通过includes/pluggable.php中的方式找到)定义一次,因此您应该将替换函数包装在if(!function\\u exists(…调用)中。

我的建议是,WordPress整体上似乎正在从可插拔功能(方法2)转向hooks方法,这对我来说更有意义,因为你只需要更换必要的部分,而保留所有其他部分,此外,您还可以在挂钩上指定优先级,以便在一位以上的代码修改默认行为时有更多的控制权。所以我建议使用方法1。

注意:

仅仅是一个教学时刻,10分钟前我还不知道这些挂钩。我打开了一个新的WordPress文件夹并搜索了;功能wp\\U mail;找到主代码,然后查看其中的挂钩。在找到我认为合适的钩子之后,我还下载了一个WordPress SMTP插件,并查看了代码,看看它们使用了哪些钩子。我看到的一个(Easy WP SMTP)使用了相同的2,再加上一些其他的用于一些更高级的功能。我还注意到,该函数是在pluggable中定义的。php,在这里可以直接重写live函数。

所以您可能已经这样做了,但不要害怕跳入WordPress核心代码并四处挖掘。

相关推荐

如何在自定义的PHP文件中使用GET_BLOGINO(‘ADMIN_Email’)?

我如何使用get_bloginfo(\'admin_email\') 在位于父主题根目录中的自定义PHP文件中?我已经分别构建了一个自定义表单和一个PHP邮件脚本,但现在我想用密件抄送将表单数据发送到WP Admin电子邮件地址。 $headers = \"MIME-Version: 1.0\" . \"\\r\\n\"; $headers .= \"Content-type:text/html;charset=UTF-8\" . \"\\r\\n\"; $heade