Django протоколирование писем, которые не приходят, в то время как другие письма приходят
В настоящее время я использую эту конфигурацию для получения сообщений электронной почты о регистрации с моих серверов разработки и производственных серверов.
ADMINS = [('Test1', 'somename@example.com'), ('Test2', 'someothername@example.com')]
SERVER_EMAIL = "correctsender@example.com"
LOGGING = {
'version': 1,
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
},
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': False,
},
}
}
Затем электронное письмо отправляется со следующей конфигурацией для SMTP.
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'correctsender@example.com'
EMAIL_HOST_PASSWORD = 'thepassword' # normally loaded from environment
EMAIL_PORT = 587
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = 'correctsender@example.com'
Я включил "Менее безопасные приложения" в Gmail.
В течение нескольких дней мы подозревали, что логирование ошибок нарушено. Сегодня мы подтвердили, что письма, отправленные через AdminEmailHandler, не доходят, в то время как все остальные письма, отправленные через обычный почтовый конвейер (неважно, из celery workers или напрямую с сервера) доходят.
Тест с другими бэкендами показал, что почта была отправлена django. Быстрый тест с smtplib показал, что логин не был заблокирован. Как такое может быть, что одни письма принимаются Gmail, а другие, отличающиеся только содержимым, нет?
Кроме того, есть ли место, где хранятся отклоненные письма в Google (в Google Workspace есть только рудиментарный отчет, который ничего не показывает)?
Что сработало для меня, так это использование 2 факторов аутентификации путем генерации секретного ключа для учетной записи электронной почты и использования его в EMAIL_HOST_PASSWORD
'loggers': {
'django.request': { **change here to django.db.backend**
'handlers': ['mail_admins'], c**hange here to console**
'level': 'ERROR',
'propagate': False,
},
}
ваш логгер может выглядеть так, и это должно исправить то, что вам нужно
LOGGING = {
"version": 1,
"disable_existing_loggers": True,
"formatters": {
"verbose": {
"format": "%(levelname)s %(asctime)s %(module)s "
"%(process)d %(thread)d %(message)s"
}
},
"handlers": {
"console": {
"level": "DEBUG",
"class": "logging.StreamHandler",
"formatter": "verbose",
}
},
"root": {"level": "INFO", "handlers": ["console"]},
"loggers": {
"django.db.backends": {
"level": "ERROR",
"handlers": ["console"],
"propagate": False,
},
'django.request': {
'handlers': ['console'],
'level': 'ERROR',
'propagate': False,
},
# Errors logged by the SDK itself if only you wish to monitor with sentry
"sentry_sdk": {"level": "ERROR", "handlers": ["console"], "propagate": False},
"django.security.DisallowedHost": {
"level": "ERROR",
"handlers": ["console"],
"propagate": False,
},
},
}
таким образом каждая запись журнала проходит через обработчик консоли. Надеюсь, это работает
Ок, я "решил" (читайте комментарий ниже) вопрос, используя django-gmailapi-backend. Этот пакет можно установить следующим образом
- pip install the package
- установите новый проект в console.cloud.google.com
- включите gmail api для вашего проекта
- создайте учетные данные OAuth 2.0
- выберите "Desktop Client"
- скопируйте ID и секрет клиента в командную строку
gmail_oauth2 --generate_oauth2_token \
--client_id="<client_id>" \
--client_secret="<client_secret>" \
--scope="https://www.googleapis.com/auth/gmail.send"
- откройте ссылку, которую вам дает программа
- авторизуйте запрос на использование вашей учетной записи
- копируйте подтверждение в командную строку
- получите свой токен обновления и установите его, как указано в readme репозитория выше.
- теперь вы установили более безопасное приложение для использования в качестве метода отправки почты.
Это лишь наполовину решает проблему неполучения отчетов об авариях. Они по-прежнему не приходят, так как почтовый ящик google считает их вредоносными. Однако теперь, по крайней мере, ответ о "недоставке" сообщения будет приходить в почтовый ящик отправителя, что позволит вам прочитать письмо, которое предположительно было вредоносным. Обходной путь, да, но это лучшее, что я смог сделать.