Ошибка SMTPSenderRefused при использовании Django и Sendgrid

Я уже несколько дней пытаюсь заставить SendGrid отправить электронное письмо со страницы контактов на сайте, который я создаю. Сначала это были ошибки SMTPServerDisconnected, и я думаю, что я исправил это, теперь это ошибка SMTPSenderRefused.

settings.py

#Load environment variables from .env file
SENDGRID_API_KEY = os.getenv('SENDGRID_API_KEY')

#Email for contact form
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = 'smtp.sendgrid.net'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'apikey'
EMAIL_HOST_PASSWORD = SENDGRID_API_KEY
DEFAULT_FROM_EMAIL = 'some-email@hotmail.com'
SENDGRID_SANBOX_MODE_IN_DEBUG = False

views.py:

def contact(request: HttpRequest) -> HttpResponse:
    if request.method == "GET":
        form = ContactForm()
    elif request.method == "POST":
        form = ContactForm(request.POST)
        if form.is_valid():
            name = bleach.clean(form.cleaned_data["name"])
            email = bleach.clean(form.cleaned_data["email"])
            subject = f'Message from {name} about {bleach.clean(form.cleaned_data["subject"])}'
            message = bleach.clean(form.cleaned_data["message"])

            recipients = [settings.DEFAULT_FROM_EMAIL]
            try:
                send_mail(subject, message, email, recipients, fail_silently=False)
            except BadHeaderError:
                return render(request, "contact.html", {"form": form, "success": False})

            form = ContactForm()
            return render(request, "contact.html", {"form": form, "success": True})
    else:
        raise NotImplementedError

    return render(request, "contact.html", {"form": form})

Я переключался между fail_silently=False и fail_silently=True, но когда это значение истинно, письмо не отправляется в любом случае, поэтому я пока оставил значение false.

Наконец, вот трассировка, которую я получил:

Environment:


Request Method: POST
Request URL: http://localhost:8000/contact/

Django Version: 4.0
Python Version: 3.9.12
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'Blume_Website.apps.accounts',
 'Blume_Website.apps.contact']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/usr/local/lib/python3.9/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/app/Blume_Website/apps/contact/views.py", line 25, in contact
    send_mail(subject, message, email, recipients, fail_silently=False)
  File "/usr/local/lib/python3.9/site-packages/django/core/mail/__init__.py", line 61, in send_mail
    return mail.send()
  File "/usr/local/lib/python3.9/site-packages/django/core/mail/message.py", line 284, in send
    return self.get_connection(fail_silently).send_messages([self])
  File "/usr/local/lib/python3.9/site-packages/django/core/mail/backends/smtp.py", line 109, in send_messages
    sent = self._send(message)
  File "/usr/local/lib/python3.9/site-packages/django/core/mail/backends/smtp.py", line 125, in _send
    self.connection.sendmail(from_email, recipients, message.as_bytes(linesep='\r\n'))
  File "/usr/local/lib/python3.9/smtplib.py", line 887, in sendmail
    raise SMTPSenderRefused(code, resp, from_addr)

Exception Type: SMTPSenderRefused at /contact/
Exception Value: (550, b'Unauthenticated senders not allowed', 'd@email.com')

"d@email.com" - это человек, использующий контактную форму, и я подумал, что это потому, что это поддельный email, но когда я попытался использовать настоящий, это тоже не сработало.

Я просмотрел множество страниц stack overflow, посмотрел пару видео на youtube, но безуспешно. Не уверен, где кроется проблема. Спасибо за любую помощь!

Проблема в том, что вы пытаетесь использовать From адрес, который вы не проверили - в частности, вы пытаетесь использовать email, который является адресом электронной почты, представленным в форме. Вы не можете этого сделать - потому что это позволит вам отправлять почту от имени кого-либо без его разрешения.

Адрес from, указанный в send_mail должен быть адресом, который вы проверили на Sendgrid, поэтому вы должны сделать следующее:

# Note, 3rd argument has changed
send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, recipients, fail_silently=False)

Если вы хотите иметь возможность ответить на присланный адрес электронной почты, вы можете установить параметр reply_to в сообщении. Для этого нельзя использовать помощник send_mail - вместо него нужно использовать класс EmailMessage:

from django.core.mail import EmailMessage

email_message = EmailMessage(
    subject,
    message,
    settings.DEFAULT_FROM_EMAIL,
    recipients,
    reply_to=[email],
)
email_message.send()
Вернуться на верх