You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP函数内无法访问类求助:MailerSend邮件代码封装异常

解决MailerSend封装PHP函数时的类引用问题

问题背景

使用MailerSend发送邮件时,单文件执行代码正常,但尝试封装成可复用函数时遇到两个问题:

  • 将require和use语句放在调用脚本中,执行时提示“Class 'Recipient' not found”
  • 将这些语句放入函数内部,会触发“unexpected 'use'”语法错误

问题原因

  • PHP的use是命名空间导入语句,只能放在文件的最顶部(所有执行代码之前),不能在函数、条件判断等代码块内部使用
  • 若仅在调用脚本中导入命名空间,封装函数的文件未导入对应类,函数内部无法识别这些类

解决方案

  1. 将require(加载自动加载文件)和use(导入类)语句放在封装函数的文件顶部,确保函数所在文件能正确加载并识别所需类
  2. 函数内部直接使用导入后的类,无需重复use;将$apiKey等动态参数作为函数参数传入,避免使用global,提升函数独立性

完整示例代码

1. 封装函数的文件(mailer_send_helper.php)

<?php
// 加载Composer自动加载文件,确保路径与实际一致
require '/home/xxxxx/vendor/autoload.php';

// 导入MailerSend相关类,必须放在文件顶部
use MailerSend\MailerSend;
use MailerSend\Helpers\Builder\Recipient;
use MailerSend\Helpers\Builder\EmailParams;
use MailerSend\Helpers\Builder\Attachment;

/**
 * 发送MailerSend邮件的封装函数
 * @param string $apiKey MailerSend API密钥
 * @param string $recipientEmail 收件人邮箱地址
 * @param string $subject 邮件主题
 * @param string $htmlContent 邮件HTML正文
 * @param string $textContent 邮件纯文本正文
 * @param array|null $attachments 附件数组(可选,元素为Attachment对象)
 * @return mixed 邮件发送响应结果
 */
function sendMailerSendEmail($apiKey, $recipientEmail, $subject, $htmlContent, $textContent, $attachments = null) {
    // 初始化MailerSend实例
    $mailersend = new MailerSend(['api_key' => $apiKey]);
    
    // 创建收件人对象
    $recipients = [new Recipient($recipientEmail, '')];
    
    // 构建邮件参数
    $emailParams = (new EmailParams())
        ->setFrom('fromemail.com')
        ->setFromName('My System')
        ->setRecipients($recipients)
        ->setSubject($subject)
        ->setHtml($htmlContent)
        ->setText($textContent)
        ->setReplyTo('replyto@mysite.com')
        ->setReplyToName('My System');
    
    // 若有附件则添加
    if (!empty($attachments)) {
        $emailParams->setAttachments($attachments);
    }
    
    // 发送邮件并返回响应
    return $mailersend->email->send($emailParams);
}

2. 调用脚本示例

<?php
// 引入封装好的邮件函数文件
require './mailer_send_helper.php';

// 定义发送参数
$apiKey = '你的MailerSend API密钥';
$toEmail = 'user@example.com';
$emailSubject = '测试邮件主题';
$htmlBody = '<h3>这是HTML格式的邮件内容</h3>';
$textBody = '这是纯文本格式的邮件内容';

// 可选:准备附件(示例)
// $attachments = [
//     new Attachment(file_get_contents('document.pdf'), 'document.pdf', 'application/pdf')
// ];

// 调用发送函数
$response = sendMailerSendEmail($apiKey, $toEmail, $emailSubject, $htmlBody, $textBody);

// 打印响应结果(调试用)
var_dump($response);

关键注意点

  • 确保require的自动加载文件路径正确,否则无法加载MailerSend的类
  • use语句必须放在文件最顶部,不能嵌套在任何代码块内
  • 函数参数尽量独立,避免依赖全局变量,让函数在不同脚本中都能直接调用

内容的提问来源于stack exchange,提问作者Jonathan Spector

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 19:32:25