Отправка почты с формы Laravel

Знаний в Laravel пока не очень много, посему прошу помощи. Требуется отправить данные с формы по почте. Причем отправка формы со страницы уже есть, нужно отправить форму на почту, только с другими параметрами. Что сделал

  1. Создал роут.
Route::post('/send', 'MailController@send')->name('mail.send');
Route::post('/send-mail', 'MailSetting@sendForm')->name('mail.send-mail');

Первый роут уже существующий, второй мой, в принципе ничем не отличаются, только почтовые адреса будут разные. 2) Пользуюсь классом уже для созданной формы app/Mail/MailSend.php

namespace App\Mail;

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

class MailSend extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public $mailData;

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

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('mail')
            ->from('[email protected]')
            ->subject('Заявка')
            ->with($this->mailData);
    }
}
  1. Создал шаблон blade моей формы
<noindex>
    <div class="main-form">
        <h3>Моя форма</h3>
        <p></p>
        <form method="POST" action="{{route('mail.send-mail')}}" accept-charset="UTF-8" class="my-form uk-form">
                    <div class="uk-margin">
                        <input class="uk-input" placeholder="Высота забора, м*" name="height" type="text">
                        <span class="error heightError"></span>
                    </div>
                    <div class="uk-margin">
                        <input class="uk-input" placeholder="Длина забора, м*" name="length" type="text">
                        <span class="error nameError"></span>
                    </div>
                    <div class="uk-margin">
                        <input class="uk-input" placeholder="Количество калиток, шт" name="numberofwicket" type="text">
                        <span class="error lengthError"></span>
                    </div>
                    <div class="uk-margin">
                        <input class="uk-input" placeholder="Количество ворот, шт" name="numberofgates" type="text">
                        
                    </div>
                    <div class="uk-margin">
                        <input class="uk-input" placeholder="Удалённость от МКАД, км" name="distance" type="text">
                        
                    </div>                   
                    <div class="uk-margin">
                        <input class="uk-input" placeholder="Имя" name="username" type="text">
                        <span class="error usernameError"></span>
                    </div>
                    <div class="uk-margin">
                        <input class="uk-input phone_number" placeholder="+7 (___) ___-__-__" name="userphone" type="text">
                        <span class="error userphoneError"></span>
                    </div>
                    <div class="uk-margin">
                        <input class="uk-input" placeholder="e-mail" name="usermail" type="text">
                        
                    </div>
                    <div class="uk-margin uk-grid uk-grid-small">
                        <div class="uk-width-small@s">
                            <input class="btn" value="Отправить" type="submit">
                        </div>
                        <div class="uk-width-expand@s mini_text">
                            Нажимая на кнопку, вы даете согласие на обработку своих персональных данных
                        </div>
                    </div>
                    <input type="hidden" name="page" value="{{ URL::current() }}">
                </form>
    </div>
</noindex>
  1. Создал контроллер для формы указанный в роуте.
<?php

namespace App\Http\Controllers;

use App\Http\Requests\MailRequest;
use App\Mail\MailSend;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;

class MailSetting extends Controller
{

    public function sendForm(Request $request, CalcMailRequest $mailRequest)
    {
        $mailData = $request->all();
        // $mail = ['[email protected]'];
        $mail = ['[email protected]'];
        Mail::to($mail)->send(new MailSend($mailData));
        return response()->json([
            'successful'=>"<div class='message'>Спасибо, за обращение! <br> Мы ответим Вам совсем скоро.</div>"
        ]);
    }
}

Дальше возможно я не прав, по примеру первой формы, создал файл запроса в папке Requests

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class CalcmailRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        switch($this->method())
        {
            case 'GET':
            case 'DELETE':
            {
                return [];
            }
            case 'POST':
            {
                return [
                    'height' => 'required',
                    'length' => 'required',
                    'numberofwicket' => 'nullable',
                    'numberofgates' => 'nullable',
                    'distance' => 'nullable',
                    'userphone' => 'required',
                    'userphone' => 'required',
                    'useremail' => 'nullable'
                ];
            }
            default:break;
        }
    }

    public function messages()
    {
        return [
            'height.required' => '* Укажите желаемую высоту забора!',
            'length.required' => '* Укажите желаемую длинну забора!',
            'userphone.required' => '* Вы не указали телефон!',
            'username.required' => '* Укажите Ваше имя!',
        ];
    }
}
  1. Обновил font.js для вывода ошибок моей формы
