Django配置Gmail发送邮件失败求助:已开启两步验证仍无法发送
Django联系表单Gmail邮件发送失败问题
我用Django开发在线作品集,其中包含联系表单功能。测试阶段用MailTrap验证功能正常,但切换到生产环境想让邮件发送至Gmail邮箱时始终失败,只有MailTrap能正常工作。
我的Gmail账户已开启两步验证,并创建了应用专用密码(低安全性选项自今年5月起已不存在)。
Settings.py配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = "smtp.gmail.com" EMAIL_HOST_USER = "my-e-mail@gmail.com" EMAIL_HOST_PASSWORD = 'smbumqjiurmqrywn' # 示例密码,仅展示格式 EMAIL_PORT = 587 EMAIL_USE_TLS = True
邮件发送视图代码
注:使用EmailMessage或send_mail结果一致
def contact(request): contact_form = ContactForm() if request.method == 'POST': contact_form = ContactForm(data = request.POST) if contact_form.is_valid(): name = request.POST.get('name', '') email = request.POST.get('email', '') content = request.POST.get('content', '') # 发送邮件 email = EmailMessage( 'New message from {} <{}>'.format(name, email), 'From {} <{}>\n\nWrote:\n\n{}'.format(name, email, content), email, [settings.EMAIL_HOST_USER] ) email.send() return render(request, 'core/contact.html', {'form' : contact_form})
异常情况
- 仅修改Settings.py凭证为MailTrap即可正常工作,Gmail配置每次都会进入except块
- 多次尝试发送后,Gmail应用专用密码的「最近使用」栏为空
报错信息
Environment: Request Method: POST Request URL: http://127.0.0.1:8000/contact-me/ Django Version: 3.2.7 Python Version: 3.9.6 Installed Applications: ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'core', 'portfolio.apps.PortfolioConfig'] 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 "C:\Python\Python39\lib\site-packages\django\core\handlers\exception.py", line 47, in inner response = get_response(request) File "C:\Python\Python39\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "C:\Users\PC CASE Gerardo\OneDrive\Documents\Proyectos\Python\webpersonal\core\views.py", line 34, in contact email.send() File "C:\Python\Python39\lib\site-packages\django\core\mail\message.py", line 284, in send return self.get_connection(fail_silently).send_messages([self]) File "C:\Python\Python39\lib\site-packages\django\core\mail\backends\smtp.py", line 102, in send_messages new_conn_created = self.open() File "C:\Python\Python39\lib\site-packages\django\core\mail\backends\smtp.py", line 67, in open self.connection.starttls(keyfile=self.ssl_keyfile, certfile=self.ssl_certfile) File "C:\Python\Python39\lib\smtplib.py", line 764, in starttls self.ehlo_or_helo_if_needed() File "C:\Python\Python39\lib\smtplib.py", line 607, in ehlo_or_helo_if_needed (code, resp) = self.helo() File "C:\Python\Python39\lib\smtplib.py", line 436, in helo (code, msg) = self.getreply() File "C:\Python\Python39\lib\smtplib.py", line 400, in getreply raise SMTPServerDisconnected("Connection unexpectedly closed") Exception Type: SMTPServerDisconnected at /contact-me/ Exception Value: Connection unexpectedly closed
排查与解决建议
- 检查网络拦截:本地测试时,确认防火墙、杀毒软件没有拦截587端口的出站请求;生产环境需确保服务器能访问
smtp.gmail.com的587或465端口 - 重新生成应用专用密码:登录Gmail账户,进入「安全」-「应用专用密码」,重新生成一个密码(选择「邮件」类型),复制时不要带多余空格,替换到配置里
- 切换SMTP端口与加密方式:尝试改用SSL加密,修改配置:
EMAIL_PORT = 465 EMAIL_USE_SSL = True # 注释掉 EMAIL_USE_TLS = True - 修正发件人地址:Gmail不允许用未验证的外部邮箱作为发件人,把
EmailMessage的第三个参数改成自己的Gmail地址,同时避免变量名冲突:# 避免覆盖用户提交的email变量,改用email_msg作为实例名 email_msg = EmailMessage( 'New message from {} <{}>'.format(name, email), 'From {} <{}>\n\nWrote:\n\n{}'.format(name, email, content), settings.EMAIL_HOST_USER, # 改为自己的Gmail地址 [settings.EMAIL_HOST_USER] ) - 查看Gmail安全日志:登录Gmail后,在「安全」页面查看最近的登录活动,确认是否有被标记为异常的登录尝试,若有则点击「这是我」解锁账户
内容的提问来源于stack exchange,提问作者GerRubio
相关产品推荐
相关产品推荐

