Как продолжать использовать msmtp OAuth 2.0 для Gmail в mutt после прекращения поддержки oob?

Содержание
  1. Вопрос или проблема
  2. Предыстория
  3. Отправка электронной почты с помощью msmtp, до сих пор
  4. 1 подготовка – получение моих учетных данных OAuth 2.0 для Gmail
  5. 2 подготовка – настройка msmtprc
  6. 3 использование – отправка электронной почты из командной строки, до сих пор
  7. Теперь oob больше не допускается
  8. Как продолжить отправлять с msmtp?
  9. Решение getmail6
  10. 1 получите свой Идентификатор клиента и Секрет OAuth 2.0
  11. 2 получите ваш access_token (и refresh_token) OAuth 2.0
  12. 1 создайте свой (секретный) json
  13. 2 получите ваш access_token (и refresh_token)
  14. 3 измените ваш ~/.msmtprc
  15. 4 отправьте тестовое письмо
  16. Возможный путь mutt_oauth2.py тоже не работает
  17. для моего обычного аккаунта Gmail
  18. для моего обычного аккаунта Microsoft
  19. заключение: mutt больше не является опцией для обычных учетных записей Google или Microsoft
  20. Ответ или решение
  21. Как продолжить использовать msmtp с OAuth 2.0 для Gmail в mutt после отказа от метода OOB
  22. 1. Получение учетных данных OAuth 2.0
  23. 2. Генерация токенов доступа и обновления
  24. 3. Конфигурация msmtp
  25. 4. Тестирование отправки электронных писем
  26. Заключение

Вопрос или проблема

Предыстория

В течение двух лет я с удовольствием получал доступ к своим аккаунтам Gmail с помощью neomutt.

Я синхронизирую данные между neomutt локально и своим онлайн-аккаунтом Gmail с помощью mbsync и пароля приложения “Двухэтапная проверка” (Войти с помощью паролей приложений).

Отправка электронной почты с помощью msmtp, до сих пор

Чтобы отправить Gmail с помощью neomutt, это сложнее, потому что msmtp требует действительный токен из Gmail API. К счастью, пользователь GitHub tenllado предоставил единственное работающее решение с открытым исходным кодом, которое мне удалось найти, его скрипт oauth2token. Я адаптировал его как oauth2tool.sh. Шаги, необходимые для этого, следующие:

1 подготовка – получение моих учетных данных OAuth 2.0 для Gmail

  1. Используйте Python Quickstart для получения своих учетных данных, которые выглядят так:
    • мой Идентификатор клиента: xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com
    • мой Секрет клиента: xxxxxxxxxxxxxxxxxxxxxxxx
  2. Скопируйте oauth2.py (Код “токен обновления действует бессрочно”).
  3. Получите бессмертный токен обновления: $ python2 oauth2.py [email protected] --client_id=<myCI> --client_secret=<myCS> --generate_oauth2_token и следуйте инструкциям. Это выглядит так:
    • токен обновления: 1//03xxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxx

2 подготовка – настройка msmtprc

account my
auth oauthbearer
host smtp.gmail.com
port 587
from [email protected]
user [email protected]
passwordeval bash oauth2tool.sh my

3 использование – отправка электронной почты из командной строки, до сих пор

Теперь, когда я отправляю электронное письмо echo "test" | msmtp -a my <target_email>, мой oauth2tool.sh вытаскивает действительный токен. Он делает это, извлекая токен с помощью pass, если он не истек, в противном случае он получает новый с помощью python2 oauth2.py [email protected] --client_id=<myCI> --client_secret=<myCS> --refresh_token=<myRT>.

С этим я мог легко отправлять электронные письма со своих аккаунтов Gmail из командной строки, до сих пор.

Теперь oob больше не допускается

Теперь мои когда-то бессмертные токены обновления истекают, и я не могу продлить их, потому что oauth2.py Gmail использует redirect_uri = urn:ietf:wg:oauth:2.0:oob, которая устарела.

