Статьи

Как отправлять электронные письма в Laravel

В этой статье мы собираемся исследовать Mail API в веб-фреймворке Laravel. Laravel использует преимущества популярной библиотеки SwiftMailer, которая проста в использовании и поставляется с различными драйверами электронной почты на выбор. На последних этапах статьи мы подробно рассмотрим концепции, обсуждавшиеся в первой половине статьи.

Laravel реализует оболочку поверх библиотеки SwiftMailer, которая делает управление электронной почтой очень простым в настройке и использовании одновременно. Вы можете найти настройки почты по умолчанию в config/mail.php .

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<?php
 
return [
 
    /*
    |—————————————————————————
    |
    |—————————————————————————
    |
    |
    |
    |
    |
    |
    |
    |
    */
 
    ‘driver’ => env(‘MAIL_DRIVER’, ‘sendmail’),
 
    /*
    |—————————————————————————
    |
    |—————————————————————————
    |
    |
    |
    |
    |
    */
 
    ‘host’ => env(‘MAIL_HOST’, ‘smtp.mailgun.org’),
 
    /*
    |—————————————————————————
    |
    |—————————————————————————
    |
    |
    |
    |
    |
    */
 
    ‘port’ => env(‘MAIL_PORT’, 587),
 
    /*
    |—————————————————————————
    |
    |—————————————————————————
    |
    |
    |
    |
    |
    */
 
    ‘from’ => [
        ‘address’ => env(‘MAIL_FROM_ADDRESS’, ‘hello@example.com’),
        ‘name’ => env(‘MAIL_FROM_NAME’, ‘Example’),
    ],
 
    /*
    |—————————————————————————
    |
    |—————————————————————————
    |
    |
    |
    |
    |
    */
 
    ‘encryption’ => env(‘MAIL_ENCRYPTION’, ‘tls’),
 
    /*
    |—————————————————————————
    |
    |—————————————————————————
    |
    |
    |
    |
    |
    */
 
    ‘username’ => env(‘MAIL_USERNAME’),
 
    ‘password’ => env(‘MAIL_PASSWORD’),
 
    /*
    |—————————————————————————
    |
    |—————————————————————————
    |
    |
    |
    |
    |
    */
 
    ‘sendmail’ => ‘/usr/sbin/sendmail -bs’,
 
    /*
    |—————————————————————————
    |
    |—————————————————————————
    |
    |
    |
    |
    |
    */
 
    ‘markdown’ => [
        ‘theme’ => ‘default’,
 
        ‘paths’ => [
            resource_path(‘views/vendor/mail’),
        ],
    ],
 
];

Когда дело доходит до отправки почты, Laravel поддерживает различные драйверы на выбор. Как видите, по умолчанию MAIL_DRIVER установлен на smtp .

Если вы собираетесь использовать драйвер smtp для отправки почты, вам также потребуется установить другие связанные параметры, такие как MAIL_HOST , MAIL_PORT , MAIL_ENCRYPTION , MAIL_USERNAME и MAIL_PASSWORD .

С другой стороны, если вы собираетесь использовать драйвер sendmail , вы должны убедиться, что системный путь sendmail установлен в правильное значение в файле config/mail.php .

Вы также можете установить адрес отправителя, который будет использоваться при отправке писем под ключом отправителя. И, наконец, если вы хотите использовать рендеринг электронной почты на основе Markdown, вы можете установить эти настройки под ключом markdown .

Суть в том, что вы также можете использовать сторонних поставщиков услуг электронной почты, таких как Mailgun, Mandrill, SES и SparkPost. Если вы используете один из этих сервисов, вам необходимо убедиться, что вы установили соответствующие настройки в файле config/services.php .

Это было базовое введение в настройки почтового API в Laravel. В следующем разделе мы рассмотрим пользовательский пример, показывающий, как отправлять электронные письма.

В этом разделе мы создадим почтовый класс, который будет использоваться для отправки электронных писем. Почтовый класс отвечает за отправку электронных писем с использованием почтовой программы, настроенной в файле config/mail.php . Фактически, Laravel уже предоставляет команду ремесленника, которая позволяет нам создавать базовый шаблон.

1
php artisan make:mail DemoEmail

Это должно создать пустой шаблон электронной почты в app/Mail/DemoEmail.php , как показано в следующем фрагменте.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
 
namespace App\Mail;
 
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
 
class DemoEmail extends Mailable
{
    use Queueable, SerializesModels;
 
    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }
 
    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view(‘view.name’);
    }
}

Давайте заменим содержимое этого файла следующим.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
 
namespace App\Mail;
 
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
 
class DemoEmail extends Mailable
{
    use Queueable, SerializesModels;
     
    /**
     * The demo object instance.
     *
     * @var Demo
     */
    public $demo;
 
    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($demo)
    {
        $this->demo = $demo;
    }
 
    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->from(‘sender@example.com’)
                    ->view(‘mails.demo’)
                    ->text(‘mails.demo_plain’)
                    ->with(
                      [
                            ‘testVarOne’ => ‘1’,
                            ‘testVarTwo’ => ‘2’,
                      ])
                      ->attach(public_path(‘/images’).’/demo.jpg’, [
                              ‘as’ => ‘demo.jpg’,
                              ‘mime’ => ‘image/jpeg’,
                      ]);
    }
}

Есть два важных метода, которые обычно реализует почтовый класс — __construct и build . Метод __construct используется для инициализации объектов, которые вы должны использовать в шаблоне электронной почты. С другой стороны, метод build используется для инициализации большего количества специфичных для электронной почты значений, таких как from, просмотра шаблона, вложений и тому подобного.

В нашем случае мы передали объект $demo в качестве аргумента конструктора, и он назначен общедоступному свойству demo .

