【问题标题】:Django contact form sending emailDjango 联系表发送电子邮件
【发布时间】:2018-04-15 14:31:57
【问题描述】:

我创建了一个联系表单,以便在用户填写时向我发送电子邮件。一切似乎都正常,但我没有收到电子邮件。

这是我的控制台输出:

Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Subject: Michael Plemmons
From: mplemmons1982@gmail.com
To: californiamikegreen@yahoo.com
Date: Thu, 02 Nov 2017 22:40:50 -0000
Message-ID: <20171102224050.12741.24539@ubuntu>

hello this is a test
-------------------------------------------------------------------------------
[02/Nov/2017 22:40:50] "POST /contact/ HTTP/1.1" 302 0
[02/Nov/2017 22:40:50] "GET /success/ HTTP/1.1" 200 36

这是views.py

from django.shortcuts import render
from django.http import HttpResponse, JsonResponse, HttpResponseRedirect
from .models import *
from .forms import contact_form
from django.core.mail import send_mail, BadHeaderError
from django.shortcuts import redirect

def contact(request):
    if request.method == 'GET':
        form = contact_form()
    else:
        form = contact_form(request.POST)
        if form.is_valid():
            contact_name = form.cleaned_data['contact_name']
            contact_email = form.cleaned_data['contact_email']
            contact_message = form.cleaned_data['contact_message']
            try:
                send_mail(contact_name, contact_message, contact_email, ['californiamikegreen@yahoo.com'])
            except BadHeaderError:
                return HttpResponse('Invalid header found.')
            return redirect('success')
    return render(request, "contact.html", {'form': form})


def success(request):
    return HttpResponse('Success! Thank you for your message.')

这是 urls.py

from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'contact/$',views.contact, name='contact'),
    url(r'^success/$', views.success, name='success'),
]

这是forms.py

from django import forms

from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.contrib.auth.models import User

class contact_form(forms.Form):
    contact_name = forms.CharField(label='Contact Name', max_length=255)
    contact_email = forms.CharField(label='Contact Email',max_length=255)
    contact_message = forms.CharField(
        required=True,
        widget=forms.Textarea
    )

和contact.html

{% block title %}Contact - {{ block.super }}{% endblock %}

{% block content %}
<h1>Contact</h1>
<form role="form" action="" method="post">
    {% csrf_token %}
    {{ form }}
    <button type="submit">Submit</button>
</form>
{% endblock %}

这包含在 settings.py 中

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

我有什么遗漏的东西才能真正发送到我的电子邮件吗?

谢谢

【问题讨论】:

    标签: python django email contact-form


    【解决方案1】:

    console backend,顾名思义,将电子邮件打印到控制台,不执行任何其他操作。

    您需要使用不同的电子邮件后端,例如 smtp backend 是默认值:

    EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
    

    然后,您必须使用您的电子邮件提供商的设置来配置您的设置,例如 EMAIL_HOST。请参阅the docs 了解更多信息。

    如果您不想使用 SMTP 后端,另一种常见的选择是使用 Mailgun 或 SendGrid 等事务性邮件提供程序。其中一些服务具有免费使用层级,这对于低容量的联系表单应该足够了。 django-anymail 应用程序支持多个事务性邮件提供商。

    【讨论】:

    • 哦,哇,比预期的要复杂。好吧,我用 smtp 替换了控制台,但我对其余部分感到困惑。我阅读了它并根据我的理解,如果我不提供任何参数,它会使用应该足够的默认值。如果需要,我在哪里设置所有其他值?我不挑剔,也没有任何具体要求,我只是希望它进入我的雅虎电子邮件。当我按原样运行它时,它说连接被拒绝。我看到我需要调用 mail.get_connection() 作为连接。我看不出我需要在哪里调用它。在我发送表单信息之前的views.py中?
    • 如果你没有设置任何EMAIL_ 设置,那么 Django 将尝试使用localhost。如果您没有运行邮件服务器,那么您将收到错误消息。如果要使用 Yahoo,则需要设置 EMAIL_HOST_USEREMAIL_HOST_PASSWORD 和其他设置,例如EMAIL_HOST = 'smtp.yahoo.com'(我不知道这是否是正确的域)。您可能会发现它不起作用,即使使用正确的 SMTP 设置(我在 Stack Overflow 上看到很多关于人们在使用 Gmail 时遇到问题的问题)。因此,按照我的建议,使用事务性邮件提供商可能会更容易。
    • 您不必在任何地方致电mail.get_connection() as connection。如果您的电子邮件设置配置正确,那么您当前的send_mail() 命令应该可以正常工作。
    • 您可能还会发现使用用户的电子邮件地址作为from_email 可能会导致问题(邮件服务器不喜欢“来自 john.doe@gmail.com”的电子邮件来自非-谷歌服务器)。解决方案是使用您自己的电子邮件地址作为from_email,并使用他们的电子邮件作为reply_to(为此,您需要使用EmailMessage 而不是send_mail)。
    • 哇,好的,非常感谢。你的解释对我帮助很大。
    猜你喜欢
    • 2020-12-07
    • 2011-05-30
    • 1970-01-01
    • 2020-03-23
    • 2020-05-05
    • 2020-05-20
    • 2019-10-03
    • 2016-03-02
    • 1970-01-01
    相关资源
    最近更新 更多