在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
相关产品推荐
相关产品推荐

