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

Django项目配置Zoho SMTP无法接收表单邮件求助

解决Django使用Zoho SMTP发送邮件失败的问题

一、检查Zoho账户核心设置

  • 确保你的域名邮箱已在Zoho完成域名验证,包括DKIM、SPF记录配置(这会直接影响邮件投递成功率,甚至被拦截)。
  • 开启SMTP访问:登录Zoho邮箱后台 → 邮箱设置 → 邮件账户 → 选择你的域名邮箱 → POP/IMAP/SMTP → 启用SMTP服务。
  • 若使用Zoho免费版,确认未触发发送频率限制(免费版有每日发送额度)。
  • 如果你开启了Zoho账户的两步验证,必须使用应用专用密码作为EMAIL_HOST_PASSWORD,不能用登录密码。

二、修正Django配置细节

  • EMAIL_HOST_USER必须填写完整的域名邮箱地址(如info@yourdomain.com),不能只填域名。
  • 确保TLS/SSL配置无冲突:
    • TLS配置(端口587):EMAIL_USE_TLS=True且EMAIL_USE_SSL=False
    • SSL配置(端口465):EMAIL_USE_SSL=True且EMAIL_USE_TLS=False
  • 添加DEFAULT_FROM_EMAIL配置,与EMAIL_HOST_USER一致,避免发件人身份不一致:
    DEFAULT_FROM_EMAIL = '<domain name email>'  # 替换为你的Zoho域名邮箱
    
  • 先通过Django Shell测试邮件发送,排除视图逻辑问题:
    python manage.py shell
    
    执行:
    from django.core.mail import send_mail
    send_mail("Test Subject", "Test Body", "your-zoho-email@domain.com", ["your-zoho-email@domain.com"], fail_silently=False)
    
    此时会直接输出具体错误(如认证失败、连接超时),方便定位问题。

三、修复视图代码逻辑

你的视图存在两个关键问题:

  1. send_mail执行逻辑不在表单验证通过的分支内,可能导致表单无效时执行报错,或发送空内容邮件。
  2. 不能直接用用户填写的邮箱作为发件人(Zoho仅允许使用已验证的域名邮箱作为发件人),需设置reply_to参数实现回复到用户邮箱的需求。

修正后的视图代码:

def home(request):
    allTemplates = AllTemplates.objects.all()
    if request.method == 'POST':
        form = forms.ContactForm(request.POST)
        if form.is_valid():
            body = {
                'name': form.cleaned_data['name'],
                'surname': form.cleaned_data['surname'],
                'from_email': form.cleaned_data['from_email'],
                'message': form.cleaned_data['message'],
            }
            mail_body = "\n".join(body.values())
            try:
                send_mail(
                    "Generic contact",
                    mail_body,
                    '<domain name email>',  # 固定为你的Zoho域名邮箱
                    ['<domain name email>'],
                    fail_silently=False,
                    reply_to=[form.cleaned_data['from_email']]  # 回复地址设为用户填写的邮箱
                )
                # 发送成功后可添加重定向或提示信息
                return redirect('home')
            except BadHeaderError:
                return HttpResponse('Ops, qualcosa è andato storto')
    else:
        form = forms.ContactForm()
    
    context = {
        'form': form, 
        'allTemplates': allTemplates,
        'allTemplates_length': len(allTemplates)
    }
    return render(request, 'home.html', context)

四、排查服务器/网络问题

  • 确认服务器允许出站连接到587或465端口(部分主机商会限制SMTP端口)。
  • 查看Django日志文件,查找SMTP相关的错误日志(如认证失败、连接超时)。
  • 本地测试时,检查防火墙是否阻挡了Django连接Zoho的SMTP服务器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 03:45:40