ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PHPMailer 如何用 action_function 回调获取每次发送的结果与收件人信息

PHPMailer 如何用 action_function 回调获取每次发送的结果与收件人信息 PHPMailer 如何用 action_function 回调获取每次发送的结果与收件人信息【免费下载链接】PHPMailerThe classic email sending library for PHP项目地址: https://gitcode.com/GitHub_Trending/ph/PHPMailersend()的返回值只能告诉你“整体是否成功”无法区分批量发送时哪些收件人投递成功、哪些被服务器拒绝。PHPMailer 的action_function属性解决的就是这个问题把任意可调用对象函数名或闭包赋给该属性后send()会针对每个收件人调用一次回调把发送结果和地址信息交回给你的代码。本文基于 examples/callback.phps 和 src/PHPMailer.php 中的实现说明如何配置回调、不同发送方式下回调被调用的方式以及如何核对运行输出。回调的触发机制与参数action_function是 PHPMailer 类的公共属性默认值为空字符串public $action_function ;属性的文档注释明确说明该函数“handles the result of the send email action. It is called out by send() for each email sent.”取值可以是任何 PHP callable。实际调用发生在doCallback()方法protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from, $extra) { if (!empty($this-action_function) is_callable($this-action_function)) { call_user_func($this-action_function, $isSent, $to, $cc, $bcc, $subject, $body, $from, $extra); } }这里有两个判断条件属性非空且is_callable()通过。也就是说如果你给action_function赋了不存在的函数名或不可调用的值回调会被静默跳过send()本身不受影响。按 属性注释中的参数列表回调会收到 8 个参数参数类型含义$resultbool本次发送动作的结果$toarray收件人地址每项为[地址, 名称]$ccarray抄送地址$bccarray密送地址$subjectstring邮件主题$bodystring邮件正文$fromstring发件人地址$extraarray附加信息文档注明可能包含smtp_transaction_id last smtp transaction id需要留意示例回调只声明了前 6 个参数$result到$bodyPHP 对用户自定义函数传入多余参数不会报错所以写法上可以按需取用你关心的参数。准备安装 PHPMailerREADME.md 说明 PHPMailer 发布在 Packagist推荐通过 Composer 安装composer require phpmailer/phpmailer仓库自带的示例脚本位于examples/目录运行前有两点说明来自 examples/README.md示例以.phps扩展名提供通常会被语法高亮显示而不是执行要在 Web 服务器上运行需改名为.php扩展名。README 同时提醒不要把这些示例部署到线上站点也不要在其中留下真实密码。示例统一使用example.com、example.net域名这些域名由 IANA 保留、仅供说明用途。如果只是验证回调机制保持原地址即可若要真实投递把发件人和收件人替换成你拥有或可发送的地址。配置全局函数作为 action_functionexamples/callback.phps 给出完整示例主路径是“定义一个全局函数再把函数名赋给action_function”?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require ../vendor/autoload.php; function callbackAction($result, $to, $cc, $bcc, $subject, $body) { echo Message subject: \$subject\\n; foreach ($to as $address) { echo Message to {$address[1]} {$address[0]}\n; } foreach ($cc as $address) { echo Message CC to {$address[1]} {$address[0]}\n; } foreach ($bcc as $toaddress) { echo Message BCC to {$toaddress[1]} {$toaddress[0]}\n; } if ($result) { echo Message sent successfully\n; } else { echo Message send failed\n; } } $mail new PHPMailer(); try { $mail-isMail(); $mail-setFrom(youexample.com, Your Name); $mail-addAddress(janeexample.com, Jane Doe); $mail-addCC(johnexample.com, John Doe); $mail-Subject PHPMailer Test Subject; $mail-msgHTML(file_get_contents(../examples/contents.html)); //Optional - msgHTML will create an alternate automatically $mail-AltBody To view the message, please use an HTML compatible email viewer!; $mail-addAttachment(images/phpmailer_mini.png); $mail-action_function callbackAction; $mail-send(); } catch (Exception $e) { echo $e-errorMessage(); }关键点action_function在send()之前赋值即可示例中放在send()前一行示例使用isMail()即 PHP 内置mail()函数。examples/README.md 对 mail 示例的说明是这是最简单的发送方式但依赖本地存在邮件服务器这在 Windows 上通常不具备该情况下要么装一个本地邮件服务器要么改用 SMTP 发送。回调机制本身与此选择无关换成isSMTP()同样有效contents.html和phpmailer_mini.png是示例相对examples/目录的路径在别处运行时需指向你自己的文件。用闭包替代函数名可选分支同一个文件还展示了第二种写法直接把闭包赋给属性无需预先定义全局函数。适合回调逻辑只在发送流程内使用、不想污染全局命名空间的场景try { $mail-action_function static function ($result, $to, $cc, $bcc, $subject, $body) { if ($result) { echo Message sent successfully\n; } else { echo Message send failed\n; } }; $mail-send(); } catch (Exception $e) { echo $e-errorMessage(); }文件注释原文说明“This is a global function, but you can also pass a closure (or any other callable) to theaction_functionproperty.”所以方法引用、对象方法等任何 callable 都可以。运行示例并核对输出按示例代码运行后终端应逐行打印回调内部echo的内容。以下为文档示例代码的输出内容文档示例输出实际运行以你的地址和发送环境为准Message subject: PHPMailer Test Subject Message to Jane Doe janeexample.com Message CC to John Doe johnexample.com Message sent successfully判断方式每个收件人地址对应一行Message to .../Message CC to ...地址和显示名来自你addAddress()、addCC()传入的值$result为true时打印Message sent successfully为false时打印Message send failed如果完全没有输出先检查action_function赋的值是否可调用——doCallback()对不可调用值不做任何提示会直接跳过回调。不同发送方式下回调的调用方式回调何时被调用、一次带几个收件人取决于发送方式。src/PHPMailer.php 中有三处doCallback()调用点SMTP 发送第 2105–2116 行发送阶段先对 to、cc、bcc 逐一执行recipient()把每个地址的成功与否记录进$callbacks然后每个地址单独调用一次回调该次调用的$to只含这一个地址$cc、$bcc为空数组$extra携带[smtp_transaction_id $smtp_transaction_id]。也就是说批量发送时你可以在回调里按收件人区分成功与失败——某个地址被服务器拒绝$isSent为false时仍会有对应的回调记录。mail() 发送第 1950–1968 行开启SingleTo且有多个收件人时逐人调用回调每次$to只含一个地址否则整封邮件全部收件人调用一次回调。sendmail 发送第 1767–1809 行与 mail() 相同SingleTo时逐人调用否则整体调用一次$result取自pclose()的返回值是否为 0。如果你的场景是“逐个收件人记录投递结果”例如写库、发通知SMTP 方式天然按收件人回调mail() 和 sendmail 方式下若需要逐人粒度需要结合SingleTo的行为来看且 examples/README.md 对 sendmail 的说明是它“probably the fastest sending mechanism, but lacks some error reporting features”。限制回调只接收发送动作的结果与地址、主题、正文等信息不接收完整的异常对象send()抛出异常时走catch分支例如 mail() 路径 在$result为false时抛出Exception($this-lang(instantiate), self::STOP_CRITICAL)。要拿到详细错误仍需catch (Exception $e)配合errorMessage()。action_function为空或不可调用时doCallback()不做任何事也不报错回调“没执行”不会留下显式线索。示例文件以.phps提供仅供查看和本地调试按 examples/README.md 的安全说明不要将其改名为.php后部署到线上环境。【免费下载链接】PHPMailerThe classic email sending library for PHP项目地址: https://gitcode.com/GitHub_Trending/ph/PHPMailer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表