Посмотрев, как ловко принтер в офисе отправляет письма от кого угодно куда угодно, решил реализовать простой отправитель писем. Из подручных инструментов оказались 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:
//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/:
//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/
Добавить комментарий