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

Laravel点击按钮触发邮件发送失败问题排查请求

Laravel AJAX触发邮件发送失败,但Tinker测试正常,求排查

我尝试通过点击按钮触发Laravel发送简单邮件,已编写SendVoucherEmail类、EmailController、路由、Blade模板及AJAX代码,但点击按钮时提示发送失败。不过使用php artisan tinker测试时,能正常通过Mailtrap收到邮件,请帮忙排查代码问题。


代码文件

SendVoucherEmail.php

<?php
namespace App\Mail;

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

class SendVoucherEmail extends Mailable
{
    use Queueable, SerializesModels;

    public function __construct()
    {
        //
    }

    public function build()
    {
        return $this->subject('Test Email')
                    ->text('emails.test'); // Blade template for the email body
    }
}

EmailController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Mail\SendVoucherEmail;
use Illuminate\Support\Facades\Mail;
use App\Http\Controllers\Controller;

class EmailController extends Controller
{
    public function sendEmail(Request $request)
    {
        // Retrieve the email from the request data
        $email = $request->input('email', 'test@gmail.com');

        try {
            // Send the email
            Mail::raw('This is a test email', function ($message) use ($email) {
                $message->to($email)->subject('Test Email');
            });

            return response()->json(['message' => 'Email sent successfully'], 200);
        } catch (\Exception $e) {
            return response()->json(['message' => 'Failed to send email. Error: ' . $e->getMessage()], 500);
        }
    }
}

路由定义

Route::post('send-email', [EmailController::class, 'sendEmail'])->name('send-email');

Blade邮件模板(/resources/views/email/test.blade.php)

<p>This is a test email.</p>

AJAX代码

@section('scripts')
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function() {
    // Handle button click event
    $('#sendEmailButton').click(function() {
        sendEmail();
    });

    // Function to send the email via AJAX
    function sendEmail() {
        // Make an AJAX POST request to your Laravel backend
        $.ajax({
            url: "{{ route('admin.send-email') }}",
            method: 'POST',
            data: {
                email: 'test@gmail.com' // Replace with the recipient email address
            },
            success: function(response) {
                // Handle success response
                console.log(response);
                alert('Email sent successfully!');
            },
            error: function(xhr, status, error) {
                // Handle error response
                console.error(xhr.responseText);
                alert('Failed to send email. Please try again.');
            }
        });
    }
});
</script>
@endsection

问题排查与修复方案

1. CSRF令牌缺失(最可能触发失败的原因)

Laravel默认启用CSRF保护,所有POST请求必须携带CSRF令牌,否则会被后端拦截返回419错误。

修复方式:
在AJAX请求的data中添加CSRF令牌:

data: {
    _token: "{{ csrf_token() }}",
    email: 'test@gmail.com'
},

或者全局配置AJAX请求携带令牌:
先在页面头部添加meta标签:

<meta name="csrf-token" content="{{ csrf_token() }}">

再在JS中添加全局设置:

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

2. 路由名称不匹配

路由定义的名称是send-email,但AJAX中调用的是route('admin.send-email'),名称不一致会导致404错误。

修复方式:
要么修改AJAX中的路由名称为正确值:

url: "{{ route('send-email') }}",

要么如果路由确实属于admin前缀组,调整路由定义:

Route::prefix('admin')->group(function () {
    Route::post('send-email', [EmailController::class, 'sendEmail'])->name('admin.send-email');
});

3. 邮件模板与Mailable类未被使用

当前控制器用Mail::raw直接发送文本,完全没用到你创建的SendVoucherEmail类,同时模板路径emails.test和实际文件路径email/test.blade.php(单数email)不匹配。

修复方式:
如果要使用自定义Mailable类,修改控制器代码:

try {
    Mail::to($email)->send(new SendVoucherEmail());
    return response()->json(['message' => 'Email sent successfully'], 200);
} catch (\Exception $e) {
    return response()->json(['message' => 'Failed to send email. Error: ' . $e->getMessage()], 500);
}

同时修正Mailable类中的模板路径:

return $this->subject('Test Email')
            ->text('email.test');

4. 查看详细错误日志

如果以上修复后仍有问题,直接查看storage/logs/laravel.log文件,里面会记录具体的异常信息,比如邮件发送的底层错误,帮助精准定位问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:52:37