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

在Django中使用SendGrid发送邮件失败问题求助

排查Django+SendGrid邮件发送失败问题

咱们一步步来揪出问题所在,我之前用SendGrid的时候也踩过不少类似的坑,给你列几个最可能的原因和解决办法:

1. 核心配置错误(最常见的坑)

你当前的SMTP配置里有两个关键错误:

  • SendGrid的SMTP用户名是固定值 apikey,不是你的SendGrid账号用户名!
  • SMTP密码应该填你的SendGrid API密钥,而不是邮箱密码!

修正后的settings.py相关配置应该是这样:

SEND_GRID_API_KEY = 'APIGENERATEDONSENDGRID'  # 这个在SMTP方式下其实可以不用,但留着也没关系
EMAIL_HOST = 'smtp.sendgrid.net'
EMAIL_HOST_USER = 'apikey'  # 必须是这个固定值
EMAIL_HOST_PASSWORD = 'APIGENERATEDONSENDGRID'  # 这里填你的SendGrid API密钥
EMAIL_PORT = 587
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = 'MYEMAIL'  # 这个邮箱必须在SendGrid后台验证过

2. 未验证发件人邮箱/域名

SendGrid强制要求验证发件人身份,否则邮件会直接被拦截或丢弃。你需要:

  • 登录SendGrid后台,找到Sender Authentication板块
  • 验证你的DEFAULT_FROM_EMAIL对应的邮箱,或者验证整个域名(更推荐)
  • 未验证的发件人发送的邮件,哪怕配置正确也无法送达

3. 关闭fail_silently=True隐藏错误

你现在调用send_mail时用了fail_silently=True,这会让Django不抛出任何异常,哪怕发送失败你也看不到具体原因。先把它改成False:

send_mail(subject, message, from_email, to_email, fail_silently=False)

这样终端会输出详细的错误信息(比如认证失败、发件人未通过验证等),帮你快速定位问题。

4. 检查端口和网络限制

  • 587端口+TLS是SendGrid推荐的配置,但如果你的本地环境/服务器有防火墙或代理,可能会拦截这个端口。可以尝试切换到465端口+SSL:
    EMAIL_PORT = 465
    EMAIL_USE_SSL = True
    EMAIL_USE_TLS = False
    

5. 查看SendGrid官方日志

登录SendGrid后台的Email Activity页面,这里能看到所有发送请求的状态:

  • 如果显示Blocked或Invalid Sender:大概率是发件人未验证
  • 如果显示Authentication Failed:SMTP用户名/密码配置错误
  • 如果显示Delivered:那可能邮件被Gmail分到垃圾邮件箱了,去垃圾邮件里找找

6. 简化测试排除干扰

先写一个极简的测试视图,跳过表单逻辑,直接发送邮件,排除表单数据的问题:

def test_send_email(request):
    from django.core.mail import send_mail
    from django.conf import settings
    
    send_mail(
        '测试邮件',
        '这是一封测试邮件',
        settings.DEFAULT_FROM_EMAIL,
        ['你的Gmail邮箱地址@gmail.com'],
        fail_silently=False
    )
    return HttpResponse('测试邮件已发送,请查收')

访问这个视图后,看终端的报错信息,再去SendGrid日志和Gmail收件箱(包括垃圾邮件)确认。


内容的提问来源于stack exchange,提问作者prib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:24:03