WordPress:如何在PHP函数中动态修改发件人邮箱与名称
解决WordPress动态修改事务性邮件发件人信息的问题
原代码的核心问题
你之前的尝试失效主要有两个原因:
- 变量作用域错误:嵌套定义的
custom_phpmailer_smtp函数无法访问外部my_send_email函数中的$from_email和$from_name变量,导致赋值为空值。 - 钩子使用不规范:动态添加钩子后未及时清理,可能影响后续邮件发送,且未设置优先级确保覆盖默认配置。
正确的解决方案
使用匿名闭包+变量传递的方式,配合钩子优先级控制和事后清理,实现单次邮件的动态发件人修改:
// 保留默认发件人配置 add_action( 'phpmailer_init', 'my_phpmailer_smtp' ); function my_phpmailer_smtp( $phpmailer ) { // 仅在未设置发件人时使用默认值,避免覆盖动态配置 if ( empty( $phpmailer->From ) ) { $phpmailer->From = 'info@domain.com'; $phpmailer->FromName = 'Info'; } } function my_send_email($to,$subject,$body,$from_email='',$from_name='') { $custom_smtp_callback = null; if($from_email && $from_name) { // 用闭包传递外部变量,设置更高优先级确保覆盖默认配置 $custom_smtp_callback = function( $phpmailer ) use ( $from_email, $from_name ) { $phpmailer->From = $from_email; $phpmailer->FromName = $from_name; $phpmailer->addReplyTo($from_email, $from_name); }; // 优先级设为20,高于默认的10,确保先执行自定义逻辑 add_action( 'phpmailer_init', $custom_smtp_callback, 20 ); } else { $from_name = 'Info'; $from_email = 'info@domain.com'; } $headers = array(); $headers[] = 'From: '.$from_name.' <'.$from_email.'>'; $headers[] = 'Reply-To: '.$from_name.' <'.$from_email.'>'; $headers[] = 'Content-Type: text/html; charset=UTF-8'; wp_mail( $to, $subject, $body, $headers ); // 发送完成后移除自定义钩子,避免影响后续邮件 if ( $custom_smtp_callback ) { remove_action( 'phpmailer_init', $custom_smtp_callback, 20 ); } }
关键优化点说明
- 闭包变量传递:通过
use关键字将$from_email和$from_name传入匿名函数,解决作用域问题。 - 钩子优先级:将自定义钩子的优先级设为20,高于默认的10,确保自定义配置覆盖默认值。
- 钩子清理:邮件发送后立即移除自定义钩子,避免后续邮件错误使用本次的发件人配置。
- 默认配置兼容:修改默认的
my_phpmailer_smtp函数,仅在未设置发件人时生效,避免冲突。
内容的提问来源于stack exchange,提问作者Senne Vandenputte
相关产品推荐
相关产品推荐

