【问题标题】:Unable to send email via Django contact form无法通过 Django 联系表发送电子邮件
【发布时间】:2014-11-16 23:36:07
【问题描述】:

前言:我可以在我的服务器上通过命令行(使用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()

【问题讨论】:

  • 你是否在 smtp 连接类型中使用了dummy
  • 不!使用默认的EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
  • 您是否能够使用您的 smtp 凭据成功发送电子邮件?此外,您在 send_mail 中有一个选项 fail_silently - docs.djangoproject.com/en/dev/topics/email/#send-mail - 你有任何例外吗?
  • 是的,来自我的本地环境。我使用相同的凭据在本地环境中发送电子邮件。我还在我的服务器上使用来自 shell 的 send_mail() 相同的凭据。证件肯定没问题。我将重新启用 fail_silently 并在第二部分回复您。
  • 不...没有例外。

标签: python django email


【解决方案1】:

啊……我 4 小时调试的源泉竟然是我的蜜罐。更具体地说,我的浏览器自动完成填充蜜罐。

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

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

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

【讨论】:

    猜你喜欢
    • 2020-03-23
    • 2018-01-21
    • 2018-04-15
    • 1970-01-01
    • 2020-12-07
    • 2011-05-30
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    相关资源
    最近更新 更多