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)
错误原因分析
- 缺少SMTP认证用户名:settings.py中仅配置了
EMAIL_HOST_PASSWORD,但未设置EMAIL_HOST_USER,SMTP服务器无法验证你的账户身份,因此拒绝中继邮件。 - 发件人地址与认证账户可能不匹配:代码中硬编码了发件人地址
'info@mysite.net',若该地址与SMTP认证账户不一致,部分服务器会拒绝中继请求。 - SMTP服务器地址可能不正确:当前配置的
EMAIL_HOST为smtp-blablabla.net,需确认是否为alwasdata.net提供的真实SMTP服务器地址。
解决方法
补充SMTP认证用户名配置
在settings.py中添加EMAIL_HOST_USER,值为你的邮箱账户:EMAIL_HOST_USER = "info@mysite.net"统一发件人地址为配置项
修改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, )验证SMTP服务器地址正确性
核对alwasdata.net的官方文档,确认正确的SMTP服务器地址(例如可能是smtp.alwasdata.net),替换当前的EMAIL_HOST值。确认邮箱账户权限
- 检查alwasdata.net邮箱是否开启了SMTP服务;
- 若使用Outlook账户,需确认是否开启了应用密码(若启用了两步验证),并使用应用密码作为
EMAIL_HOST_PASSWORD。
内容的提问来源于stack exchange,提问作者Zembla
相关产品推荐
相关产品推荐

