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

в 8:37, , рубрики: php, swiftmailer, yii, yii 2

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

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

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

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

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

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

//config/web.php
'mail' => [
        'class' => 'yiiswiftmailerMailer',
        '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' => 'yiiswiftmailerMailer',
            '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 appmodels;

use Yii;
use yiibaseModel;

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 yiiwebView */
/* @var $form yiibootstrapActiveForm */
/* @var $model appmodelsMailerForm */

use yiihelpersHtml;
use yiibootstrapActiveForm;

$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 appmodelsMailerForm для подключения пространства имен модели MailerForm. А в самом классе добавить метод actionMailer().

<?php

namespace appcontrollers;

use Yii;
use yiifiltersAccessControl;
use yiiwebController;
use yiifiltersVerbFilter;
use appmodelsLoginForm;
use appmodelsContactForm;
use appmodelsMailerForm; //добавляемая строка

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 можно попасть на форму отправки почты.

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

Последним штрихом добавим пункт меню для удобства пользования. В файле /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. Там же инструкция по разворачиванию.

Автор: danvop

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js