Отправка почты через 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. Приятного использования.
Комментарии
Без композера и расширений?
ОтветитьДа, а также без регистрации и смс)
ОтветитьПри отправке формы обратной связи проставляю имя и 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/
Спасибо, мне вполне достаточно того, чтобы по "Ответить" подставлялся нужный адрес! Проверил, работает!
ОтветитьДоброго времени суток. Подскажите в чем может возникнуть проблема. При отправке почты с использование шаблона письмо не отправляется.
на локальном сервере все нормально работает, но при переносе на хостинг нет.
А вот если без шаблона то все отправляется без проблем
Ответить
А что логи пишут?
ОтветитьПриношу извинения. Сам нашел свою ошибку. Все намного банальней, в конфиге в пути к шаблонам допустил опечатку.
ОтветитьОшибка. Connection could not be established with host smtp.mail.ru :stream_socket_client(): SSL: Удаленный хост принудительно разорвал существующее подключение.
Ответить