hell0w0rd
@hell0w0rd
Просто разработчик

Как подружить swiftmailer с яндекс.пдд?

Попробовал отправить через telnet:

$ telnet smtp.yandex.ru 25<br>
Trying 77.88.21.38...<br>
Connected to smtp.yandex.ru.<br>
Escape character is '^]'.<br>
220 smtp12.mail.yandex.net ESMTP (Want to use Yandex.Mail for your domain? Visit http://pdd.yandex.ru)<br>
EHLO yandex.ru<br>
250-smtp12.mail.yandex.net<br>
250-8BITMIME<br>
250-PIPELINING<br>
250-SIZE 42991616<br>
250-STARTTLS<br>
250-AUTH LOGIN PLAIN<br>
250-DSN<br>
250 ENHANCEDSTATUSCODES<br>
AUTH LOGIN<br>
334 VXNlcm5hbWU6<br>
bWFpbEBua3QubWU=<br>
334 UGFzc3dvcmQ6<br>
*******<br>
235 2.7.0 Authentication successful.<br>
MAIL FROM:mail@nkt.me  <br>
250 2.1.0 <mail@nkt.me> ok<br>
RCPT TO:dev@nkt.me<br>
250 2.1.5 <dev@nkt.me> recipient ok<br>
DATA<br>
354 Enter mail, end with "." on a line by itself<br>
Subject: Q^BP5Q^AQ^B<br>
To: dev@nkt.me<br>
.<br>
250 2.0.0 Ok: queued on smtp12.mail.yandex.net as 6VPPHaRoyW-LYnSwHm7<br>
QUIT<br>
221 2.0.0 Closing connection.<br>
Connection closed by foreign host.<br>


Все ок, все отправилось.

Добавил в app/config/parameters.yml:

mailer_transport: smtp<br>
mailer_host:      smtp.yandex.ru<br>
mailer_user:      mail@nkt.me<br>
mailer_password:  *****<br>
mailer_auth_mode:  login<br>
mailer_encryption: ~<br>
mailer_port:       25<br>


Пробую отправить письмо:

protected function execute(InputInterface $input, OutputInterface $output)<br>
{<br>
    $mailer = $this->getContainer()->get('mailer');<br>
    $to = $input->getOption('to');<br>
    $subject = $input->getOption('subject');<br>
    $body = $input->getOption('body');<br>
    $message = \Swift_Message::newInstance()<br>
        ->setTo($to)<br>
        ->setSubject($subject)<br>
        ->setBody($body);<br>
    $output->writeln('To: ' . $to);<br>
    $output->writeln('Subject: ' . $subject);<br>
    $output->writeln('Body: ' . $body);<br>
    $output->writeln('Result: ' . $mailer->send($message));<br>
}<br>


Запускаю и результат:

$ app/console mail:send --to="dev@nkt.me" --body="Тест:)" --subject="тест"<br>
To: dev@nkt.me<br>
Subject: тест<br>
Body: Тест:)<br>
Result: 1<br>


Ну и собственно письма нет, иначе бы не написал вопрос.

С ssl и портами игрался, как понять в чем затык?
  • Вопрос задан
  • 10696 просмотров
Решения вопроса 1
hell0w0rd
@hell0w0rd Автор вопроса
Просто разработчик
Оказывается вот как надо:
protected function execute(InputInterface $input, OutputInterface $output)
{
    $mailer = $this->getContainer()->get('mailer');
    $transport = $mailer->getTransport();
    $transport->start();
    $message = \Swift_Message::newInstance(
        $input->getOption('subject'),
        $input->getOption('body'),
        $input->getOption('content-type'),
        $input->getOption('charset')
    )
        ->setFrom(['mail@nkt.me' => 'Admin'])
        ->setTo($input->getOption('to'));
    $output->writeln(sprintf('Sent %s emails', $transport->send($message)));
    $transport->stop();
}

Смысл в start-stop
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
keltanas
@keltanas
Software Developer
В общем я не совсем понял, что ты хочешь сделать и что этим добился. Но я действую так:
config.yml
swiftmailer:
    transport: %mailer_transport%
    host:      %mailer_host%
    port:      %mailer_port%
    username:  %mailer_user%
    encryption: %mailer_encryption%
    auth_mode:  %mailer_auth_mode%
    password:  %mailer_password%
    spool: 
        type: file
        path: "%kernel.root_dir%/../spool"

parameters.yml
parameters:
    mailer_transport: smtp
    mailer_host: smtp.yandex.ru
    mailer_user: *****@********
    mailer_password: *********
    mailer_encryption: ssl
    mailer_auth_mode: login
    mailer_port: 465


Дальше в коде отправляешь просто:
$this->get('mailer')->send($message);

А в крон впендюриваешь с абсолютными путями:
php app/console swiftmailer:spool:send --env=prod

Все, Профит.
Ответ написан
Комментировать
jetfx
@jetfx
Если будете пробовать подружить Symfony 5.2 Mailer с Яндекс Почтой:

1. Устанавливаете бандл по инструкции: https://symfony.com/doc/current/mailer.html
2. Создаёте аккаунт в Яндекс Почте.
3. Настраиваете Яндекс Почту. С паролем от вашей почты Яндекс не пустит в целях безопасности. Поэтому чтобы подключиться к SMTP извне, вам нужен пароль приложения. Создать его можно в настройках:

Почта -> Все настройки -> Безопасность -> пароли приложений

60485519db506674760280.png
4. В самом проекте в конфигурационный файл .env добавляете строку:

MAILER_DSN=smtp://login:password@smtp.yandex.ru:465

где login - часть вашей почты перед собакой (т.е. login@yandex.ru), password - пароль приложения, созданный на шаге 3.

5. Если после всех настроек в Symfony возникает ошибка:

smtp yandex Error: authentication failed: This user does not have access rights to this service

Заходите в

Почта -> Все настройки -> Почтовые программы

и ставьте галочку напротив IMAP, как на картинке:
60485380c0fcd631711369.png
Ответ написан
Побробуйте указать From равным логину.
Ответ написан
tyomo4ka
@tyomo4ka
Попробуй запустить команду в prod режиме вместо dev ;)
Ответ написан
@Dimon_led
Внимание не MAILER_DSN=smtp://login:password@smtp.yandex.ru:465
а MAILER_DSN=smtps://login:password@smtp.yandex.ru:465
во всяком случае по порту 465
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы