【问题标题】:Handling contact form in Django, email not sent在 Django 中处理联系表格,未发送电子邮件
【发布时间】:2018-06-09 23:22:23
【问题描述】:

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

代码没有引发错误,但我设置完所有内容后无法收到邮件,但联系人详细信息已存储在数据库中,因为我希望它被存储。

下面是我的代码。

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

【问题讨论】:

  • 在您的 send_mail 函数上使用 fail_silently=False 进行测试 send_mail(name, message, sender, recipients, fail_silently=False) 将引发 smtplib.SMTPException。也许是 smtp 服务器的一个例外。
  • 您检查过邮箱中的“垃圾邮件”文件夹吗?
  • 是的。它不在那里。甚至在发送电子邮件的已发送邮件中也没有
  • 请搜索其他答案:stackoverflow.com/questions/31324005/… 确保在设置中:EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
  • 发现了问题。我意识到我的设置文件中有EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'。删除它解决了问题。它与 smtp 冲突

标签: python django sendmail


【解决方案1】:

首先,你错过了你的EMAIL_BACKEND

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

【讨论】:

    【解决方案2】:

    当我配置它时。它成功地向我发送了电子邮件。我已经完成了代码,请看。访问代码链接: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>
    

    【讨论】:

    • 你和OP有什么不同?
    • 我刚刚用我自己的 gmail 帐户尝试了这段代码,它正在工作....
    • EMAIL_HOST_USER = '我的 gmail 帐户' ,EMAIL_HOST_PASSWORD = '我的密码',recipients = ['收件人电子邮件地址',]
    • ContactForm 没有属性保存。
    • 请下载我的项目并将其运行到您的服务器中。我使用 python 3 和 django 1.11 tls 版本。
    【解决方案3】:

    从您的输出中,它清楚地表明电子邮件正在记录到控制台,这意味着正在您的控制台上模拟发送过程。这在技术上构成发送电子邮件。

    无论如何,我怀疑这是因为您将电子邮件后端设置为

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

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

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

    【讨论】:

      【解决方案4】:

      Django Setting 是诀窍!

      Django 在后台作业中发送电子邮件,如果您想使用外部作业管理器,则必须正确设置此 ENV VAR。

      【讨论】:

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