You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在WordPress的wp_mail中传递return-path额外参数?

解决WordPress wp_mail无法设置Return-Path的问题

你说得对,WordPress的wp_mail()函数确实没有原生PHP mail()那样的additional_parameters参数,而且就算你在headers里手动加Return-Path,绝大多数情况下都会被服务器或者wp_mail底层使用的PHPMailer给覆盖掉,根本起不了作用。不过有两个可靠的方法能解决这个问题:

方法一:全局设置Return-Path(适合所有邮件)

如果你想让所有通过wp_mail发送的邮件都使用同一个退回地址,直接用phpmailer_init钩子修改PHPMailer的属性就行——这是最靠谱的方式,因为wp_mail本质上是调用PHPMailer来发邮件的:

add_action('phpmailer_init', 'custom_global_return_path');
function custom_global_return_path($phpmailer) {
    // 替换成你想要的退回地址
    $phpmailer->Sender = 'bounce@domain.co.uk';
}

把这段代码加到你的主题functions.php或者自定义插件里就行,之后所有wp_mail发送的邮件,Return-Path都会被设置成你指定的地址。

方法二:针对特定邮件设置Return-Path

如果只是想给你插件里发送的那封续费提醒邮件单独设置退回地址,不想影响其他邮件,可以临时添加钩子,发送完再移除:

// 先添加临时钩子
add_action('phpmailer_init', 'temp_renewal_return_path');

// 发送你的续费提醒邮件
$headers = array(
    'From: Eden Mobility <website@domain.co.uk>',
    'Content-Type: text/html; charset=UTF-8'
);
wp_mail( "myemailaddress@hidden.com", 'Your ' . $item . ' renewal is almost due', $template, $headers );

// 发送完立刻移除钩子,避免影响其他邮件
remove_action('phpmailer_init', 'temp_renewal_return_path');

// 定义临时钩子的回调函数
function temp_renewal_return_path($phpmailer) {
    // 这里设置你想要的退回地址
    $phpmailer->Sender = 'website@domain.co.uk';
}

注意这里我去掉了你原来headers里的Return-Path项,因为它根本不会生效,反而可能造成冗余。

为什么headers里的Return-Path没用?

简单说,PHPMailer默认不会解析你在headers里添加的Return-Path,它会优先使用自身的Sender属性;如果Sender没设置,才会 fallback 到服务器的默认退回地址。所以直接在headers里加完全是白费功夫,必须通过修改PHPMailer的Sender属性来实现。

最后提醒一下:确保你设置的退回地址是属于当前域名的有效邮箱,很多主机服务商都会限制只能用域名内的邮箱作为Return-Path,不然可能会被当成垃圾邮件或者直接发送失败。

内容的提问来源于stack exchange,提问作者Liam McArthur

火山引擎 最新活动