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. Этот пакет можно установить следующим образом

  1. pip install the package
  2. установите новый проект в console.cloud.google.com
  3. включите gmail api для вашего проекта
  4. создайте учетные данные OAuth 2.0
    • выберите "Desktop Client"
  5. скопируйте ID и секрет клиента в командную строку
gmail_oauth2 --generate_oauth2_token \
  --client_id="<client_id>" \
  --client_secret="<client_secret>" \
  --scope="https://www.googleapis.com/auth/gmail.send"
  1. откройте ссылку, которую вам дает программа
  2. авторизуйте запрос на использование вашей учетной записи
  3. копируйте подтверждение в командную строку
  4. получите свой токен обновления и установите его, как указано в readme репозитория выше.
  5. теперь вы установили более безопасное приложение для использования в качестве метода отправки почты.

Это лишь наполовину решает проблему неполучения отчетов об авариях. Они по-прежнему не приходят, так как почтовый ящик google считает их вредоносными. Однако теперь, по крайней мере, ответ о "недоставке" сообщения будет приходить в почтовый ящик отправителя, что позволит вам прочитать письмо, которое предположительно было вредоносным. Обходной путь, да, но это лучшее, что я смог сделать.

Вернуться на верх