Как отправить письмо после регистрации пользователя

Отправка писем пользователю из Ларавел

В одном из моих проектов было требование отправить приветственное письмо после регистрации пользователя. Я начал гуглить и наткнулся на почтовый клиент Sendgrid. Для его использования нужна учетная запись.

Использование 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.