Начало

Недавно 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)


  1. HemulGM
    05.07.2022 13:34
    +5

    1. Для этого есть инструкции самого гугла

    2. Такое уже давно работает, например на mail.ru почтовых ящиках


    1. yarkovoy
      06.07.2022 07:12

      Так есть у Яндекса. Но заставить работать не получилось. Письма не уходили по причине SPAM Rejected. Вот сейчас автор показал, как это сделать у гугла (как то я пропустил про двухфакторную авторизацию) и все сразу заработало.


  1. ovitente
    05.07.2022 14:31
    +7

    А я просто скажу спасибо за простой и рабочий пример решаемой задачи.


  1. Tanner
    05.07.2022 16:54
    -4

    Это всё же с недавнего времени не работает. Авторизация теперь только через oAuth2. Или я что-то путаю?


    1. vllv Автор
      05.07.2022 17:12
      +4

      Все работает. Ты просто включи двухфакторную аутентификацию и появится возможность создавать пароли приложений.


    1. vllv Автор
      05.07.2022 17:17
      +12

      Ну и светить страницу с настройками безопасности, это ты лихо, конечно, придумал, дружище


      1. slavius
        05.07.2022 23:47
        +1

        Обычно говорят "Честным людям нечего скрывать". Ну а оппоненты предлагают разместить номер телефона и карты. Ну вот и получилось... Посмотрим. Тут главное что-бы потом @Tanner рассказал - произошло что...


        1. Tuxman
          06.07.2022 06:51
          -1

          А что он там, количество своих девайсов спалил?


          1. VaultVulp
            06.07.2022 08:50
            +1

            Телефон, почту и секретный вопрос, ответ на который можно попробовать подобрать зная регион мобильного телефона и регулярные рейсы в Москву из этого региона, например.


            1. Dmitrii_Rudko
              07.07.2022 09:06

              Еще и пароль за последние 12 лет ни разу не менялся.


      1. old_bear
        06.07.2022 10:12

        А может это такой хитрый honeypot?


  1. des1roer
    06.07.2022 13:55

    тоже недавно понадобилось. у гугла выключен режим разрешить меньше секюрности или как оно. с мейл.ру не взлетело, а вот яндекс - полет нормальный. там пароль ставится https://passport.yandex.ru/profile/ -> Пароли и авторизация -> Пароли приложений


  1. JPEGEC
    07.07.2022 01:27

    А в чем общий смысл подобного новшества от гугл? Почему просто не использовать авторизацию по обычному паролю от аккаунта?


    1. Pinkbyte
      07.07.2022 09:06

      Потому что гугл/mail.ru/yandex - это уже не давно не просто почтовики, это экосистемы. И утечка почтового пароля может больно ударить. Одного TLS для защиты бывает мало - downgrade-атака например. А там внутри PLAIN или LOGIN в качестве метода авторизации(мало кто заморачивается на CRAM-MD5). То есть, по факту правильно сделанный base64 от логина/пароля. Надо ли рассказывать что с этим base64-хэшем делать? :-)

      Ну а требование двухфакторки для заведения дополнительного пароля - это дань современным реалиям. Хотя требовать для двухфакторки ТОЛЬКО номер телефона(привет mail.ru), похоронив возможность использования TOTP или делать свой, несовместимый ни с чем алгоритм OTP(привет Steam и Yandex) - это тоже то еще чудачество(а уж на букву "м" или нет - пусть каждый сам для себя решает)