Laravel — это бесплатный PHP-фреймворк с открытым исходным кодом для создания приложений, основанный на Symfony. SendGrid — это облачный SMTP-провайдер, который позволяет отправлять электронную почту без необходимости поддерживать почтовые серверы.
Наличие на вашем сайте формы обратной связи упрощает взаимодействие с вашими посетителями. Для правильной работы контактной формы и отправки электронной почты вам нужен SMTP-сервер. В этом туториале для доставки имейлов, отправленных из формы обратной связи сайта в ящик электронной почты, мы используем SendGrid и бесплатный сервис SMTP.
В этом мануале мы добавим форму обратной связи в приложение Laravel и настроим его для отправки имейлов через SMTP с помощью SendGrid.
Требования
Если у вас еще не настроено приложение Laravel, вам понадобится следующее:
- Доступ к серверу Ubuntu, пользователь sudo и активный брандмауэр. Чтобы это настроить, обратитесь к мануалу по настройке сервера Ubuntu.
- Установленный стек LEMP в соответствии с данным туториалом.
- Composer для установки Laravel и его зависимостей. Установить Composer поможет этот мануал.
- Установленный и настроенный Laravel на вашем сервере. Если Laravel у вас еще не установлен, вы можете обратиться к этому мануалу.
После настройки приложения Laravel, вам понадобится следующее:
- Учетная запись SendGrid. Посетите страницу регистрации SendGrid, чтобы зарегистрировать бесплатный аккаунт.
- Домен, указывающий на ваш сервер. В этом туториале он будет называться условно your_domain. Вы можете купить домен на Namecheap, получить его бесплатно на Freenom или использовать регистратор доменов на свое усмотрение.
1: Создание идентификатора отправителя
Для того чтобы начать отправлять имейлы с помощью SendGrid, необходимо подтвердить владение вашим доменом. Для этого зайдите в свой аккаунт SendGrid, перейдите на панель управления (Dashboard) и нажмите “Authenticate your Domain”.
Вы перейдете на страницу, где нужно будет указать ваш DNS-хост и выбрать, хотите ли вы брендировать ссылки для своего домена. Цель брендирования ссылок в имейлах — заменить ссылки, которые обычно содержат домен sendgrid.net, на ссылки, которые будут содержать ваш домен.
Затем нажмите “Next” и на следующей странице укажите свой домен.
Наконец, вам нужно будет добавить DNS-записи, предоставленные SendGrid, чтобы завершить процесс их верификации.
После добавления DNS-записи в зону DNS вернитесь в SendGrid и нажмите кнопку “Verify”.
Подтвердив SendGrid Identity, вам нужно сгенерировать ключ API, который вы будете использовать в файле .env приложения Laravel.
В меню слева выберите “API Keys”, а затем нажмите “Create API Key”. Для безопасности установите для “API Key Permissions” значение “Restricted Access”.
Затем прокрутите вниз и добавьте разрешения “Mail Send”.
Чтобы получить ключ API, нажмите “Create & View”. Этот ключ можно будет увидеть только один раз, поэтому обязательно сохраните его в надежном месте.
После настройки домена для SendGrid мы настроим данные SMTP для приложения Laravel.
2: Настройка деталей SMTP
Файл .env в Laravel используется для хранения параметров конфигурации среды вашего приложения. Поскольку в файле .env обычно содержится конфиденциальная информация (например, данные о подключении к БД), вы не должны добавлять файл .env в систему контроля версий.
Если вы выполнили предыдущий мануал, вам нужно перейти в каталог /var/www/travellist, чтобы получить доступ к файлу .env:
cd /var/www/travellist
Затем откройте файл .env с помощью любого текстового редактора:
nano .env
В файле .env есть много переменных конфигурации — в этом мануале мы изменим только MAIL_.
Для этого найдите параметры MAIL_ и настройте переменные следующим образом, добавив скопированный ключ API в sendgrid_api_key и при необходимости обновите другие выделенные поля:
. . . MAIL_MAILER=smtp MAIL_HOST=smtp.sendgrid.net MAIL_PORT=587 MAIL_USERNAME=apikey MAIL_PASSWORD=sendgrid_api_key MAIL_ENCRYPTION=tls . . .
Следующий список содержит обзор переменных, которые необходимо обновить, чтобы приложение Laravel начало использовать SMTP-сервер SendGrid:
- MAIL_HOST: имя хоста SMTP-сервера SendGrid, которое будет использоваться для отправки имейлов.
- MAIL_PORT: порт SMTP для безопасного TLS SendGrid.
- MAIL_USERNAME: ваше имя пользователя SendGrid. По умолчанию для всех учетных записей устанавливается apikey.
- MAIL_PASSWORD: ваш ключ API SendGrid.
- MAIL_ENCRYPTION: протокол шифрования почты. В данном случае вы будете использовать TLS, так как он защищает содержимое имейлов во время передачи между серверами.
Сохраните и закройте файл.
После настройки SMTP-сервера всё готово для настройки контроллера контактов.
3: Создание контроллера
Далее мы создадим контроллер (Controller), который будет обрабатывать запросы POST и GET для страницы формы обратной связи.
Вы будете использовать маршрут GET для возврата HTML-страницы, которая содержит вашу форму обратной связи, а маршрут POST будет обрабатывать отправку этой формы.
С помощью команды artisan создадим контроллер под названием ContactController в Laravel:
php artisan make:controller ContactController
После выполнения команды вы получите следующий вывод:
Controller created successfully.
Эта команда создаст новый контроллер в app/Http/Controllers/ContactController.php.
Чтобы отредактировать файл ContactController.php, выполните следующую команду:
nano app/Http/Controllers/ContactController.php
Сначала необходимо подключить фасад (facade) Mail, чтобы была возможность использовать отправку имейлов в новом контроллере. Фасад в Laravel — это класс, который предоставляет доступ к функциям Laravel. Для получения дополнительной информации о фасадах ознакомьтесь с официальной документацией Laravel.
Чтобы подключить фасад Mail, добавьте следующий код:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Mail; . . .
Затем добавим метод, который будет обрабатывать запросы GET и возвращать вид страницы контактов:
. . . class ContactController extends Controller { public function contact(){ return view('contact'); } }
Теперь добавим метод, который будет обрабатывать запросы POST и отправлять имейлы:
... class ContactController extends Controller { public function contact(){ return view('contact'); } public function contactPost(Request $request){ $this->validate($request, [ 'name' => 'required', 'email' => 'required|email', 'comment' => 'required' ]); Mail::send('email', [ 'name' => $request->get('name'), 'email' => $request->get('email'), 'comment' => $request->get('comment') ], function ($message) { $message->from('youremail@your_domain'); $message->to('youremail@your_domain', 'Your Name') ->subject('Your Website Contact Form'); }); return back()->with('success', 'Thanks for contacting me, I will get back to you soon!'); } }
В выделенных строках вам нужно будет изменить некоторые переменные, как показано ниже:
- $message->from(‘youremail@your_domain’);: замените youremail@your_domain на свой адрес электронной почты.
- $message->to(‘youremail@your_domain’, Your Name’): $message->to и $message->from не обязательно должны совпадать. Вы также можете изменить значение $message->to на другой адрес электронной почты, на который вы хотели бы получать все запросы из формы обратной связи.
- subject(‘Your Website Contact Form’);: вы можете изменить тему имейлов, отредактировав сообщение внутри метода subject.
Примечание: адрес $message->from(‘youremail@your_domain’); должен совпадать с доменом, который вы использовали в SendGrid.
После внесения этих изменений файл ContactController.php будет выглядеть следующим образом:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Mail; class ContactController extends Controller { public function contact(){ return view('contact'); } public function contactPost(Request $request){ $this->validate($request, [ 'name' => 'required', 'email' => 'required|email', 'comment' => 'required' ]); Mail::send('email', [ 'name' => $request->get('name'), 'email' => $request->get('email'), 'comment' => $request->get('comment') ], function ($message) { $message->from('youremail@your_domain'); $message->to('youremail@your_domain', 'Your Name') ->subject('Your Website Contact Form'); }); return back()->with('success', 'Thanks for contacting me, I will get back to you soon!'); } }
Сохраните и закройте файл после редактирования.
В Contact Controller есть два метода:
- contact(): этот метод возвращает Blade-шаблон представления контактной формы, который содержит макет HTML-страницы для формы обратной связи. Blade — это движок шаблонов, который поставляется с Laravel. В Blade-шаблонах вы можете добавлять свою HTML-структуру вместе с кодом PHP и синтаксисом Blade.
- contactPost(): этот метод обрабатывает все запросы формы обратной связи, где вы проводите валидацию ввода и отправляете имейлы.
Вы выполняете проверку в методе contactPost() с помощью метода $this->validate(). Внутри метода validate вы указываете, что имя, электронная почта и комментарий являются обязательными. Таким образом, пользователи не смогут отправлять пустые или неполные запросы через вашу форму. Для получения дополнительной информации о валидации ознакомьтесь с официальной документацией Laravel.
Если валидация прошла успешно, метод Mail::send() создает тело и тему вашего имейла, а затем отправляет его.
При успешной отправке имейла форма возвращает уведомление об успешном завершении, которое отображается для ваших пользователей.
Мы настроили контроллер, теперь можно перейти к маршрутам GET и POST.
4: Создание маршрутов
Маршруты Laravel позволяют создавать SEO-оптимизированные URL-адреса для вашего приложения. С помощью маршрутов Laravel можно направлять запросы приложений на контроллеры, где обрабатывается логика приложения.
Мы создадим два маршрута в файле route/web.php, чтобы использовать методы, которые мы настроили на предыдущем этапе.
Сначала давайте создадим маршрут GET, который будет связан с методом contact в ContactController. Этот метод используется для отображения страницы contact, созданной с помощью шаблонизатора Blade. Откройте файл routes/web.php с помощью следующей команды:
nano routes/web.php
Добавьте маршрут GET в конец файла:
Примечание: если вы выполнили предварительные требования, то в файле routes/web.php у вас будут другие данные. Вы можете добавить маршруты в конец этого файла.
<?php use Illuminate\Support\Facades\Route; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/contact', 'ContactController@contact')->name('contact');
Теперь добавим маршрут POST и свяжем его с методом contactPost, который будет обрабатывать отправленные пользователем данные.
<?php use Illuminate\Support\Facades\Route; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/contact', 'ContactController@contact')->name('contact'); Route::post('/contact', 'ContactController@contactPost')->name('contactPost');
Теперь, когда Controller и маршруты готовы, вы можете сохранить и закрыть файл и перейти к следующему этапу, где мы подготовим представления Blade.
5: Создание представлений Blade
Начнем с создания представления в приложении, которое будет содержать HTML-форму обратной связи. В ней будет три поля ввода:
- Поле для адреса электронной почты пользователя
- Поле для имени пользователя
- Текстовое поле для комментария
Создайте файл под названием resources/views/contact.blade.php:
nano resources/views/contact.blade.php
Затем добавьте следующее:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Contact Form with Laravel and SendGrid</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous"> </head> <body> <div class="container"> @if(session('success')) <div class="alert alert-success"> {{ session('success') }} </div> @endif <form method="POST" action="/contact"> @csrf <div class="form-group {{ $errors->has('name') ? 'has-error' : '' }}"> <label for="email">Email address</label> <input name="email" type="email" class="form-control" id="email" aria-describedby="emailHelp" placeholder="Enter your email"> <span class="text-danger">{{ $errors->first('email') }}</span> </div> <div class="form-group {{ $errors->has('name') ? 'has-error' : '' }}"> <label for="name">Name</label> <input name="name" type="text" class="form-control" id="name" aria-describedby="name" placeholder="Your name"> <span class="text-danger">{{ $errors->first('name') }}</span> </div> <div class="form-group {{ $errors->has('name') ? 'has-error' : '' }}"> <label for="exampleInputPassword1">Comment</label> <textarea name="comment" class="form-control" id="exampleFormControlTextarea1" rows="3"></textarea> <span class="text-danger">{{ $errors->first('comment') }}</span> </div> <button type="submit" class="btn btn-primary">Submit</button> </form> </div> </body> </html>
Это HTML-форма с методом POST для маршрута /contact. Когда кто-то заполняет форму обратной связи, она будет обрабатываться методом contactPost.
Тег <link> внутри тега <head> используется для подключения Bootstrap. Для HTML-формы используются стили. Вы можете изменить её стиль, чтобы он соответствовал дизайну вашего сайта.
Форма заключена в теги <div> с классами из Bootstrap. Теги <div> используются для создания структуры формы.
Читайте также: Как работает <div>, элемент разделения контента HTML
Сохраните и закройте этот файл.
Следующий этап — это представление электронной почты.
Откройте файл resources/views/email.blade.php:
nano resources/views/email.blade.php
Затем добавьте следующее:
Inquiry from: {{ $name }} <p> Email: {{ $email }} </p> <p> Message: {{ $comment }} </p>
Этот код содержит контент для письма, которое будет отправляться пользователям, заполнившим форму обратной связи. Сохраните и закройте файл.
Стилизация и представления готовы, теперь можно протестировать форму.
6: Тестирование формы обратной связи
Для тестирования в браузере перейдите по ссылке http:/your_domain/contact.
Вы увидите HTML-форму Bootstrap, которую мы создали на предыдущем этапе.
Заполните все обязательные поля и нажмите кнопку “Submit”. Вы получите уведомление об успешной отправке сообщения.
Вы можете протестировать форму, отправив ее, но при этом не заполняя ни одно из полей. Валидация, которую вы добавили в контроллер, обнаружит это и сообщит вам, что поля не могут быть пустыми:
Наконец, вы можете проверить свою электронную почту и убедиться, что вы получили тестовый имейл.
Подводим итоги
Вы успешно добавили форму обратной связи на свой сайт Laravel.
Дополнительную информацию можно найти в официальной документации Laravel.
Для обеспечения безопасности вы можете установить SSL-сертификат для своего сайта, следуя гайду по защите Nginx с помощью Let’s Encrypt.