无法通过Django联系表单发送电子邮件

时间:2014-11-16 14:47:33

标签: python django email

前言:我可以通过命令行(使用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()

1 个答案:

答案 0 :(得分:1)

Aaaand ......我4小时调试的来源竟然是我的蜜罐。更具体地说,我的浏览器自动填写了蜜罐。

我在本地环境中没有发现问题,因为我的虚拟机浏览器中没有启用自动完成功能。但是,使用我的主机的主浏览器测试登台/生产服务器上的内容会导致蜜罐(屏幕关闭5000px)被填满。

这个答案适用于将来遇到类似问题的任何人。

如果您使用蜜罐,并且您的表单没有发送电子邮件,请关闭自动完成功能!还要注意保持蜜罐可见(尽管屏幕外)意味着它仍然可以由普通用户填写。用JS实际隐藏它可能是一个好主意。