AndreyShakhtarin
@AndreyShakhtarin
Один из Землян

Как правильно отправлять сообшения через swiftmailer Symfony2-3?

Всем Доброго времени суток! Столкнулся с новой задачей: отправка сообщений через symfony2-3:
проблема с authenticate на стороне gmail.
Что имею в наличии:
//app/config/config.yml
//настройки swiftmailer для отправки сообщения на почту:
swiftmailer:
    transport: stmt
    username: example@gmail.com
    password: password
    host: smtp.gmail.com
    port: 465
    encryption: ssl
    auth_mode:  login


для подключения и перенаправления письма нужно подключить pop-клиент.

Инсирукция POP-client:

Шаг 1. Убедитесь, что вам нужен именно POP

Для работы с почтой Gmail в сторонних клиентах можно использовать протокол IMAP или POP.

По протоколу IMAP можно работать с почтой Gmail на нескольких устройствах сразу. Письма в этом случае синхронизируются в реальном времени.

Доступ по протоколу POP можно включить только на одном компьютере. При этом письма не будут синхронизироваться в реальном времени – они будут скачиваться в клиент с той частотой, которую вы укажете.
Шаг 2. Настройте доступ по протоколу POP
Сначала настройте POP в Gmail

Откройте Gmail на компьютере.
В правом верхнем углу нажмите на значок Настройки.
Нажмите Настройки.
Откройте вкладку Пересылка и POP/IMAP.
В разделе "Доступ по протоколу POP" выберите Включить POP для всех писем или Включить POP для писем, полученных с этого момента.
Нажмите Сохранить изменения внизу страницы.

Затем настройте свой почтовый клиент

Откройте клиент (например, Microsoft Outlook) и задайте следующие параметры:
Сервер входящей почты (POP)

pop.gmail.com

Требуется SSL: да

Порт: 995
Сервер исходящей почты (SMTP)

smtp.gmail.com

Требуется SSL: да

Требуется TLS: да (при наличии)

Требуется аутентификация: да

Порт для SSL: 465

Порт для TLS/STARTTLS: 587

Если вы используете Gmail в организации или учебном заведении, введите mail.domain.com и выберите порт 110.
Время ожидания сервера Более 1 минуты (рекомендуется 5 минут)
Полное или отображаемое имя Ваше имя
Учетная запись, имя пользователя или адрес электронной почты Ваш адрес электронной почты
Пароль Ваш пароль Gmail

Необходимые настройки для отправки сообщения с проекта:

  1. параметр симфони ("коробка передач" (реле) по портам) - transport: smtp
  2. Сервер исходящей почты (SMTP) - host: smtp.gmail.com
  3. Требуется SSL: да - encryption: ssl
  4. Требуется аутентификация: да - auth_mode: login
  5. Порт для SSL: 465 - port: 465
  6. Учетная запись, имя пользователя или адрес электронной почты - username: example@gmail.com
  7. Ваш пароль Gmail - password: password

Итого результат:


swiftmailer:
    transport: stmt
    username: example@gmail.com
    password: password
    host: smtp.gmail.com
    port: 465
    encryption: ssl
    auth_mode:  login



Теперь осталось дело за малым отправить сообщение:
class SendMailController extend Controller
{
    //до сюды даже не доходит 
      $message = \Swift_Message::newInstance()
            ->setSubject('Hello Email')
            ->setFrom('example@gmail.com')
            ->setTo('anyexample@gmail.com')
            ->setBody(
                $this->renderView(
                    'AppJoboardBundle:Affiliate:email.txt.twig',
                    array('name' => 'mailer')
                )
            )
        ;
        $this->get('mailer')->send($message);
}


При отправке сообщения выходит следущее:

Failed to authenticate on SMTP server with username "example@gmail.com" using 1 possible authenticators

Из данного понятно: Неудалось аутентификацировать данного пользователь на SMTP сервере с именем пользователя (логином) "example@gmail.com" , используя 1 возможным аутентификатором. (возможно проблема здесь transport: smtp, хотя глубоко сомневаюсь ).
Как я понимаю все параметры указаны и все верно сделал, но что то упустил. Подскажите пожалуйста, что сделал не так? Как можно и нужно отправлять сообщения с проекта через symfony?
  • Вопрос задан
  • 4548 просмотров
Решения вопроса 1
AndreyShakhtarin
@AndreyShakhtarin Автор вопроса
Один из Землян
После недолгих исканий нашел решение:
В принципе все было сделано правильно за исключением одного ньюанса.
Опишу подробное описание того как я все сделал возможно кому-нибудь поможет хотя в доках все есть: ну иль почти все... "хе-хе-хе"....
первое что я сделал добавил параметры для swiftmailer:

//app/config/config.yml
...
# Swiftmailer Configuration
swiftmailer:
    transport: smtp
    username: "%mailer_user%"
    password: "%mailer_password%"
    host: "%mailer_host%"
    port: "%mailer_port%"
    encryption: "%mailer_encryption%"
    auth_mode:  "%mailer_auth_mode%"


Данные в параметры в кавычках к примеру "%mailer_auth_mode%" как ссылающий параметр к файлу с параметрами который я импортирую там же в конфигах выше:

//app/config/config.yml
imports:
    - { resource: parameters.yml }
    - { resource: security.yml }
    - { resource: services.yml }
    - { resource: "@AppJoboardBundle/Resources/config/parameter_mailer.yml" }


Далее создал файл в своем бандле как указал вышее AppJoboardBundle/Resources/config/parameter_mailer.yml
( Возможно это не из лучших практик, но мне надоело после апдейта проекта постоянно добавлять параметры, поэтому я их добавлю в свой бандл и импортирую в кофигах. )
и добавим параметры:
parameters:
    mailer_user:  example@gmail.com
    mailer_password:  password
    mailer_host: smtp.gmail.com
    mailer_port: 465
    mailer_encryption: ssl
    mailer_auth_mode:  login

Затем СОЗДАЛ НОВЫЙ АККАУНТ в gmail.com (Если честно это и была моя проблема, незнаю почему, но с аккаунтов, которые были созданы мной ранее не отправлялись письма, что б я там не делал... Может мало чего сделал :-) )
После того как создал аккаунт подключил pop-client:
( описанное мной ранее, еще раз повторюсь):

Откройте Gmail на компьютере.
В правом верхнем углу нажмите на значок Настройки.
Нажмите Настройки.
Откройте вкладку Пересылка и POP/IMAP.
В разделе "Доступ по протоколу POP" выберите Включить POP для всех писем или Включить POP для писем, полученных с этого момента.
Нажмите Сохранить изменения внизу страницы.

И в завершении остается последний шаг описать отправку в контролере:
(ну иль там где считаете справедливым )))
$message = \Swift_Message::newInstance()
            ->setSubject('Hello Email')
            ->setFrom('noreply@joboard.local')
            ->setTo('dushamoil1988@gmail.com')
            ->setBody(
                $this->renderView(
                    'AppJoboardBundle:Affiliate:email.txt.twig',
                    array('name' => 'mailer')
                )
            )
        ;
        $this->get('mailer')->send($message);

И это все, что нужно сделать для того, что б отправлять письма через swiftmailer, перенаправляя в новую созданную почту и отправлять письма на указанные адреса пользователями в вашем проекте.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@mind3
Недавно столкнулся с похожей проблемой конкретно при отправке через gmail, оказалось, требуется предоставить доступ в настройках gmail для неизвестного приложения, в данном случае вашего проекта на symfony.
Ответ написан
Ваш ответ на вопрос

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

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