Простое Yii2 приложение для отправки почты

от автора

Посмотрев, как ловко принтер в офисе отправляет письма от кого угодно куда угодно, решил реализовать простой отправитель писем. Из подручных инструментов оказались Yii 2 фреймворк со встроенным в него модулем swiftmailer, виртуальная Ubuntu на VirtualBox (можно и без нее, если установить php и web-сервер локально).

Итак, начнем.

Устанавливаем basic приложение Yii 2 в папку сервера. После получения следующей картинки можно двигаться дальше:

Далее необходимо изменить конфигурационный файл приложения /config/web.php. Параметр ‘useFileTransport’ изначально выставлен в true, для целей отлова ошибок. При таком значении письма в файловом формате попадают в папку /runtime/mail. Там можно проверить основные заголовки письма и убедиться в правильности настроек.

Для корректной отправки необходимо использовать в качестве транспорта действующий почтовый сервис. Вот пример конфигурации для почты gmail.com:

//config/web.php 'mail' => [         'class' => 'yii\swiftmailer\Mailer',         'useFileTransport' => false,         'transport' => [             'class' => 'Swift_SmtpTransport',             'host' => 'smtp.gmail.com',             'username' => 'username@gmail.com',             'password' => 'password',             'port' => '587',             'encryption' => 'tls',             ],     ], 

Для отправки внутри корпоративной среды можно использовать как имя сервера, так и его IP адрес. В моем случае имеется корпоративная среда, построенная на базе продуктов Microsoft. Ее и рассматриваю в качестве примера. Если у Exchange сервера не настроена обязательная проверка пользователя, то можно совершенно ничего не указывать в полях ‘username’ и ‘password’. Однако нет гарантии, что отправленное письмо не попадет в папку «Спам» у получателя.

'mailer' => [             'class' => 'yii\swiftmailer\Mailer',             'useFileTransport' => false,             'transport' => [             'class' => 'Swift_SmtpTransport',             'host' => 'exchange.example.com', //вставляем имя или адрес почтового сервера             'username' => '',              'password' => '',             'port' => '25',             'encryption' => '',             ], ], 

Чтобы письмо не отфильтровалось антиспамом, нужно ввести доменные имя пользователя и пароль для авторизации на сервере Exchange.

Далее создадим модель MailerForm.php в папке /models:

MailerForm.php

//models/MailerForm.php  <?php  namespace app\models;  use Yii; use yii\base\Model;  class MailerForm extends Model {     public $fromEmail;     public $fromName;     public $toEmail;     public $subject;     public $body;      public function rules()     {         return [             [['fromEmail', 'fromName', 'toEmail', 'subject', 'body'], 'required'],             ['fromEmail', 'email'],             ['toEmail', 'email']         ];     }      public function sendEmail()     {         if ($this->validate()) {             Yii::$app->mailer->compose()                 ->setTo($this->toEmail)                 ->setFrom([$this->fromEmail => $this->fromName])                 ->setSubject($this->subject)                 ->setTextBody($this->body)                 ->send();              return true;         }         return false;     } } 

Сделаем представление mailer.php для формы в папке /views/site/:

mailer.php

//views/site/mailer.php  <?php  /* @var $this yii\web\View */ /* @var $form yii\bootstrap\ActiveForm */ /* @var $model app\models\MailerForm */  use yii\helpers\Html; use yii\bootstrap\ActiveForm;  $this->title = 'Mailer'; $this->params['breadcrumbs'][] = $this->title; ?> <div class="site-contact">     <h1><?= Html::encode($this->title) ?></h1>      <?php if (Yii::$app->session->hasFlash('mailerFormSubmitted')) : ?>          <div class="alert alert-success">             Your email has been sent         </div>      <?php else : ?>          <p>             This form for sending email from anywhere to anywhere         </p>          <div class="row">             <div class="col-lg-5">                  <?php $form = ActiveForm::begin(['id' => 'mailer-form']); ?>                      <?= $form->field($model, 'fromName') ?>                      <?= $form->field($model, 'fromEmail') ?>                      <?= $form->field($model, 'toEmail') ?>                      <?= $form->field($model, 'subject') ?>                      <?= $form->field($model, 'body')->textArea(['rows' => 6]) ?>                      <div class="form-group">                         <?= Html::submitButton('Submit', ['class' => 'btn btn-primary', 'name' => 'contact-button']) ?>                     </div>                  <?php ActiveForm::end(); ?>              </div>         </div>     <?php endif; ?> </div> 

Далее необходимо добавить действие в контроллере /controllers/SiteController.php. В самом начале сайта нужно не забыть добавить use app\models\MailerForm для подключения пространства имен модели MailerForm. А в самом классе добавить метод actionMailer().

<?php  namespace app\controllers;  use Yii; use yii\filters\AccessControl; use yii\web\Controller; use yii\filters\VerbFilter; use app\models\LoginForm; use app\models\ContactForm; use app\models\MailerForm; //добавляемая строка  class SiteController extends Controller { //…существующий код… public function actionMailer()     {         $model = new MailerForm();         if ($model->load(Yii::$app->request->post()) && $model->sendEmail()) {             Yii::$app->session->setFlash('mailerFormSubmitted');             return $this->refresh();         }           return $this->render('mailer', [               'model' => $model,           ]);     } //…существующий код… } 

После этих манипуляций пройдя по ссылке index.php?r=site/mailer можно попасть на форму отправки почты.

Последним штрихом добавим пункт меню для удобства пользования. В файле /views/layouts/main.php в находим следующий блок:

echo Nav::widget([         'options' => ['class' => 'navbar-nav navbar-right'],         'items' => [             ['label' => 'Home', 'url' => ['/site/index']],             ['label' => 'About', 'url' => ['/site/about']],             ['label' => 'Contact', 'url' => ['/site/contact']], 

И добавляем строчку:

['label' => 'Mailer', 'url' => ['/site/mailer']], 

Все, готово!

P.S.: Ни в коем случае не злоупотребляйте подложными письмами с поддельными отправителями. И не рассылайте спам.

Если лень все делать руками, можно просто клонировать проект из https://github.com/danvop/mailer. Там же инструкция по разворачиванию.

ссылка на оригинал статьи https://habrahabr.ru/post/280310/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *