Django: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1123)

Я пытаюсь отправить электронную почту, используя smtplib в Python. Вот функция email():

def email(to, subject_parameter, body_parameter):
    subject = subject_parameter
    body = body_parameter
    sender_email = "pfcbookclub@gmail.com"
    receiver_email = to
    password = "Zt2.~[3d*.[Y5&5r"

    # Create a multipart message and set headers
    message = MIMEMultipart()
    message["From"] = sender_email
    message["To"] = receiver_email
    message["Subject"] = subject
    message["Bcc"] = "pfcbookclub@gmail.com"

    # Add body to email
    message.attach(MIMEText(body, "plain"))

    text = message.as_string()

    # Log in to server using secure context and send email
    context = ssl.create_default_context()
    with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server:
        server.login(sender_email, password)
        server.sendmail(sender_email, receiver_email, text)

Когда кто-то регистрируется на моем сайте, я хочу, чтобы письмо отправлялось на адрес электронной почты сайта (не пользователю).

Я сделал это:

def register(request):
    registered = False
    ctx = {}
    if request.method == 'POST':
        username = request.POST.get("username")
        full_name = request.POST.get("full_name")
        password = request.POST.get("password")
        email_id = request.POST.get("email")
        house_number = request.POST.get("house_number")
        phone_number = request.POST.get("phone_number")
        if len(User.objects.filter(username=username)) == 0:
            ctx["username_exists"] = False
            user_form = UserForm(data=request.POST)
            if user_form.is_valid():
                user = user_form.save()
                user.set_password(user.password)
                user.save()
                user_profile = UserProfileInfo(user=user,full_name=full_name, email=email_id, house_number=house_number, phone_number=phone_number)
                user_profile.save()
                subject = username + " just registered"
                body = username + " just registered on pfcbookclub.com. Link to admin: https://pfcbookclub.com/Caput_Draconis/"
                email("pfcbookclub@gmail.com", subject, body) # Error on this line
                username = request.POST.get('username')
                password = request.POST.get('password')
                user = authenticate(username=username, password=password)
                if user:
                    if user.is_active:
                        login(request,user)
                        return HttpResponseRedirect(reverse('index'))
                    else:
                        return HttpResponse("Your account was inactive.")
                else:
                    print("Someone tried to login and failed.")
                    print("They used username: {} and password: {}".format(username,password))
                    return HttpResponse("Invalid login details given")
            else:
                return HttpResponse("Contains @")
        else:
            ctx["username_exists"] = True
            return render(request,'main/registration.html', ctx)
    elif request.method == "GET":
        return render(request,'main/registration.html', ctx)

Но когда я регистрируюсь, я получаю ошибку ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1123).

Full traceback (трассировка стека):

/Users/adithraghav/Documents/Work/centel/books/venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1351: RuntimeWarning: DateTimeField UserRents.return_date received a naive datetime (2022-02-21 00:00:00) while time zone support is active.
  warnings.warn("DateTimeField %s.%s received a naive datetime "
Internal Server Error: /main/rent/alPuEivQ3P/
Traceback (most recent call last):
  File "/Users/adithraghav/Documents/Work/centel/books/venv/lib/python3.9/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/Users/adithraghav/Documents/Work/centel/books/venv/lib/python3.9/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/adithraghav/Documents/Work/centel/books/venv/lib/python3.9/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/Users/adithraghav/Documents/Work/centel/books/main/views.py", line 240, in rent
    email(book.owner.email, subject, body)
  File "/Users/adithraghav/Documents/Work/centel/books/main/views.py", line 85, in email
    with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server:
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/smtplib.py", line 1034, in __init__
    SMTP.__init__(self, host, port, local_hostname, timeout,
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/smtplib.py", line 253, in __init__
    (code, msg) = self.connect(host, port)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/smtplib.py", line 339, in connect
    self.sock = self._get_socket(host, port, self.timeout)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/smtplib.py", line 1041, in _get_socket
    new_socket = self.context.wrap_socket(new_socket,
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/ssl.py", line 500, in wrap_socket
    return self.sslsocket_class._create(
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/ssl.py", line 1040, in _create
    self.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/ssl.py", line 1309, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1123)

Эта ошибка возникает не только в маршруте register(), но и во всех маршрутах, где я отправляю электронное письмо.

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