Посмотрев, как ловко принтер в офисе отправляет письма от кого угодно куда угодно, решил реализовать простой отправитель писем. Из подручных инструментов оказались Yii 2 фреймворк со встроенным в него модулем swiftmailer, виртуальная Ubuntu на VirtualBox (можно и без нее, если установить php и web-сервер локально).
Итак, начнем.
Устанавливаем basic приложение Yii 2 в папку сервера. После получения следующей картинки можно двигаться дальше:
Далее необходимо изменить конфигурационный файл приложения /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:
//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/:
//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 можно попасть на форму отправки почты.
Последним штрихом добавим пункт меню для удобства пользования. В файле /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