Полковнику никто не пишет. Отправка писем по SMTP после изменения политики Google. С примером на Python

Начало

Недавно Google изменил политику по отношению к доступу к аккаунту из неизвестных источников. Давно приходили предупреждения, но я до последнего надеялся, что обойдется и не коснется меня. Наивный.

Докатилось до меня где-то в середине июня. Однажды, смотря логи одного из моих проектов, наткнулся на ошибку авторизации при попытке отправки электронного письма.

Переписывать все под новый протокол или менять домен не очень-то хотелось. Меня же все устраивало. Так что крупные изменения оставил на крайний случай.

Настройки Google аккаунта

Да, решение находится именно здесь. Все просто, хотя я дошел до этого не сразу и именно поэтому пишу эту статью заметку.

Для начала, нужно включить двухфакторную аутентификацию в аккаунте, с которого вы собираетесь отправлять письма. Это важно.

После этого, в Chrome нажимаем на »Manage your Accounts» →Безопасность. Ищем блок »Вход в аккаунт» и нажимаем на »Пароли приложений».

Экран Экран «Пароли приложений»

В выпадашке »Приложение» выбираем »Другое», вводим имя и, наконец,»Создать».

В появившемся окне, на желтом фоне будет пароль.

Экран с паролемЭкран с паролем

Теперь этот пароль мы и будем использовать для отправки почты с помощью скрипта на вашем любимом языке программирования.

Те, кто уже использует отправку в своих проектах, просто замените пароль в конфигах. А те, кто только собираются — читайте дальше.

Пример на Python

Далее следует простейший скрипт отправки. Я убрал все (отлов исключений, логирование, цикл попыток отправки и т.д.), кроме самой сути.

import smtplib as smtp

login = 'gmail почта, с которой будет производится отправка'
password = 'пароль, который мы получили выше'

server = smtp.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(login, password)

subject = 'какая-нибудь тема письма. может быть пустой'
text = 'основной текст письма. тоже можно оставить пустым'

server.sendmail(login, 'адрес получателя', f'Subject:{subject}\n{text}')

Письма, содержащие кириллицу, не отправятся. Но если очень нужно, то вот:

Hidden text

Просто оберните тему и текст в MIMEText.

import smtplib as smtp
from email.mime.text import MIMEText
from email.header import Header

login = 'gmail почта, с которой будет производится отправка'
password = 'пароль, который мы получили выше'

server = smtp.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(login, password)

subject = 'какая-нибудь тема письма. может быть пустой'
text = 'основной текст письма. тоже можно оставить пустым'

mime = MIMEText(text, 'plain', 'utf-8')
mime['Subject'] = Header(subject, 'utf-8')

server.sendmail(login, 'адрес получателя', mime.as_string())

Заключение

В этой статье заметке был рассмотен способ востановления возможности автоматической отправки электронных писем. И приведен пример скрипта на python.

Буду очень благодарен, если вы в коментариях напишите ваши способы автоматического взаимодействия с электронной почтой. Наверняка, это кому-то очень поможет.

Если кому интересно, вот мой микросервис для отправки сообщений в телеграм бот и по электронной почте.

© Habrahabr.ru