Блог Андрея

 
 

Конфигурация Swiftmailer для gmail в проекте Symfony 3

Конфигурируем swiftmailer через .env и через swiftmailer.yaml файлы. Рассмотрены оба этих разных варианта.

Пример строки MAILER_URL для gmail.

Проект Symfony 3.4 на примере которого я описываю использование кэша второго уровня создан из консоли с помощью Symfony cli 4.3, я не исключаю, что это вносит свои нюансы, потому что в официальной документации Symfony версии 3.4 приведена только конфигурация непосредственно в yaml файле, но как оказалось мы можем сконфигурировать и в .env файле (так, как это описано в официальной документации Symfony для более поздних версий).

Это важно, потому что чем меньшее число файлов конфигурации содержат настройки, которые разнятся от сервера разработки к серверу тестирования и продакшена, тем проще поддерживать проект.

Итак, начну с примера, который приведен в документации Symfony 3.4, а именно с файла config/packages/swiftmailer.yaml.

По умолчанию он имеет такой вид:

swiftmailer:
    url: '%env(MAILER_URL)%'
    spool: { type: 'memory' }
 

Вы можете изменить его таким образом:

swiftmailer:
    transport: gmail
    username: yourbox@gmail.com
    password: yourpassword

После этого метод контроллера

    /**
         *
	 * @Route("/training/sendemail")
	*/
	public function sendTestEmail()
	{
		$msg = new Swift_Message();
		$msg->setSubject('Symtest');
		$msg->setBody('Привет! Hello! Hola! Salam!', 'text/html', 'UTF-8');
		$msg->setFrom(['yourbox@gmail.com' => 'yourbox@gmail.com']);
		$msg->setTo(['yourotherbox@mail.ru' => 'yourotherbox@mail.ru']);
		$this->get('mailer')->send($msg);
		return $this->render('empty.html.twig', ['res' => []]);
	}

должен отправлять письма.

Если письма не отправляются, надо разрешить в настройках аккаунта gmail отправку писем сторонними приложениями.
Приводить инструкцию не вижу смысла, так как google очень резво изменяет свои пользовательские интерфейсы, ищите и найдёте.

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

Итак, письмо пришло, можно радоваться, но мне не радостно. Потому что на сервере разработчика параметры почтового ящика должны быть другими, а это значит что после каждой публикации правок придётся контролировать файл config/packages/swiftmailer.yaml.

При том, что соединение с базой данных прописано в env файле

- итого, у нас уже два файла, которые мы должны исключить из-под контроля git. Думаю, очевидно, что если мы ограничимся исключением одного файла, это всё упрощает.

Вернём файл config/packages/swiftmailer.yaml в исходное состояние и откроем файл .env.

Строку

MAILER_URL=gmail://username:password@localhost

раскомментируем и приведём в вид

MAILER_URL=gmail://yourbox:password@localhost

Да, username тут указывается без @gmail.com.

Да, localhost тут можно (возможно, даже нужно) оставить без изменений.

Вариант

MAILER_URL=smtp://smtp.gmail.com:587?encryption=tls&auth_mode=login&username=yourbox&password=yourpassword

также оказался вполне рабочим 09 ноября 2019 года.