Отправка почты через SMTP в Yii2 basic
Рассмотри пример отправки почты через SMTP с помощью yandex.
Открываем файл настроек /config/web.php и добавляем настройку отправки почты в элемент массива components:
<?php
$params = require(__DIR__ . '/params.php');
$config = [
//...
'components' => [
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
'viewPath' => '@app/mail',
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'smtp.yandex.ru',
'username' => '<username>@<yourDomain>',
'password' => '<userPassword>',
'port' => 465,
'encryption' => 'ssl',
],
'useFileTransport' => false,
],
],
//...
];
Где <username>@<yourDomain> - e-mail с которого будет отправлено письма (например: info@devreadwrite.com), <userpassword> - пароль от почтового ящика <username>@<yourdomain>.
Для отправки почты используем следующий код в необходимом месте:
Yii::$app->mailer->compose()
->setFrom('<fromUsername>@<yourDomain>')
->setTo('<user@Email>')
->setSubject('Уведемление с сайта <yourDomain>') // тема письма
->setTextBody('Текстовая версия письма (без HTML)')
->setHtmlBody('<p>HTML версия письма</p>')
->send();
Где <fromUsername>@<yourDomain> - e-mail отправителя (<username>@<yourDomain>), <user@Email> - e-mail получателя.
Отправка почты через SMTP в Yii2 advanced
Отправка почты через SMTP в Yii2 advanced практически не отличается от отправки в basic. Открываем файл настроек /common/config/main-local.php и добавляем настройку отправки почты в элемент массива components:
<?php
return [
'components' => [
//...
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
'viewPath' => '@common/mail',
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'smtp.yandex.ru',
'username' => '<username>@<yourDomain>',
'password' => '<userPassword>',
'port' => 465,
'encryption' => 'ssl',
],
'useFileTransport' => false,
],
],
];
И отправляем в нужном месте:
Yii::$app->mailer->compose()
->setFrom('<fromUsername>@<yourDomain>')
->setTo('<user@Email>')
->setSubject('Уведемление с сайта <yourDomain>') // тема письма
->setTextBody('Текстовая версия письма (без HTML)')
->setHtmlBody('<p>HTML версия письма</p>')
->send();
Отличия в этих примеров лишь в файлах конфигураций и значением viewPath. Приятного использования.
devreadwrite.com



Подборка адаптивных шаблонов для вашей CMS
Статьи по
Как получить и установить HTTPS сертификат на сайта

Комментарии
Без композера и расширений?
ОтветитьДа, а также без регистрации и смс)
ОтветитьПри отправке формы обратной связи проставляю имя и e-mail отправителя формы:
однако, когда письмо приходит в поле "От кого" имя подставляется, а вот e-mail остается технический/робота (с которого фактически была отправка письма).
Для отправки использую почтовик Gmail.
Как добиться того, чтобы и e-mail подставлялся из формы в поле "От кого"? Хочу, чтобы админ при нажатии на "Ответить" уже сразу писал письмо не роботу, а пользователю, отправившему фидбек.
Функция отправки сообщения:
Ответить
Если вы используете SMTP для отправки сообщения (а судя по тому, что вы отправляете сообщение через gmail, то это так), то в любом случае в поле "отправитель" будет тот ящик с которого было отправлено письмо. Единственный выход из данной проблемы это добавить ящик для ответа (метод setReplyTo), в итоге получится:
Это даст возможность при нажатии в почте на кнопку "Ответить" отправить письмо на e-mail указанный пользователем в $this->email (setReplyTo())Если же нет и вы используете обычную отправку почты, то большинство почтовых серверов (gmail, yandex, ...) завернет ваше письмо и даже не положит в спам. Это объясняется очень просто, при возможности указать любого отправителя в теле письма мошенникам будет проще запрашивать и получать необходимые данные. Соответственно при получении такого письма почтовые сервера проверяют mx, txt, cname и другие записи перед тем как положить письмо во входящие. И в таком случае они его могут отметить как фишинговые или неблагонадежные.Ответить
Я как то настраивал сервер для нормальной верификации писем отправленных с сервера через mail, нажарился прилично, после этого стараюсь использовать SMTP. Но если есть админ, то можно его дергать. Но c чужим e-mail'ом не выйдет, оно и к лучшему)
ОтветитьP.S. Проверял свои письма тут: https://www.mail-tester.com/
Спасибо, мне вполне достаточно того, чтобы по "Ответить" подставлялся нужный адрес! Проверил, работает!
ОтветитьДоброго времени суток. Подскажите в чем может возникнуть проблема. При отправке почты с использование шаблона письмо не отправляется.
Yii::$app->mailer->compose('order', compact('user', 'session', 'order', 'requisites'))
->setFrom([Yii::$app->params['supportEmail'] => Yii::$app->name])
->setTo($user->email)
->setSubject(Yii::$app->name.'. Заказ № '.$order->id.' от '.date('d.m.Y',$order->created_at).'.')
->send();
на локальном сервере все нормально работает, но при переносе на хостинг нет.
А вот если без шаблона то все отправляется без проблем
Yii::$app->mailer->compose('order', compact()
Ответить->setFrom([Yii::$app->params['supportEmail'] => Yii::$app->name])
->setTo($user->email)
->setSubject(Yii::$app->name.'. Заказ № '.$order->id.' от '.date('d.m.Y',$order->created_at).'.')
->send();
А что логи пишут?
ОтветитьПриношу извинения. Сам нашел свою ошибку. Все намного банальней, в конфиге в пути к шаблонам допустил опечатку.
ОтветитьОшибка. Connection could not be established with host smtp.mail.ru :stream_socket_client(): SSL: Удаленный хост принудительно разорвал существующее подключение.
Ответить