В одном из моих проектов было требование отправить приветственное письмо после регистрации пользователя. Я начал гуглить и наткнулся на почтовый клиент 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.
