✅ 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:<br>';
        $message .= '<a href="'.$verification_link.'">';
        $message .= $verification_link;
        $message .= '</a>';

        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:

<form action="{{ route('subscriber_send_email') }}" method="post" class="form_subscribe_ajax">
    @csrf
    <input name="email" type="text" placeholder="Enter Email">
    <button type="submit">Subscribe</button>
</form>

<div id="ajax-loader"></div>
<div id="loader"></div>



✅ 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.');
        }
    });
});