Khi gửi email bằng Django thông qua Gmail SMTP trên macOS, nhiều người sẽ gặp lỗi:
unable to get local issuer certificate (_ssl.c:1032)
Lỗi này thường xuất hiện khi:
-
dùng Python cài từ python.org
-
sử dụng Django send_mail()
-
gửi email qua Gmail SMTP
-
Python chưa được cài CA Certificates
Bài viết này sẽ hướng dẫn cách xử lý triệt để.
Nguyên nhân lỗi
Python cần CA Certificates để xác thực SSL khi kết nối tới máy chủ SMTP của Gmail.
Trên macOS, một số phiên bản Python không tự động cài certificates nên sẽ phát sinh lỗi verify SSL.
Ví dụ lỗi đầy đủ:
SSLCertVerificationError:
[SSL: CERTIFICATE_VERIFY_FAILED]
certificate verify failed:
unable to get local issuer certificate (_ssl.c:1032)
Cấu hình gửi mail Django đúng chuẩn
Trong file settings.py:
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = "smtp.gmail.com"
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = "yourgmail@gmail.com"
EMAIL_HOST_PASSWORD = "your-app-password"
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
Gmail hiện yêu cầu dùng App Password thay vì mật khẩu Gmail thông thường.
Cách sửa lỗi SSL trên macOS
Bước 1: Chạy Install Certificates.command
Mở Terminal và chạy:
Nếu dùng Python phiên bản khác:
hoặc:
Script này sẽ:
-
tải CA certificates
-
cấu hình SSL cho Python
-
fix lỗi verify certificate
Bước 2: Restart Django
Sau khi cài certificates:
Kiểm tra gửi mail Django
Test nhanh trong Django shell:
from django.core.mail import send_mail
"Test Email",
"Hello Django",
None,
["yourgmail@gmail.com"],
fail_silently=False,
)
Nếu không còn lỗi SSL là đã thành công.
Ví dụ code form liên hệ Django
from django.core.mail import send_mail
from django.conf import settings
send_mail(
subject="[WEB] Liên hệ mới",
message="Đây là email test",
from_email=settings.DEFAULT_FROM_EMAIL,
recipient_list=[settings.EMAIL_HOST_USER],
fail_silently=False,
)
Trường hợp vẫn còn lỗi
Nếu vẫn bị lỗi SSL, cài thêm thư viện certifi:
Sau đó thêm vào đầu settings.py:
import ssl
import certifi
ssl._create_default_https_context = lambda: ssl.create_default_context(
cafile=certifi.where()
)
Kết luận
Lỗi:
SSL: CERTIFICATE_VERIFY_FAILED
không phải do Django hay Gmail, mà do Python trên macOS thiếu CA Certificates.
Chỉ cần chạy:
/Applications/Python\ 3.13/Install\ Certificates.command
là phần lớn trường hợp sẽ được xử lý hoàn toàn.