Улучшение безопасности взаимодействий с Google OAuth, используя более безопасные потоки OAuthOAuth поток вне канала (oob) будет снят с поддержки”.

Как продолжить отправлять с msmtp?

OAuth 2.0 для мобильных и настольных приложений “Циклический IP-адрес (macOS, Linux, Windows desktop)” кажется, что это путь вперед, но мне нужно несколько недель свободного времени, которого у меня нет, чтобы выяснить, как. Есть ли идеи?

Связанный вопрос: Google Cloud: OAuth-клиенты в тестовом режиме, которые используют поток OAuth OOB.

Решение getmail6

getmail6 частично решает эту проблему для GmailMicrosoft Office 365) с помощью своего Python скрипта getmail-gmail-xoauth-tokens, хотя с огромным предупреждением о том, что Gmail API теперь ограничивает ваш токен обновления всего на 1 час, так что последний шаг, описанный ниже, с коротким взаимодействием с браузером и генерацией оповещений безопасности Google, потребуется регулярно повторять, что делает это решение малопрактичным. (getmailrc-examples предупреждает об этом – “К сожалению… необходимо повторять регулярно.”) Узнав об этом, я успешно следовал инструкциям Акканы Пек, Отправка почты через Gmail с использованием OAuth2 (выпуск 2022) (как было предложено в комментарии от @GuenterRoeck).

1 получите свой Идентификатор клиента и Секрет OAuth 2.0

(Примечание: Это может быть не единственный или лучший путь, но он работает. В 2020 году я получил эти учетные данные более легким способом по сейчас устаревшему маршруту, описанному в OP, и они по-прежнему действительны.)

  1. Перейдите на Создать проект Google Cloud и, как там указано, откройте консоль Google Cloud, которая расскажет вам, как перейти к Новому проекту, где вам нужно выбрать Название проекта – я выбрал getmail6.
  2. В APIs & Services выберите Включенные APIs и сервисы и нажмите + ВКЛЮЧИТЬ APIs И СЕРВИСЫ.
  3. Выберите Gmail API и ВКЛЮЧИТЬ его.
  4. Выберите Учетные данные и нажмите + СОЗДАТЬ УЧЕТНЫЕ ДАННЫЕ, чтобы перейти к Создать Идентификатор клиента OAuth, где вы нажимаете Настроить экран согласия, где, похоже, нам нужно продолжить, как если бы мы были создателями приложений, что мне кажется абсурдным, но выбора нет. Не являясь пользователем Google Workspace, я был вынужден выбрать Внешний (“Доступен любому тестовому пользователю с учетной записью Google. Ваше приложение начнет работать в тестовом режиме и будет доступно только пользователям, которых вы добавите в список тестовых пользователей. Как только ваше приложение будет готово к развертыванию, вам может потребоваться подтвердить приложение.”). Затем нам необходимо определить наше вымышленное Название приложения – я выбрал “msmtpGmail”, и наш Электронный адрес поддержки пользователей, который является электронной почтой той учетной записи, из которой вы все это делаете, также для нашего Контактная информация разработчика. Затем Сохранить и продолжить.
  5. Вернитесь к Создать Идентификатор клиента OAuth для Типа приложения – я выбрал Настольное приложение, и Название – я выбрал “msmtp”, что, наконец, дало мне мой Идентификатор клиента и Секрет клиента. Я скачал их как client_secret_nnnnnnnnnnnn-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com.json и надежно сохранил.
  6. Важный последний шаг – добавить себя в Тестовые пользователи (потому что Google этого не сделал для вас) на экране согласия OAuth.

2 получите ваш access_token (и refresh_token) OAuth 2.0

Здесь мы используем часть тяжелой работы getmail6. Вам понадобится их getmail-gmail-xoauth-tokens Python скрипт.

1 создайте свой (секретный) json

Как указано в getmailrc-examples (- воспользуйтесь поиском по “mail.google.com”), создайте следующий JSON – я назвал свой getmail6.json:

