You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 04:54:16