В одном из моих проектов было требование отправить приветственное письмо после регистрации пользователя. Я начал гуглить и наткнулся на почтовый клиент Sendgrid. Для его использования нужна учетная запись.
Laravel предоставляет чистый API поверх популярной библиотеки SwiftMailer с драйверами для SMTP, PHP’шного mail, sendmail и прочего другого. В этом примере мы будем отправлять электронное письмо через SendGrid с использованием драйвера SMTP. За дополнительной информацией обращайтесь к документации Laravel.
Прежде чем начнем, нужно внести некоторые изменения в файл .env
MAIL_DRIVER=smtp MAIL_HOST=smtp.sendgrid.net MAIL_PORT=587 MAIL_USERNAME=sendgrid_username MAIL_PASSWORD=sendgrid_password MAIL_ENCRYPTION=tls MAIL_FROM_NAME="John Smith" MAIL_FROM_ADDRESS=from@example.com
Вы же можете настроить так, как нужно вам.
После изменения файла .env не забудьте выполнить следующую команду, она очистит кеш, и новая конфигурация будет использована вашим приложением.
php artisan config:cache
Создаем класс Mailable
php artisan make:mail WelcomeMail
В Laravel каждое письмо, отправляемое вашим приложением, использует класс Mailable
. Почтовые классы хранятся в каталоге app/Mail
. Не волнуйтесь, если у вас её пока нет. После ввода следующей команды она автоматически создастся.
php artisan make:mail WelcomeMail
WelcomeMail — это имя нашего почтового класса. Вышеуказанная команда создаст новый файл app/Mail/WelcomeEmail.php
. Он должен выглядеть примерно так:
namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; use Illuminate\Contracts\Queue\ShouldQueue; class WelcomeMail extends Mailable { use Queueable, SerializesModels; public $data; public function __construct($data) $this->data = $data; public function build() { $address = 'janeexampexample@example.com'; $subject = 'This is a demo!'; $name = 'Jane Doe'; return $this->view('emails.test') ->from($address, $name) ->cc($address, $name) ->bcc($address, $name) ->replyTo($address, $name) ->subject($subject) ->with([ 'message' => $this->data['message'] ]); } }
Создем шаблон письма
Поскольку каждое письмо обычно использует Blade шаблон для вывода содержимого, то вы получаете всю мощь и удобства Blade для создании HTML кода вашего сообщения.
Итак, давайте создадим шаблон письма в файле app/resources/views/emails/welcome.blade.php
<DOCTYPE html> <html lang=”en-US”> <head> <meta charset=”utf-8"> </head> <body> <h2>Test Email</h2> <p>{{ $message }}</p> </body> </html>
Отправка почты
В моем случае я использую UserController
для сохранения данных пользователя, давайте добавим туда код для отправки письма.
namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Mail; use App\Mail\WelcomeMail; use App\User; class UserController extends Controller { ... public function store(Request $request){ $request->validate([ 'name' => ['required', 'string', 'max:191'], 'username' => ['required', 'unique:users','max:191'], 'phone'=> ['required'], 'email' => ['required', 'string', 'email', 'max:191', 'unique:users'], 'password' => ['required', 'string', 'min:6','max:191', 'confirmed'], ]); $userreg = new User([ 'name' => $request->get('name'), 'username'=> $request->get('username'), 'phone'=> $request->get('email'), 'password' => Hash::make($request['password']), ]); $email = $request->get('email'); $data = ([ 'name' => $request->get('name'), 'email' => $request->get('email'), 'username' => $request->get('username'), 'phone' => $request->get('phone'), ]); Mail::to($email)->send(new WelcomeMail($data)); $userreg->save(); flash('User has been added!','success')->important(); return back(); } ... }
Модифицируем класс Mailable
Теперь нам нужено изменить наш почтовый класс, чтобы получать данные от контроллера. Я создаю массив $data и передаю name, email, username и phone (здесь вы можете задать нужные вам переменные).
namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; use Illuminate\Contracts\Queue\ShouldQueue; use App\User; class WelcomeMail extends Mailable { use Queueable, SerializesModels; public $data; /** * Create a new message instance. * @return void */ public function __construct($data) $this->data = $data; /** * Build the message. * @return $this */ public function build() { $subject = 'Welcome'; return $this->view('emails.welcome')->subject($subject); } }
Модифицируем шаблон письма
Давайте добавим данные в наш шаблон welcome.blade.php
. Здесь я сделаю обычный HTML-шаблон, но вы можете поискать в интернете более красивые заготовки для писем.
<DOCTYPE html> <html lang="ru"> <head> <meta charset="utf-8"> </head> <body> <h2> Привет {{$data['name']}}, мы рады, что ты с нами! Ниже приведены данные вашего аккаунта: </h2> <br> <h3>Email: </h3> <p>{{$data['email']}}</p> <h3>Username: </h3> <p>{{$data['username']}}</p> <h3>Phone: </h3><p>{{$data['phone']}}</p> </body> </html>
В приведенном выше коде я вызываю {{ $ data ['name'] }}
для того, чтобы получить переменную name
из класса Mailable
, затем я повторил то же самое с username
и phone
.
Заключение
Отправка электронной почты в Laravel очень проста, если у вас есть почтовый сервис, такой как Sendgrid. На самом деле, вы можете использовать и Gmail, но есть некоторые ньюансы, для того, чтобы это сделать. В любом случае, надеюсь, вы узнали что-то важное сегодня.
Автор: Praful Dhabekar
Перевод: Алексей Широков
Наш Телеграм-канал — следите за новостями о Laravel.