{"scope": "https://mail.google.com/",
"user": "[email protected]",
"client_id": "ваш",
"client_secret": "ваш",
"token_uri": "https://accounts.google.com/o/oauth2/token",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs"}

– заполните ваш

2 получите ваш access_token (и refresh_token)

python3 getmail-gmail-xoauth-tokens --init your.json (замените your) > “Google не проверил это приложение” > Продолжить > “<yourApp> хочет доступ к вашей учетной записи Google” > Продолжить, что добавляет в your.json следующие строки:

"access_token": "<очень_длинный_ключ>",
"expires_at": <сейчас+3600s>,
"refresh_token": "<другой_очень_длинный_ключ>"}

– которые и были теми самыми, что мы искали, но это 1-часовое время действия действительно очень неудобно…

3 измените ваш ~/.msmtprc

Опять же, используя getmail-gmail-xoauth-tokens:

tls on
tls_trust_file  /etc/ssl/certs/ca-certificates.crt
logfile ~/.msmtp.log
account ваш
auth oauthbearer
host smtp.gmail.com
port 587
from [email protected]
user [email protected]
passwordeval python3 getmail-gmail-xoauth-tokens your.json

– замените все упоминания ваш.

4 отправьте тестовое письмо

Быстро, у вас есть час до истечения срока действия вашего токена обновления (измените ваш):

echo "тест отправки от msmtp с использованием OAuth 2.0 Gmail" | msmtp -a ваш <a_target_email>

Возможный путь mutt_oauth2.py тоже не работает

Я добавляю этот второй ответ для тех, кто может быть соблазнен попробовать этот путь.

Следуя относительно недавнему совету, размещенному Симоном Добсоном Локальная почта из Office365 с использованием OAUTH2 с mbsync и с некоторыми подсказками от Бретта Преснелла Чтение почты с помощью Emacs, который использует pizauth, я нашел команды, которые используют neomutt/contrib/oauth2/mutt_oauth2.py:

для моего обычного аккаунта Gmail

  1. Используя учетные данные Thunderbird, как указано в releases-comm-central/mailnews/base/src/OAuth2Providers.sys.mjs, python <path_to_local_copy_of_mutt_oauth2.py --provider microsoft --client-id 406964657835-aq8lmia8j95dhl1a2bvharmfk3t1hgqj.apps.googleusercontent.com --client-secret kSmqreRr0qwBWJgbf5Y-PjSU --authflow localhostauthcode --email [email protected] -a tokens_Google.gpg --encryption-pipe 'gpg --encrypt --recipient <gpg_id> получает URL страницы входа в Google, который, после завершения, переходит на страницу с предупреждением “Mozilla Thunderbird Email хочет доступ к вашей учетной записи Google”, но в моем случае нажав “дальше”, я получаю “Невозможно подключиться” к серверу по адресу localhost:36697, и мой терминал (Alacritty) сообщает “Не удалось получить authcode.” и становится неинтерактивным, требуя перезагрузки ОС!
  2. Используя вместо этого свои учетные данные, созданные два года назад, когда я пробовал путь getmail6, я попал на страницу с сообщением “Google не проверил это приложение”. Дополнительно > Перейти к Быстрому старту (небезопасно) привело меня на страницу с сообщением “Быстрый старт хочет доступ к вашей учетной записи Google”. Продолжить привело меня на страницу с сообщением “Невозможно подключиться” к серверу по адресу localhost:36697, и Alacritty снова сообщил “Не удалось получить authcode.”

для моего обычного аккаунта Microsoft

Используя учетные данные Microsoft, опубликованные Симоном Добсоном и другими, python <path_to_local_copy_of_mutt_oauth2.py --provider microsoft --client-id 08162f7c-0fd2-4200-a84a-f25a4db0b584 --client-secret 'TxRBilcHdC6WGBee]fs?QR:SJ8nI[g82' --authflow localhostauthcode --email <address> -a tokens_Microsoft.gpg --encryption-pipe 'gpg --encrypt --recipient <gpg_id> получает URL страницы входа в Microsoft, но говорит мне “Вы не можете войти здесь с личной учетной записью. Используйте свою рабочую или учебную учетную запись.” То же самое со всеми моими другими текущими и неактивными алиасами.

