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
相关产品推荐
相关产品推荐

