前言:我可以通过命令行(使用send_mail()
)在我的服务器上发送电子邮件。我也可以使用相同的SMTP设置从我的localhost
发送电子邮件。此外,我正在使用 django-allauth 进行用户注册......而且它能够发送电子邮件验证电子邮件。
问题:我的服务器上的联系表单未发送邮件,也不会引发任何错误。实际上,send_mail()
正在返回1
(即成功),并且视图正在重定向。
我的 views.py 如下所示:
class ContactFormView(FormView):
form_class = ContactForm
template_name = 'contact.html'
success_url = '/message-sent/'
def form_valid(self, form):
subject = form.cleaned_data.get('subject')
message = "{name} / {email} sent you the following message: ".format(
name=form.cleaned_data.get('name'),
email=form.cleaned_data.get('email')
)
message += "\n\n{0}".format(form.cleaned_data.get('message'))
sender = form.cleaned_data.get('email')
recipients = ['mail1@example.com', 'mail2@example.com']
honeypot = form.cleaned_data.get('phone_number')
if not honeypot:
send_mail(subject, message, sender, recipients)
return HttpResponseRedirect(self.get_success_url())
我的相关 forms.py :
class ContactForm(forms.Form):
phone_number = forms.CharField(required=False, label='Phone Number (keep this empty, or the form won\'t submit)') # honeypot
name = forms.CharField(required=True)
email = forms.EmailField(required=True)
subject = forms.CharField(required=True)
message = forms.CharField(widget=forms.Textarea)
我错过了一些非常明显的东西吗?
编辑:凭据肯定有效(如上所述,他们在我的本地开发环境中工作,我也可以使用相同的方式从我的服务器上的shell发送电子邮件证书)。启用fail_silently=False
不会导致异常。
EDIT_2:我修改了视图,如下所示:
def form_valid(self, form):
send_mail('Test Subject', 'Test Message', 'test@myemail.com', ['test@recipient.com'])
return HttpResponseRedirect(self.get_success_url())
收到一封电子邮件就好了。如您所见,在上面的视图中没有表单数据传递给send_mail()
。
答案 0 :(得分:1)
Aaaand ......我4小时调试的来源竟然是我的蜜罐。更具体地说,我的浏览器自动填写了蜜罐。
我在本地环境中没有发现问题,因为我的虚拟机浏览器中没有启用自动完成功能。但是,使用我的主机的主浏览器测试登台/生产服务器上的内容会导致蜜罐(屏幕关闭5000px)被填满。
这个答案适用于将来遇到类似问题的任何人。
如果您使用蜜罐,并且您的表单没有发送电子邮件,请关闭自动完成功能!还要注意保持蜜罐可见(尽管屏幕外)意味着它仍然可以由普通用户填写。用JS实际隐藏它可能是一个好主意。