在 Laravel 中如何通过 MCP 协议发送邮件?

在 Laravel 中通过 MCP 协议发送邮件需要完成以下关键步骤,这里提供完整实现指南:

一、服务端配置

  1. 创建邮件工具类
// app/Tools/EmailTool.php
namespace App\Tools;

use PhpMcp\Laravel\Server\Attributes\McpTool;
use Illuminate\Support\Facades\Mail;
use App\Mail\TransactionalEmail;
use Illuminate\Support\Facades\Validator;

class EmailTool {
    #[McpTool(
        name: "send_email",
        description: "发送事务邮件",
        params: [
            'recipient' => 'required|email',
            'subject' => 'required|string|max:120',
            'template' => 'required|string|in:invoice,welcome,reset',
            'variables' => 'array'
        ]
    )]
    public function send(array $params): array {
        // 二次校验确保安全
        $validator = Validator::make($params, [
            'recipient' => 'required|email',
            'template' => 'required|exists:mail_templates,name'
        ]);
        
        if ($validator->fails()) {
            abort(422, $validator->errors()->first());
        }

        // 实际发送邮件
        Mail::to($params['recipient'])
            ->queue(new TransactionalEmail(
                $params['subject'],
                $params['template'],
                $params['variables'] ?? []
            ));
        
        return [
            'status' => 'queued',
            'message' => '邮件已进入发送队列',
            'timestamp' => now()->toDateTimeString()
        ];
    }
}
  1. 创建邮件模板类
// app/Mail/TransactionalEmail.php
namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class TransactionalEmail extends Mailable {
    use Queueable, SerializesModels;

    public function __construct(
        public string $subject,
        public string $template,
        public array $variables = []
    ) {}

    public function build() {
        return $this->subject($this->subject)
            ->view('emails.' . $this->template)
            ->with($this->variables);
    }
}

二、客户端调用示例(JavaScript)

// 连接到 MCP 服务
const mcp = new McpClient('https://api.yourdomain.com/mcp/sse', {
  token: AUTH_TOKEN // 服务端签发的 JWT
});

// 调用邮件发送工具
async function sendInvoiceEmail() {
  const response = await mcp.execute('send_email', {
    recipient: 'client@example.com',
    subject: '您的订单发票 #INV-2023-0456',
    template: 'invoice',
    variables: {
      invoice_number: 'INV-2023-0456',
      amount: 2499.00,
      due_date: '2023-12-31'
    }
  });
  
  console.log('邮件发送状态:', response);
  // 输出: {status: "queued", message: "邮件已进入发送队列", ...}
}

// 处理错误
mcp.on('error', (err) => {
  console.error('邮件发送失败:', err);
});

三、关键配置项

  1. MCP 路由配置 (config/mcp.php)
'transports' => [
    'sse' => [
        'route' => '/mcp/sse',
        'middleware' => ['auth:api', 'throttle:100/minute']
    ]
],
'security' => [
    'jwt_secret' => env('MCP_JWT_SECRET', env('APP_KEY')),
    'allowed_origins' => ['https://your-frontend.com']
]
  1. 邮件队列配置 (.env)
MAIL_MAILER=smtp
MAIL_HOST=mail.example.com
MAIL_PORT=587
MAIL_USERNAME=no-reply@example.com
MAIL_PASSWORD=yourpassword
MAIL_ENCRYPTION=tls

QUEUE_CONNECTION=redis # 使用队列发送

四、高级功能实现

  1. 邮件发送限流
// 在路由中添加限流中间件
Mcp::route()->middleware(['throttle:emails:60,1']);

// 在 AppServiceProvider 中定义限流器
RateLimiter::for('emails', function (Request $request) {
    return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
  1. 邮件追踪
// 修改邮件工具类
#[McpTool(/* ... */)]
public function send(array $params): array {
    $mail = new TransactionalEmail(/* ... */);
    
    // 添加邮件追踪ID
    $trackingId = Str::uuid();
    $mail->withSwiftMessage(function ($message) use ($trackingId) {
        $message->getHeaders()->addTextHeader('X-Mail-Tracking-ID', $trackingId);
    });

    Mail::queue($mail);
    
    return [
        'tracking_id' => $trackingId,
        // ...
    ];
}
  1. 模板预检接口
#[McpTool(
    name: "preview_template",
    description: "预览邮件模板"
)]
public function preview(string $template, array $variables = []) {
    return view('emails.' . $template, $variables)->render();
}

五、调试技巧

  1. 测试发送本地邮件
php artisan tinker
>>> Mcp::call('send_email', [
     'recipient' => 'test@localhost',
     'subject' => '测试邮件',
     'template' => 'test'
   ]);
  1. 查看邮件日志
tail -f storage/logs/mcp-*.log
# 启用调试模式
MCP_LOG_LEVEL=debug

六、安全建议

  1. 敏感操作审计
// 在工具类中添加审计日志
public function send(array $params) {
    activity('mcp_email')
        ->withProperties([
            'recipient' => $params['recipient'],
            'template' => $params['template']
        ])
        ->log('邮件发送请求');
    
    // ...发送逻辑...
}
  1. IP 白名单限制
// config/mcp.php
'security' => [
    'allowed_ips' => [
        '192.168.1.0/24',
        '172.16.0.0/12'
    ]
]

通过以上实现,您将获得一个安全可靠、支持队列发送、带有完整审计日志的 MCP 邮件服务。实际生产部署时建议:

  1. 使用 Redis 或 Horizon 管理邮件队列
  2. 配置邮件送达状态监控(如 Mailgun 或 Sendgrid 的回调)
  3. 定期审计邮件发送日志
  4. 为高风险操作添加二次确认机制
MCP协议AI领域的一项重要创新,它标准化了应用程序为大语言模型(LLM)提供上下文的方式,为AI模型与外部工具和数据源的交互提供了统一、高效、安全的解决方案[^2]。 MCP大概的工作方式为:MCP Host(如Claude Desktop、Cursor等工具)内部实现了MCP Client,MCP Client通过标准的MCP协议MCP Server进行交互。由三方开发者提供的MCP Server负责实现各种和三方资源交互的逻辑,例如访问数据库、浏览器、本地文件等,最终再通过标准的MCP协议将结果返回给MCP Client,最终在MCP Host上展示[^1]。 MCP协议具有诸多优势和实现的功能: - **优势**:提出标准化Function Calling运行规范,显著简化开发流程;客户端和服务器统一规范,避免重复开发;支持复用通用外部函数(如天气查询、网页爬虫、数据库访问等);Cursor等工具已集成MCP,支持快速接入上千个开源MCP Server,加速Agent开发[^3]。 - **实现的功能**:通过提供标准化协议,实现多个数据源和工具的单一接口以达成统一访问;可轻松添加新功能,实现即插即用扩展;支持AI与资源之间的实时双向通信,即有状态通信;AI能够即时发现和使用新工具,实现动态发现[^4]。 ```python # 此处为模拟MCP协议中Client与Server交互的简单示例代码(仅为示意,非真实完整代码) class MCPClient: def __init__(self): pass def send_request(self, request): # 模拟发送请求到MCP Server print(f"Sending request: {request} to MCP Server") def receive_response(self): # 模拟接收来自MCP Server的响应 response = "Simulated response from MCP Server" return response class MCPServer: def __init__(self): pass def handle_request(self, request): # 模拟处理来自MCP Client的请求 print(f"Received request: {request} at MCP Server") response = "Processed response" return response client = MCPClient() server = MCPServer() request = "Query database for user information" client.send_request(request) server_response = server.handle_request(request) client_response = client.receive_response() print(f"Client received response: {client_response}") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值