✅ Route: Route::post('/subscriber/send-email', [FrontController::class, 'subscriber_send_email'])->name('subscriber_send_email'); Route::get('/subscriber/verify/{email}/{token}', [FrontController::class, 'subscriber_verify'])->name('subscriber_verify'); ✅ Controller: use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Validator; public function subscriber_send_email(Request $request) { $validator = Validator::make($request->all(),[ 'email' => 'required|email|unique:subscribers,email' ]); if(!$validator->passes()) { return response()->json(['code'=>0,'error_message'=>$validator->errors()->toArray()]); } else { $token = hash('sha256', time()); $obj = new Subscriber(); $obj->email = $request->email; $obj->token = $token; $obj->status = 0; $obj->save(); $verification_link = url('subscriber/verify/'.$request->email.'/'.$token); // Send email $subject = 'Subscriber Verification'; $message = 'Please click on the link below to confirm subscription:
'; $message .= ''; $message .= $verification_link; $message .= ''; Mail::to($request->email)->send(new Websitemail($subject,$message)); return response()->json(['code'=>1,'success_message'=>'Please check your email to confirm subscription']); } } public function subscriber_verify($email,$token) { $subscriber_data = Subscriber::where('email',$email)->where('token',$token)->first(); if($subscriber_data) { $subscriber_data->token = ''; $subscriber_data->status = 1; $subscriber_data->update(); return redirect()->route('home')->with('success', __('Your subscription is verified successfully!')); } else { return redirect()->route('home'); } } ✅ View:
@csrf
✅ css #ajax-loader { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.5); z-index: 9999; } #ajax-loader:before { content: ''; position: absolute; top: 50%; left: 50%; width: 40px; height: 40px; margin: -20px 0 0 -20px; border: 4px solid #fff; border-top-color: transparent; border-radius: 50%; animation: spin 1s linear infinite; } #loader { display: none; position: fixed; top: 0; left: 0; right: 0; bottom: 0; width: 100%; background: rgba(0,0,0,0.75) url(loading.gif) no-repeat center center; z-index: 10000; } ✅ main.js $(".form_subscribe_ajax").on('submit', function(e){ e.preventDefault(); $('#ajax-loader').show(); var form = this; $.ajax({ url:$(form).attr('action'), method:$(form).attr('method'), data:new FormData(form), processData:false, dataType:'json', contentType:false, beforeSend:function(){ //$(form).find('span.error-text').text(''); }, success:function(data) { $('#ajax-loader').hide(); if(data.code == 0) { if (typeof data.error_message === 'string') { alert(data.error_message); } else { $.each(data.error_message, function(prefix, val) { $(form).find('span.'+prefix+'_error').text(val[0]); alert(val[0]); }); } } else if(data.code == 1) { $(form)[0].reset(); alert(data.success_message); } }, error:function() { $('#ajax-loader').hide(); alert('Request failed. Please try again.'); } }); });