处理Django中的联系表单,电子邮件未发送

5

我有一个应用程序,用户可以通过填写表格来联系我,在表格中,用户只需要填写他的详细信息、电子邮件和主题。

代码没有报错,但在设置好一切后,我无法收到邮件,但联系人详细信息被存储在数据库中,这正是我想要的。

以下是我的代码。

Models.py

class Contact(models.Model):
    name = models.CharField(max_length=100)
    message = models.TextField()
    sender = models.EmailField()
    phone = models.CharField(max_length=10)
    cc_myself = models.BooleanField(blank=True)
    time = models.DateTimeField(auto_now_add=True, db_index=True)

    def __str__(self):
        return 'Message for {}'.format(self.sender)

Forms.py

class ContactForm(forms.ModelForm):

    class Meta:
        model = Contact
        fields = ['name', 'sender', 'phone', 'message', 'cc_myself']

Views.py

def contact(request):
    if request.method == 'POST':
        contact_form = ContactForm(request.POST)

        if contact_form.is_valid():
            name = contact_form.cleaned_data['name']
            message = contact_form.cleaned_data['message']
            sender = contact_form.cleaned_data['sender']
            phone = contact_form.cleaned_data['phone']
            cc_myself = contact_form.cleaned_data['cc_myself']

            recipients = ['xxxx@gmail.com']
            if cc_myself:
                recipients.append(sender)

            send_mail(name, message, sender, recipients)
            contact_form.save()
            messages.success(request, 'Message sent successfully')
            return redirect('contact:contact')
        else:
            messages.error(request, 'Error sending your Message')

    else:
        contact_form = ContactForm(request.POST)

    context = {
        "contact_form": contact_form,
    }
    template = 'contact.html'
    return render(request, template, context)

Gmail服务器

EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'xxx@gmail.com'
EMAIL_HOST_PASSWORD = 'xxxx'
EMAIL_PORT = '587'
EMAIL_USE_TLS = True

终端输出

MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit
Subject: adie Ugbe
From: abcd@gmail.com
To: xxxx@gmail.com
Date: Sun, 07 Jan 2018 11:11:10 -0000
Message-ID: <20180107111110.29855.10393@1.0.0.127.in-addr.arpa>

oh oh no ooo dddddddd se skan
-------------------------------------------------------------------------------
Successful

2
在你的send_mail函数中使用fail_silently=False进行测试,send_mail(name, message, sender, recipients, fail_silently=False),将会引发smtplib.SMTPException异常。可能是来自smtp服务器的异常。 - Maykel Llanes Garcia
你有检查过你的邮件垃圾箱吗? - alecxe
@King 你试过使用类似 console backend 这样简单的后端吗?知道另一个后端是否按预期工作将有助于缩小问题范围。 - Louis
1
请查看其他答案:https://dev59.com/g10Z5IYBdhLWcg3wiw4w请确保在设置中:EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' - Nadav
1
找到了问题。我意识到在我的设置文件中有EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'。将其删除后问题得到解决。它与SMTP发生了冲突。 - King
显示剩余7条评论
4个回答

2

首先,你缺少了EMAIL_BACKEND

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

1
从你的输出来看,它清楚地显示电子邮件被记录到控制台,这意味着发送过程正在模拟您的控制台上。从技术上讲,这构成了发送电子邮件。
无论如何,我怀疑这是因为您将电子邮件后端设置为
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

你需要做的是将电子邮件后端更改为:

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


1

当我进行配置后,它可以成功地向我发送电子邮件。我已经编写了代码,请查看链接获取代码: https://www.dropbox.com/s/1ouq5mklq5t51su/mail.zip?dl=0

settings.py:

INSTALLED_APPS = [
    'user',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

STATIC_URL = '/static/'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'xxxxx@gmail.com'
EMAIL_HOST_PASSWORD = 'xxxxxxx'
EMAIL_PORT = '587'
EMAIL_USE_TLS = True

views.py:

from django.shortcuts import render,redirect
from user.models import *
from django.core.mail import send_mail
from user.forms import *

def contact(request):
    if request.method == 'POST':
        contact_form = ContactForm(request.POST)

        if contact_form.is_valid():
            name = contact_form.cleaned_data['name']
            message = contact_form.cleaned_data['message']
            sender = contact_form.cleaned_data['sender']
            phone = contact_form.cleaned_data['phone']
            cc_myself = contact_form.cleaned_data['cc_myself']

             recipients = ['xxxxx@gmail.com']
             if cc_myself:
             recipients.append(sender)

             send_mail(name, message, sender, recipients)
             contact_form.save()
             print('Successful')
             return redirect('contact')
        else:
            print('Fails')

    else:
        contact_form = ContactForm(request.POST)

    context = {
        "contact_form": contact_form,
    }
    template = 'contact.html'
    return render(request, template, context)

models.py:

from django.db import models

class Contact(models.Model):
    name = models.CharField(max_length=100)
    message = models.TextField()
    sender = models.EmailField()
    phone = models.CharField(max_length=10)
    cc_myself = models.BooleanField(blank=True)
    time = models.DateTimeField(auto_now_add=True, db_index=True)

    def __str__(self):
        return 'Message for {}'.format(self.sender)

contact.html:

<form method="post">
  {% csrf_token %}
  {{contact_form.as_p}}
  <input type="submit" name="" value="submit">
  </form>

1
你和原帖作者有什么不同的做法? - Louis
EMAIL_HOST_USER = '我的 Gmail 帳戶',EMAIL_HOST_PASSWORD = '我的密碼',recipients = ['收件人電子郵件地址',] - Md. Mizanur Rahman Khan
ContactForm没有save属性。 - King
请下载我的项目并在您的服务器上运行。我使用的是Python 3和Django 1.11 TLS版本。 - Md. Mizanur Rahman Khan
是的,它不是。EMAIL_BACKEND 是问题所在。 - King
显示剩余9条评论

-1

Django设置就是关键!

Django在后台作业中发送电子邮件,如果您想使用外部作业管理器,则必须正确设置这些环境变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接