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

Django联系表单Mailtrap可用,换真实SMTP服务器(Outlook等)报错

问题:Django联系表单SMTP中继权限错误排查

使用Mailtrap测试Django联系表单时邮件正常接收,但配置真实邮箱(托管于alwasdata.net)SMTP参数后出现以下错误:

SMTPRecipientsRefused at /contact/

{'info@mysite.net': (550, b'relay not permitted: you must be authenticated to send messages')}

测试Outlook账户时也出现相同错误,疑似与send_mail调用中的发件人配置有关。

相关配置及代码如下:

settings.py配置

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
DEFAULT_FROM_EMAIL = "info@mysite.net"
EMAIL_USE_TLS = True
EMAIL_USE_SSL = False
EMAIL_HOST = 'smtp-blablabla.net'
EMAIL_HOST_PASSWORD = 'password'
EMAIL_PORT = 587

views.py中的contact方法

def contact(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            subject = "Message d'un visiteur sur votre site"
            body = {
                'Nom': form.cleaned_data['first_name'],                    
                'Tel': form.cleaned_data['tel'], 
                'Email': form.cleaned_data['email'], 
                'Message':form.cleaned_data['message'], 
            }
            message = "\n".join(body.values())

            try:
                send_mail(
                subject,
                message,
                'info@mysite.net',
                ['info@othersite.net'],
                fail_silently=False,
            )
            except BadHeaderError:
                return HttpResponse('Invalid header found.')
            return redirect('/')
    form = ContactForm()
    return render(request,'pages/email_form.html',{'form':form})

forms.py定义

from django import forms
    
class ContactForm(forms.Form):
    first_name = forms.CharField(max_length=100, required=True)
    tel = forms.CharField(max_length=15, required=True)
    email = forms.EmailField(required=False)
    message = forms.CharField(widget=forms.Textarea, required=True)

错误原因分析

  1. 缺少SMTP认证用户名:settings.py中仅配置了EMAIL_HOST_PASSWORD,但未设置EMAIL_HOST_USER,SMTP服务器无法验证你的账户身份,因此拒绝中继邮件。
  2. 发件人地址与认证账户可能不匹配:代码中硬编码了发件人地址'info@mysite.net',若该地址与SMTP认证账户不一致,部分服务器会拒绝中继请求。
  3. SMTP服务器地址可能不正确:当前配置的EMAIL_HOST为smtp-blablabla.net,需确认是否为alwasdata.net提供的真实SMTP服务器地址。

解决方法

  1. 补充SMTP认证用户名配置
    在settings.py中添加EMAIL_HOST_USER,值为你的邮箱账户:

    EMAIL_HOST_USER = "info@mysite.net"
    
  2. 统一发件人地址为配置项
    修改views.py中send_mail的发件人参数,使用settings中的DEFAULT_FROM_EMAIL,避免硬编码不一致:
    首先导入settings:

    from django.conf import settings
    

    然后修改send_mail调用:

    send_mail(
        subject,
        message,
        settings.DEFAULT_FROM_EMAIL,
        ['info@othersite.net'],
        fail_silently=False,
    )
    
  3. 验证SMTP服务器地址正确性
    核对alwasdata.net的官方文档,确认正确的SMTP服务器地址(例如可能是smtp.alwasdata.net),替换当前的EMAIL_HOST值。

  4. 确认邮箱账户权限

    • 检查alwasdata.net邮箱是否开启了SMTP服务;
    • 若使用Outlook账户,需确认是否开启了应用密码(若启用了两步验证),并使用应用密码作为EMAIL_HOST_PASSWORD。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:40:36