В методе build мы инициализировали конфигурацию, специфичную для электронной почты.

  • Адрес from используется для установки адреса электронной почты, который будет использоваться как адрес отправителя.
  • Используя метод view , вы можете установить шаблон электронной почты, который будет использоваться при отправке электронной почты с использованием этого почтового сообщения. В нашем случае мы установили его на mails.demo , и это означает, что вам нужно создать файл шаблона представления по адресу resources/views/mails/demo.blade.php .
  • Далее, text метод используется для настройки простой текстовой версии шаблона электронной почты.
  • Как мы только что обсудили, метод __construct используется для настройки объектов, которые будут использоваться в шаблоне электронной почты, вы также можете использовать метод with который позволяет вам установить данные представления сообщения.
  • Далее мы использовали метод attach, чтобы прикрепить изображение с сообщением.

Конечно, нам нужно создавать шаблоны электронной почты, которые мы должны использовать при отправке электронной почты. Создайте файл resources/views/mails/demo.blade.php как показано в следующем фрагменте.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
Hello <i>{{ $demo->receiver }}</i>,
<p>This is a demo email for testing purposes!
 
<p><u>Demo object values:</u></p>
 
<div>
<p><b>Demo One:</b>&nbsp;{{ $demo->demo_one }}</p>
<p><b>Demo Two:</b>&nbsp;{{ $demo->demo_two }}</p>
</div>
 
<p><u>Values passed by With method:</u></p>
 
<div>
<p><b>testVarOne:</b>&nbsp;{{ $testVarOne }}</p>
<p><b>testVarTwo:</b>&nbsp;{{ $testVarTwo }}</p>
</div>
 
Thank You,
<br/>
<i>{{ $demo->sender }}</i>

Кроме того, давайте создадим текстовую версию этого файла в resources/views/mails/demo_plain.blade.php .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
Hello {{ $demo->receiver }},
This is a demo email for testing purposes!
 
Demo object values:
 
Demo One: {{ $demo->demo_one }}
Demo Two: {{ $demo->demo_two }}
 
Values passed by With method:
 
testVarOne: {{ $testVarOne }}
testVarOne: {{ $testVarOne }}
 
Thank You,
{{ $demo->sender }}

Так что это был класс mailable в вашем распоряжении, а мы еще не закончили, так как нам нужно использовать фасад Mail для фактической отправки почты. В следующем разделе мы рассмотрим, как вы можете использовать Mail Facade для отправки электронных писем с помощью класса DemoEmail Mailable, который был только что создан в этом разделе.

В этом разделе мы создадим пример, чтобы продемонстрировать, как вы можете использовать класс Mailable , созданный в последнем разделе.

Давайте создадим файл контроллера в app/Http/Controllers/MailController.php со следующим содержимым.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
<?php
namespace App\Http\Controllers;
 
use App\Http\Controllers\Controller;
use App\Mail\DemoEmail;
use Illuminate\Support\Facades\Mail;
 
class MailController extends Controller
{
    public function send()
    {
        $objDemo = new \stdClass();
        $objDemo->demo_one = ‘Demo One Value’;
        $objDemo->demo_two = ‘Demo Two Value’;
        $objDemo->sender = ‘SenderUserName’;
        $objDemo->receiver = ‘ReceiverUserName’;
 
        Mail::to(«receiver@example.com»)->send(new DemoEmail($objDemo));
    }
}

Важно отметить, что мы включили Illuminate\Support\Facades\Mail Facade, который будет использоваться для отправки электронного письма. В методе send следующий оператор отвечает за отправку электронной почты, инициализируя App\Mail\DemoEmail Mailable в первую очередь.

1
Mail::to(«receiver@example.com»)->send(new DemoEmail($objDemo));

Метод to в Illuminate\Support\Facades\Mail Facade возвращает экземпляр класса \Illuminate\Mail\PendingMail , который уже содержит соответствующую почтовую программу, настроенную в файле config/mail.php .

И, наконец, мы используем метод send класса \Illuminate\Mail\PendingMail который отправляет реальное письмо.

Чтобы проверить это, давайте добавим связанный маршрут в файл routes/web.php .

1
2
// Email related routes
Route::get(‘mail/send’, ‘MailController@send’);

И с этим на месте, вы можете запустить http://your-laravel-site.com/mail/send URL, чтобы увидеть, работает ли он, как ожидалось.

С другой стороны, если вы хотите быстро протестировать свои шаблоны электронной почты, не отправляя настоящие электронные письма, в Laravel есть средство, позволяющее регистрировать все исходящие электронные письма.

Для этого вам нужно установить значение MAIL_DRIVER для log в файл config/mail.php . Затем вы можете запустить вышеупомянутый URL и проверить файл журнала, чтобы проверить, не был ли зарегистрирован шаблон электронной почты.

Если все идет хорошо, вы должны увидеть, что электронное письмо регистрируется в файле storage/logs/laravel.log .

В значительной степени это касается почтовой функции в Laravel, и на этом мы заканчиваем эту статью.

Сегодня мы рассмотрели почтовый API, встроенный в Laravel, и он также поддерживает различные драйверы.

Начав с базовых концепций, мы реализовали почтовый класс, который является важным элементом почтового API в Laravel по мере нашего продвижения. В конце мы также проверили почтовый класс, создав собственный контроллер, чтобы увидеть, действительно ли он работает.

Если вы только начинаете работать с Laravel или хотите расширить свои знания, сайт или приложение с помощью расширений, у нас есть множество вещей, которые вы можете изучить на Envato Market .

Я хотел бы знать ваши отзывы в виде запросов и комментариев, используя канал ниже!