- Вопрос или проблема
- Предыстория
- Отправка электронной почты с помощью msmtp, до сих пор
- 1 подготовка – получение моих учетных данных OAuth 2.0 для Gmail
- 2 подготовка – настройка msmtprc
- 3 использование – отправка электронной почты из командной строки, до сих пор
- Теперь oob больше не допускается
- Как продолжить отправлять с msmtp?
- Решение getmail6
- 1 получите свой Идентификатор клиента и Секрет OAuth 2.0
- 2 получите ваш access_token (и refresh_token) OAuth 2.0
- 1 создайте свой (секретный) json
- 2 получите ваш access_token (и refresh_token)
- 3 измените ваш ~/.msmtprc
- 4 отправьте тестовое письмо
- Возможный путь mutt_oauth2.py тоже не работает
- для моего обычного аккаунта Gmail
- для моего обычного аккаунта Microsoft
- заключение: mutt больше не является опцией для обычных учетных записей Google или Microsoft
- Ответ или решение
- Как продолжить использовать msmtp с OAuth 2.0 для Gmail в mutt после отказа от метода OOB
- 1. Получение учетных данных OAuth 2.0
- 2. Генерация токенов доступа и обновления
- 3. Конфигурация msmtp
- 4. Тестирование отправки электронных писем
- Заключение
Вопрос или проблема
Предыстория
В течение двух лет я с удовольствием получал доступ к своим аккаунтам Gmail с помощью neomutt
.
Я синхронизирую данные между neomutt
локально и своим онлайн-аккаунтом Gmail с помощью mbsync
и пароля приложения “Двухэтапная проверка” (Войти с помощью паролей приложений).
Отправка электронной почты с помощью msmtp, до сих пор
Чтобы отправить Gmail с помощью neomutt
, это сложнее, потому что msmtp
требует действительный токен из Gmail API
. К счастью, пользователь GitHub tenllado предоставил единственное работающее решение с открытым исходным кодом, которое мне удалось найти, его скрипт oauth2token. Я адаптировал его как oauth2tool.sh. Шаги, необходимые для этого, следующие:
1 подготовка – получение моих учетных данных OAuth 2.0 для Gmail
- Используйте Python Quickstart для получения своих учетных данных, которые выглядят так:
- мой Идентификатор клиента:
xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com
- мой Секрет клиента:
xxxxxxxxxxxxxxxxxxxxxxxx
- мой Идентификатор клиента:
- Скопируйте
oauth2.py
(Код “токен обновления действует бессрочно”). - Получите бессмертный токен обновления:
$ 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, используя более безопасные потоки OAuth “OAuth
поток вне канала (oob) будет снят с поддержки”.
Как продолжить отправлять с msmtp?
OAuth 2.0 для мобильных и настольных приложений “Циклический IP-адрес (macOS, Linux, Windows desktop)” кажется, что это путь вперед, но мне нужно несколько недель свободного времени, которого у меня нет, чтобы выяснить, как. Есть ли идеи?
Связанный вопрос: Google Cloud: OAuth-клиенты в тестовом режиме, которые используют поток OAuth OOB.
Решение getmail6
getmail6 частично решает эту проблему для Gmail
(и Microsoft Office 365
) с помощью своего Python
скрипта getmail-gmail-xoauth-tokens, хотя с огромным предупреждением о том, что Gmail API
теперь ограничивает ваш токен обновления всего на 1 час, так что последний шаг, описанный ниже, с коротким взаимодействием с браузером и генерацией оповещений безопасности Google, потребуется регулярно повторять, что делает это решение малопрактичным. (getmailrc-examples предупреждает об этом – “К сожалению… необходимо повторять регулярно.”) Узнав об этом, я успешно следовал инструкциям Акканы Пек, Отправка почты через Gmail с использованием OAuth2 (выпуск 2022) (как было предложено в комментарии от @GuenterRoeck).
1 получите свой Идентификатор клиента и Секрет OAuth 2.0
(Примечание: Это может быть не единственный или лучший путь, но он работает. В 2020 году я получил эти учетные данные более легким способом по сейчас устаревшему маршруту, описанному в OP, и они по-прежнему действительны.)
- Перейдите на Создать проект Google Cloud и, как там указано, откройте консоль Google Cloud, которая расскажет вам, как перейти к Новому проекту, где вам нужно выбрать
Название проекта
– я выбралgetmail6
. - В APIs & Services выберите
Включенные APIs и сервисы
и нажмите+ ВКЛЮЧИТЬ APIs И СЕРВИСЫ
. - Выберите Gmail API и
ВКЛЮЧИТЬ
его. - Выберите Учетные данные и нажмите
+ СОЗДАТЬ УЧЕТНЫЕ ДАННЫЕ
, чтобы перейти к Создать Идентификатор клиента OAuth, где вы нажимаетеНастроить экран согласия
, где, похоже, нам нужно продолжить, как если бы мы были создателями приложений, что мне кажется абсурдным, но выбора нет. Не являясь пользователем Google Workspace, я был вынужден выбратьВнешний
(“Доступен любому тестовому пользователю с учетной записью Google. Ваше приложение начнет работать в тестовом режиме и будет доступно только пользователям, которых вы добавите в список тестовых пользователей. Как только ваше приложение будет готово к развертыванию, вам может потребоваться подтвердить приложение.”). Затем нам необходимо определить наше вымышленноеНазвание приложения
– я выбрал “msmtpGmail”, и нашЭлектронный адрес поддержки пользователей
, который является электронной почтой той учетной записи, из которой вы все это делаете, также для нашегоКонтактная информация разработчика
. ЗатемСохранить и продолжить
. - Вернитесь к Создать Идентификатор клиента OAuth для
Типа приложения
– я выбралНастольное приложение
, иНазвание
– я выбрал “msmtp”, что, наконец, дало мне мойИдентификатор клиента
иСекрет клиента
. Я скачал их какclient_secret_nnnnnnnnnnnn-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com.json
и надежно сохранил. - Важный последний шаг – добавить себя в
Тестовые пользователи
(потому что 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
- Используя учетные данные 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.” и становится неинтерактивным, требуя перезагрузки ОС! - Используя вместо этого свои учетные данные, созданные два года назад, когда я пробовал путь
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. Для этого выполните следующие действия:
-
Создайте проект в Google Cloud:
- Перейдите на консоль Google Cloud и создайте новый проект, выбрав подходящее имя.
-
Включите API Gmail:
- В разделе "APIs & Services" активируйте Gmail API, выбрав его из списка.
-
Создайте учетные данные:
- Перейдите в раздел "Credentials" и создайте OAuth 2.0 Client ID, выбрав тип приложения "Desktop app". Сохраните Client ID и Client Secret.
-
Настройка экрана согласия:
- Обязательно заполните информацию об экране согласия, указав поддержку своей учетной записи Google.
2. Генерация токенов доступа и обновления
После получения учетных данных можно перейти к созданию токенов:
-
Создайте 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" }
-
Используйте скрипт 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. Эти действия не только помогут избежать проблем с аутентификацией, но и позволят вам сохранить функциональность, к которой вы привыкли.