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

Laravel联系表单邮件无法发送求助(模态框正常触发)

排查Laravel联系表单邮件未发送问题

让我们一步步梳理可能的问题点,从代码到配置逐一排查:

1. 控制器中的dd()会中断请求执行

你控制器里的dd($request->input);这行代码会直接终止请求并输出调试信息,后续的$contactus->save()和return response()->json(...)都不会执行。虽然你说模态框能正常触发,但这可能是因为你测试时注释了这行,或者AJAX的错误处理没有正确捕获异常。

解决方法:删除或注释这行dd(),确保请求能完整执行并返回正确的JSON响应。

2. 邮件发送的逻辑与Notification类检查

你当前的代码是把邮件发送给提交表单的用户(Mail::to($request->email)):

  • 如果这是设计意图,请提醒用户检查自己的垃圾邮件文件夹;
  • 如果实际需求是把表单内容发送给网站管理员,应该改为:
    Mail::to('admin@yourdomain.com')->send(new ContactUsNotification($request->all()));
    

同时要确保ContactUsNotification类正确接收并使用表单数据,比如完善构造方法和邮件内容:

// app/Notifications/ContactUsNotification.php
protected $contactData;

public function __construct($contactData)
{
    $this->contactData = $contactData;
}

public function toMail($notifiable)
{
    return (new MailMessage)
        ->subject('新的联系表单提交')
        ->line('提交者姓名:' . $this->contactData['name'])
        ->line('联系邮箱:' . $this->contactData['email'])
        ->line('主题:' . $this->contactData['topic'])
        ->line('详情:' . $this->contactData['details']);
}

3. AJAX请求的细节优化

你的JS代码有两处小问题:

  • e.preventDefault(e)写法错误,应该改为e.preventDefault();(不需要传递参数);
  • 使用$(this).serializeArray()序列化表单,虽然Laravel能解析数组格式,但更稳妥的是用$(this).serialize()生成URL编码的表单字符串,避免潜在解析问题:
    data: $(this).serialize(),
    

4. 检查Laravel日志与Mailgun配置

  • 查看Laravel日志:打开storage/logs/laravel.log,搜索与邮件相关的错误信息——即使Mailgun没有报错,Laravel可能会记录发送过程中的异常(比如Notification类的语法错误);
  • 验证Mailgun配置:确认.env文件中的配置项正确:
    MAIL_MAILER=mailgun
    MAILGUN_DOMAIN=your-valid-mailgun-domain.com
    MAILGUN_SECRET=your-mailgun-api-key
    MAIL_FROM_ADDRESS=noreply@yourdomain.com
    MAIL_FROM_NAME="${APP_NAME}"
    
    同时确保Mailgun中已完成域名验证,没有发送限制。

5. 修正请求数据的获取方式

控制器中$request->input['name']的写法不规范,Laravel的input是方法,推荐改为:

// 方式一:使用input方法
$contactus->name = $request->input('name');
// 方式二:简洁的属性访问
$contactus->name = $request->name;

6. 最简案例测试邮件发送

可以临时添加一个测试路由,直接测试邮件发送功能,确认Mailgun配置是否正常:

Route::get('/test-mail', function () {
    Mail::to('your-test-email@example.com')->send(new ContactUsNotification([
        'name' => '测试用户',
        'email' => 'test@example.com',
        'topic' => '测试主题',
        'details' => '测试详情'
    ]));
    return '邮件发送完成,请查收';
});

访问这个路由,如果邮件能收到,说明Mailgun配置正常,问题出在表单提交的逻辑中;如果还是收不到,重点排查Mailgun的域名验证、API密钥或Laravel的邮件服务配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:51:01