Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)
В этой статье мы рассмотрим API почты в веб-фреймворке Laravel. Laravel использует популярную библиотеку SwiftMailer, которая проста в использовании и поставляется с различными драйверами электронной почты на выбор. На последних этапах статьи мы подробно рассмотрим концепции, рассмотренные в первой половине статьи.
Настройка предварительных условий
Laravel реализует обертку поверх библиотеки SwiftMailer, которая упрощает настройку и использование электронной почты в одно и то же время. Настройки почты по умолчанию можно найти в config/mail.php
.
<?php return [ /* |-------------------------------------------------------------------------- | Mail Driver |-------------------------------------------------------------------------- | | Laravel supports both SMTP and PHP's "mail" function as drivers for the | sending of e-mail. You may specify which one you're using throughout | your application here. By default, Laravel is setup for SMTP mail. | | Supported: "smtp", "sendmail", "mailgun", "mandrill", "ses", | "sparkpost", "log", "array" | */ 'driver' => env('MAIL_DRIVER', 'sendmail'), /* |-------------------------------------------------------------------------- | SMTP Host Address |-------------------------------------------------------------------------- | | Here you may provide the host address of the SMTP server used by your | applications. A default option is provided that is compatible with | the Mailgun mail service which will provide reliable deliveries. | */ 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), /* |-------------------------------------------------------------------------- | SMTP Host Port |-------------------------------------------------------------------------- | | This is the SMTP port used by your application to deliver e-mails to | users of the application. Like the host we have set this value to | stay compatible with the Mailgun e-mail application by default. | */ 'port' => env('MAIL_PORT', 587), /* |-------------------------------------------------------------------------- | Global "From" Address |-------------------------------------------------------------------------- | | You may wish for all e-mails sent by your application to be sent from | the same address. Here, you may specify a name and address that is | used globally for all e-mails that are sent by your application. | */ 'from' => [ 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), 'name' => env('MAIL_FROM_NAME', 'Example'), ], /* |-------------------------------------------------------------------------- | E-Mail Encryption Protocol |-------------------------------------------------------------------------- | | Here you may specify the encryption protocol that should be used when | the application send e-mail messages. A sensible default using the | transport layer security protocol should provide great security. | */ 'encryption' => env('MAIL_ENCRYPTION', 'tls'), /* |-------------------------------------------------------------------------- | SMTP Server Username |-------------------------------------------------------------------------- | | If your SMTP server requires a username for authentication, you should | set it here. This will get used to authenticate with your server on | connection. You may also set the "password" value below this one. | */ 'username' => env('MAIL_USERNAME'), 'password' => env('MAIL_PASSWORD'), /* |-------------------------------------------------------------------------- | Sendmail System Path |-------------------------------------------------------------------------- | | When using the "sendmail" driver to send e-mails, we will need to know | the path to where Sendmail lives on this server. A default path has | been provided here, which will work well on most of your systems. | */ 'sendmail' => '/usr/sbin/sendmail -bs', /* |-------------------------------------------------------------------------- | Markdown Mail Settings |-------------------------------------------------------------------------- | | If you are using Markdown based email rendering, you may configure your | theme and component paths here, allowing you to customize the design | of the emails. Or, you may simply stick with the Laravel defaults! | */ '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
.
Вы также можете установить адрес from
, который будет использоваться при отправке писем под ключом from
. И, наконец, если вы хотите использовать рендеринг электронной почты Markdown, вы можете установить эти параметры под ключом markdown
.
Вишенка на торте - это то, что вы также можете использовать сторонние поставщики почтовых услуг, такие как Mailgun, Mandrill, SES и SparkPost. Если вы используете одну из этих служб, вам нужно убедиться, что вы установили соответствующие параметры в файле config/services.php
.
Таким образом, это было базовое введение в настройки API, связанные с почтой в Laravel. В следующем разделе мы перейдем к пользовательскому примеру, который покажет вам, как отправлять электронные письма.
Создание класса Mailable
В этом разделе мы создадим класс Mailable, который будет использоваться для отправки электронных писем. Класс Mailable отвечает за отправку писем с помощью почтовой программы, настроенной в файле config/mail.php
. Фактически, Laravel уже предоставляет команду artisan, которая позволяет нам создать базовый шаблон.
php artisan make:mail DemoEmail
Это должно создать пустой шаблон электронной почты в файле app/Mail/DemoEmail.php
, как показано в следующем фрагменте.
<?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'); } }
Давайте заменим содержимое этого файла следующим.
<?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', ]); } }
Существует два важных метода, которые класс mailable обычно реализует - __construct
и build
. Метод __construct
используется для инициализации объектов, которые предполагается использовать в шаблоне электронной почты. С другой стороны, метод build
используется для инициализации дополнительных значений, связанных с электронной почтой, таких как, шаблон просмотра, вложения и т.д.
В нашем случае мы передали объект $demo
в качестве аргумента конструктора и присвоили его публичному свойству demo
.
В методе build
мы инициализировали конфигурацию, специфичную для электронной почты.
- Параметр
from
используется для установки адреса электронной почты, который будет использоваться как адрес. - Используя метод
view
, вы можете установить шаблон электронной почты, который будет использоваться при отправке электронной почты с использованием этого mallable. В нашем случае мы установили его вmails.demo
, а это значит, что вам нужно создать файл шаблона представления вresources/views/mails/demo.blade.php
. - Затем метод
text
используется для настройки текстовой версии шаблона электронной почты. - Как мы только что обсуждали, метод
__construct
используется для настройки объектов, которые будут использоваться в шаблоне электронной почты, вы также можете использовать методwith
, который позволяет вам устанавливать данные представления сообщения. - Затем мы использовали метод
attach
для прикрепления изображения с сообщением.
Конечно, нам нужно создать шаблоны писем, которые мы должны использовать при отправке писем. Идем дальше и создаем файл resources/views/mails/demo.blade.php
, такой как показано в следующем фрагменте.
Hello <i>{{ $demo->receiver }}</i>, <p>This is a demo email for testing purposes! Also, it's the HTML version.</p> <p><u>Demo object values:</u></p> <div> <p><b>Demo One:</b> {{ $demo->demo_one }}</p> <p><b>Demo Two:</b> {{ $demo->demo_two }}</p> </div> <p><u>Values passed by With method:</u></p> <div> <p><b>testVarOne:</b> {{ $testVarOne }}</p> <p><b>testVarTwo:</b> {{ $testVarTwo }}</p> </div> Thank You, <br/> <i>{{ $demo->sender }}</i>
Кроме того, давайте создадим текстовую версию этого файла в resources/views/mails/demo_plain.blade.php
.
Hello {{ $demo->receiver }}, This is a demo email for testing purposes! Also, it's the HTML version. 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
со следующим содержимым.
<?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
, который будет использоваться для отправки электронной почты. В методе send
следующий оператор отвечает за отправку электронной почты, сначала инициализируя App\Mail\DemoEmail
Mailable.
Mail::to("receiver@example.com")->send(new DemoEmail($objDemo));
Метод to
в фасаде Illuminate\Support\Facades\Mail
возвращает экземпляр класса \Illuminate\Mail\PendingMail
, который уже содержит соответствующую почтовую программу, настроенную в файле config/mail.php
.
И, наконец, мы используем метод send
класса \Illuminate\Mail\PendingMail
, который отправляет фактическое электронное письмо.
Чтобы протестировать его, добавим связанный маршрут в файл routes/web.php
.
// Email related routes Route::get('mail/send', 'MailController@send');
И с этим вы можете открыть URL http://your-laravel-site.com/mail/send, чтобы узнать, работает ли он так, как ожидалось.
С другой стороны, если вы хотите быстро протестировать свои шаблоны электронной почты, не отправляя фактические электронные письма, в Laravel есть положение, позволяющее регистрировать все исходящие письма.
Для этого вам нужно установить значение MAIL_DRIVER
в log
в файле config/mail.php
. Затем вы можете запустить вышеупомянутый URL-адрес и проверить файл журнала, чтобы проверить, был ли там зарегистрирован шаблон электронной почты.
Если все будет хорошо, вы должны увидеть, что электронное письмо регистрируется в файле storage/logs/laravel.lo
g.
В значительной степени это касается функции почты в Laravel, и это завершает эту статью.
Заключение
Сегодня мы изучили почтовый API, который встроен в Laravel.
Начиная с базовых концепций, мы реализовали класс mailable который является важным элементом в API почты в Laravel. В конце мы также протестировали класс mailable, создав пользовательский контроллер, чтобы увидеть, действительно ли он работает.
Если вы только начинаете работу с Laravel или хотите расширить свои знания, создать свой сайт или приложение, у нас есть множество уроков и статей, которые вы можете изучать на Envato Market.
Я хотел бы узнать ваши отзывы в форме вопросов и комментариев, используя приведенный ниже канал!