заключение: mutt больше не является опцией для обычных учетных записей Google или Microsoft

– потому что mbsync (и, следовательно, msmtp) больше не могут работать с обычной учетной записью Google или Microsoft. Я надеюсь, что это не так, и я предполагаю, что вся эта жесткая безопасность вызвана тем, что они предоставляют так много услуг, кроме простой электронной почты.

Ответ или решение

Как продолжить использовать msmtp с OAuth 2.0 для Gmail в mutt после отказа от метода OOB

В последние годы пользователи Gmail столкнулись с изменениями в механизмах аутентификации, которые могут затруднить отправку почты с использованием инструментов, таких как msmtp и mbsync. Ранее работающие решения сейчас становятся неэффективными из-за отказа от метода OOB (Out-of-Band) для получения токенов. Данная статья описывает альтернативные подходы, позволяющие продолжать использовать msmtp с OAuth 2.0 для Gmail в среде mutt, обходя новые ограничения.

1. Получение учетных данных OAuth 2.0

Первый шаг к успешной интеграции — получение учетных данных OAuth 2.0. Для этого выполните следующие действия:

  1. Создайте проект в Google Cloud:

    • Перейдите на консоль Google Cloud и создайте новый проект, выбрав подходящее имя.
  2. Включите API Gmail:

    • В разделе "APIs & Services" активируйте Gmail API, выбрав его из списка.
  3. Создайте учетные данные:

    • Перейдите в раздел "Credentials" и создайте OAuth 2.0 Client ID, выбрав тип приложения "Desktop app". Сохраните Client ID и Client Secret.
  4. Настройка экрана согласия:

    • Обязательно заполните информацию об экране согласия, указав поддержку своей учетной записи Google.

2. Генерация токенов доступа и обновления

После получения учетных данных можно перейти к созданию токенов:

  1. Создайте JSON-файл конфигурации:
    Создайте файл your.json с необходимыми данными:

    {
       "scope": "https://mail.google.com/",
       "user": "[ваш_email@google.com]",
       "client_id": "[ваш_client_id]",
       "client_secret": "[ваш_client_secret]",
       "token_uri": "https://accounts.google.com/o/oauth2/token",
       "auth_uri": "https://accounts.google.com/o/oauth2/auth",
       "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs"
    }
  2. Используйте скрипт getmail-gmail-xoauth-tokens:
    С помощью скрипта getmail-gmail-xoauth-tokens запустите команду:

    python3 getmail-gmail-xoauth-tokens --init your.json

    Следуйте инструкциям на экране для завершения авторизации. Это создаст токены доступа и обновления в вашем JSON-файле.

3. Конфигурация msmtp

Отредактируйте файл конфигурации ~/.msmtprc, добавив следующую информацию:

tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile ~/.msmtp.log
account your
auth oauthbearer
host smtp.gmail.com
port 587
from your_email@gmail.com
user your_email@gmail.com
passwordeval python3 getmail-gmail-xoauth-tokens your.json

4. Тестирование отправки электронных писем

Для проверки правильности настроек отправьте тестовое письмо с помощью следующей команды:

echo "Тестовое сообщение от msmtp с использованием OAuth 2.0" | msmtp -a your [адрес_получателя]

Если все настроено верно, вы должны получить сообщение на указанный email.

Заключение

Вводя более строгие меры безопасности и отказываясь от метода OOB, Google изменяет доступ к своим API. Тем не менее, с помощью вышеописанных шагов вы можете продолжать использовать msmtp и mutt для отправки писем через Gmail. Эти действия не только помогут избежать проблем с аутентификацией, но и позволят вам сохранить функциональность, к которой вы привыкли.

Оцените материал
Добавить комментарий

Капча загружается...