if (document.querySelector(".my-form")) {
        var calcmainForm = document.querySelectorAll(".my-form");
        for(var k = 0; k < mainForm.length; k++ )
        {
            calcmainForm[k].onsubmit = function (event) {
                event.preventDefault();
                var formClass = this;
                var params = '';
                if (formClass.elements['height']) params += '&height=' + formClass.elements['height'].value;
                if (formClass.elements['length']) params += '&length=' + formClass.elements['length'].value;
                if (formClass.elements['username']) params += '&username=' + formClass.elements['username'].value;
                if (formClass.elements['userphone']) params += '&userphone=' +  formClass.elements['userphone'].value;
                if (formClass.elements['useremail']) params += '&useremail=' + formClass.elements['useremail'].value;
                if (formClass.elements['page']) params += '&page=' + formClass.elements['page'].value;
                ajaxToServer(method, uri, params, token, function () {
                    if (this.successful !== undefined) {
                        formClass.innerHTML = this.successful;
                        ym(48261257, 'reachGoal', 'forma');
                    };

                    if (this.errors.height !== undefined) {
                        formClass.querySelector('.heightError').style = 'display:block';
                        formClass.querySelector('.heightError').innerHTML = this.errors.height;
                    } else {
                        formClass.querySelector('.heightError').style = 'display:none';
                    };

                    if (this.errors.length !== undefined) {
                        formClass.querySelector('.lengthError').style = 'display:block';
                        formClass.querySelector('.lengthError').innerHTML = this.errors.length;
                    } else {
                        formClass.querySelector('.lengthError').style = 'display:none';
                    };

                    if (this.errors.username !== undefined) {
                        formClass.querySelector('.usernameError').style = 'display:block';
                        formClass.querySelector('.usernameError').innerHTML = this.errors.username;
                    } else {
                        formClass.querySelector('.usernameError').style = 'display:none';
                    };
                    if (this.errors.userphone !== undefined) {
                        formClass.querySelector('.userphoneError').style = 'display:block';
                        formClass.querySelector('.userphoneError').innerHTML = this.errors.userphone;
                    } else {
                        formClass.querySelector('.userphoneError').style = 'display:none';
                    };
                    /*if (this.errors.useremail !== undefined) {
                        formClass.querySelector('.useremailError').style = 'display:block';
                        formClass.querySelector('.useremailError').innerHTML = this.errors.useremail;
                    } else {
                        formClass.querySelector('.useremailError').style = 'display:none';
                    };*/
                });
            }
        }
    }

Но при отправке формы выводит предупреждение: The page has expired due to inactivity.

Please refresh and try again.

P.S. Простите за большое количество кода и текста, но чтобы было полное представление об ошибке и кода скидываю все что есть. Уже много просмотрел документации, но понимания ошибки не приходит пока. Прошу вашей помощи.


Ответы (1 шт):

Автор решения: Serge Koflik

Вероятнее всего, ошибка из-за отсутсвия CSRF токена.

Достаточно добавить @csrf в любой строке вашей формы:

<form method="POST" action="{{route('mail.send-mail')}}" accept-charset="UTF-8" class="my-form uk-form">
                    @csrf
                    <div class="uk-margin">
                        <input class="uk-input" placeholder="Высота забора, м*" name="height" type="text">
                        <span class="error heightError"></span>
                    </div>
                    <div class="uk-margin">
                        <input class="uk-input" placeholder="Длина забора, м*" name="length" type="text">
                        <span class="error nameError"></span>
                    </div>
                    <div class="uk-margin">
                        <input class="uk-input" placeholder="Количество калиток, шт" name="numberofwicket" type="text">
                        <span class="error lengthError"></span>
                    </div>
                    <div class="uk-margin">
                        <input class="uk-input" placeholder="Количество ворот, шт" name="numberofgates" type="text">
                        
                    </div>
                    <div class="uk-margin">
                        <input class="uk-input" placeholder="Удалённость от МКАД, км" name="distance" type="text">
                        
                    </div>                   
                    <div class="uk-margin">
                        <input class="uk-input" placeholder="Имя" name="username" type="text">
                        <span class="error usernameError"></span>
                    </div>
                    <div class="uk-margin">
                        <input class="uk-input phone_number" placeholder="+7 (___) ___-__-__" name="userphone" type="text">
                        <span class="error userphoneError"></span>
                    </div>
                    <div class="uk-margin">
                        <input class="uk-input" placeholder="e-mail" name="usermail" type="text">
                        
                    </div>
                    <div class="uk-margin uk-grid uk-grid-small">
                        <div class="uk-width-small@s">
                            <input class="btn" value="Отправить" type="submit">
                        </div>
                        <div class="uk-width-expand@s mini_text">
                            Нажимая на кнопку, вы даете согласие на обработку своих персональных данных
                        </div>
                    </div>
                    <input type="hidden" name="page" value="{{ URL::current() }}">
                </form>
→ Ссылка