Начало
Недавно 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}')
Письма, содержащие кириллицу, не отправятся.
Но если очень хочется
Просто оберните тему и текст в 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.
Буду очень благодарен, если вы в коментариях напишите ваши способы автоматического взаимодействия с электронной почтой. Наверняка, это кому-то очень поможет.
Если кому интересно, вот мой микросервис для отправки сообщений в телеграм бот и по электронной почте.
Комментарии (14)
Tanner
05.07.2022 16:54-4Это всё же с недавнего времени не работает. Авторизация теперь только через oAuth2. Или я что-то путаю?
vllv Автор
05.07.2022 17:12+4Все работает. Ты просто включи двухфакторную аутентификацию и появится возможность создавать пароли приложений.
vllv Автор
05.07.2022 17:17+12Ну и светить страницу с настройками безопасности, это ты лихо, конечно, придумал, дружище
des1roer
06.07.2022 13:55тоже недавно понадобилось. у гугла выключен режим разрешить меньше секюрности или как оно. с мейл.ру не взлетело, а вот яндекс - полет нормальный. там пароль ставится https://passport.yandex.ru/profile/ -> Пароли и авторизация -> Пароли приложений
JPEGEC
07.07.2022 01:27А в чем общий смысл подобного новшества от гугл? Почему просто не использовать авторизацию по обычному паролю от аккаунта?
Pinkbyte
07.07.2022 09:06Потому что гугл/mail.ru/yandex - это уже не давно не просто почтовики, это экосистемы. И утечка почтового пароля может больно ударить. Одного TLS для защиты бывает мало - downgrade-атака например. А там внутри PLAIN или LOGIN в качестве метода авторизации(мало кто заморачивается на CRAM-MD5). То есть, по факту правильно сделанный base64 от логина/пароля. Надо ли рассказывать что с этим base64-хэшем делать? :-)
Ну а требование двухфакторки для заведения дополнительного пароля - это дань современным реалиям. Хотя требовать для двухфакторки ТОЛЬКО номер телефона(привет mail.ru), похоронив возможность использования TOTP или делать свой, несовместимый ни с чем алгоритм OTP(привет Steam и Yandex) - это тоже то еще чудачество(а уж на букву "м" или нет - пусть каждый сам для себя решает)
HemulGM
Для этого есть инструкции самого гугла
Такое уже давно работает, например на mail.ru почтовых ящиках
yarkovoy
Так есть у Яндекса. Но заставить работать не получилось. Письма не уходили по причине SPAM Rejected. Вот сейчас автор показал, как это сделать у гугла (как то я пропустил про двухфакторную авторизацию) и все сразу заработало.