Вопрос или проблема
Я хочу иметь возможность отправлять сообщения Gmail с Raspberry Pi, желательно из одной строки скрипта оболочки. Я знаю, что могу использовать почтовый сервер, отличный от Gmail, который поддерживает менее безопасные варианты входа, или перейти на https://www.google.com/settings/security/lesssecureapps и изменить настройки там – но я не хочу этого делать, так как предпочитаю использовать более новую версию OAUTH.
Существует множество вариантов электронной почты, многие из которых имеют больше функций, чем мне нужно, но я не вижу поддержки OAUTH как “рекламируемой” функции (замечание: я не хочу получать электронные письма или проверять их, и мне не нужна графическая оболочка) – каков самый простой способ этого добиться?
Я предпочел бы бесплатное и открытое программное обеспечение, а также относительно простое в настройке/конфигурации, в таком порядке по приоритетам.
Принятый, и крайне хорошо написанный, ответ на StackOverflow здесь описывает, как сделать это на Python – без понижения настроек безопасности, так что все, что вам нужно сделать, это:
- следовать инструкциям для получения вашего токена
- адаптировать раздел о отправке почты в скрипт, который принимает адрес электронной почты, заголовок и сообщение в качестве входных данных (убедитесь, что ваш скрипт начинается с python shebang
#!/usr/bin/env python
– если вы используете Windows, убедитесь, что имя вашего скрипта заканчивается на .py) - разместить скрипт где-то в вашем пути, или в месте, откуда вы собираетесь его запускать, и
- установить его как исполняемый с помощью
chmod +x
/path/to/your/script (вы можете пропустить это, если используете Windows)
Это решение:
- Использует стандартный протокол OAuth 2.0.
- Бесплатно и открыто.
- Должно работать на любом компьютере/ОС, где установлен Python и который подключен к интернету. Raspberrian имеет Python, как и большинство компьютеров на Linux, OS/X и его можно установить на Windows
Я только что натолкнулся на вашу тему и, возможно, не совсем правильно понимаю ваши требования. Но если я понял правильно, я думаю, вы можете использовать git для отправки электронных писем с помощью Google Oauth2.
$ git send-email --smtp-pass your-Oauth2-app-pwd
--smtp-user [email protected]
--smtp-server smtp.gmail.com
--smtp-encryption tls
--smtp-server-port 587
--to [email protected]
mail-content.txt
Вот как я отправляю патчи, используя свой адрес электронной почты Google.
«git send-email –smtp-pass your-Oauth2-app-pwd» не поможет автору запроса делать скрипты, потому что «your-Oauth2-app-pwd» – это то, что должно быть сгенерировано. Например, msmtprc содержит строку «passwordeval oama access [email protected]», где oama – это инструмент oauth2, который использует GPG. oama, вероятно, можно использовать в вашем примере git, если его запустить из командной строки. Однако это не будет работать без значительных изменений в серверной ситуации, потому что не может быть никаких запросов. Мне любопытно – как вы сгенерировали «your-Oauth2-app-pwd»?
Ответ или решение
Для отправки электронных писем через Gmail с помощью OAUTH 2.0 на Raspberry Pi с использованием командной строки (CLI) вам подойдут несколько методов. Рассмотрим один из наиболее простых и одновременно безопасных способов с использованием Python и его библиотеки smtplib
в сочетании с google-auth
для аутентификации через OAUTH 2.0.
Подготовка к отправке писем через Gmail с OAUTH 2.0
1. Создание проекта в Google Cloud Console
- Перейдите на Google Cloud Console.
- Создайте новый проект.
- Включите API Gmail для вашего проекта.
- Перейдите к разделу “Credentials” и создайте учетные данные типа “OAuth 2.0 Client IDs”.
- Укажите
http://localhost
в качестве URI перенаправления (это временно). - Сохраните ваш
Client ID
иClient Secret
.
2. Установка необходимых библиотек
Убедитесь, что у вас установлен Python и пакетный менеджер pip
. Воспользуйтесь следующей командой для установки необходимых библиотек:
pip install --upgrade google-auth google-auth-oauthlib google-auth-httplib2 google-api-python-client
3. Получение токена доступа
Для получения токена доступа выполните следующий скрипт:
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
import os
# Необходимые области доступа
SCOPES = ['https://www.googleapis.com/auth/gmail.send']
def main():
creds = None
# Файл токена
if os.path.exists('token.json'):
creds = Credentials.from_authorized_user_file('token.json', SCOPES)
# Если нет действительных учетных данных, позвоним пользователю для входа в систему.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file('credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
# Сохранение токена для следующего запуска
with open('token.json', 'w') as token:
token.write(creds.to_json())
if __name__ == '__main__':
main()
После выполнения этого скрипта у вас будет файл token.json
, содержащий ваш токен доступа.
4. Отправка письма
Теперь вы можете использовать следующий скрипт для отправки электронного письма:
import base64
from email.mime.text import MIMEText
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
def send_email(to, subject, message_text):
creds = Credentials.from_authorized_user_file('token.json', SCOPES)
service = build('gmail', 'v1', credentials=creds)
message = MIMEText(message_text)
message['to'] = to
message['subject'] = subject
raw = base64.urlsafe_b64encode(message.as_bytes()).decode()
body = {'raw': raw}
service.users().messages().send(userId='me', body=body).execute()
if __name__ == '__main__':
send_email('recipient@example.com', 'Тема письма', 'Текст сообщения')
Настройка скрипта для командной строки
- Сохраните оба скрипта в одном каталоге.
- Убедитесь, что скрипт отправки письма имеет права на выполнение:
chmod +x send_email.py
- Теперь вы можете вызывать скрипт с параметрами (при необходимости добавьте возможность передачи параметров via
sys.argv
).
Альтернативный способ: Использование msmtp
Еще одним простым вариантом является использование msmtp
, который поддерживает OAUTH 2.0 через специальные конфигурации. Вам нужно будет настроить файл конфигурации .msmtprc
.
account gmail
host smtp.gmail.com
port 587
from your-email@gmail.com
auth on
user your-email@gmail.com
passwordeval "oauth2-tool --your-oauth-token"
tls on
tls_starttls on
Для установки msmtp
используйте:
sudo apt-get install msmtp msmtp-mta
После настройки msmtp
, вы сможете отправлять письма с помощью командной строки:
echo "Текст сообщения" | msmtp --account=gmail recipient@example.com
Заключение
Как видно, вы можете отправить электронное письмо через Gmail с использованием OAUTH 2.0, используя Python или msmtp
. Оба подхода соответствуют требованиям безопасности и легко интегрируются в автоматизированные сценарии. Выберите тот, который лучше всего соответствует вашим потребностям и уровню комфорта с инструментами.