King
King

Reputation: 2035

Handling contact form in Django, email not sent

I have an application whereby a user can contact me by filling out a form and in the form the user just has to fill in his details and his email and subject.

The code throws no error but I could not receive the mail after setting up everything, but the contact details gets stored in the database as I want it to be stored.

Below is my code.

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 = ['[email protected]']
            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 server

EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = '[email protected]'
EMAIL_HOST_PASSWORD = 'xxxx'
EMAIL_PORT = '587'
EMAIL_USE_TLS = True

terminal output

MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit
Subject: adie Ugbe
From: [email protected]
To: [email protected]
Date: Sun, 07 Jan 2018 11:11:10 -0000
Message-ID: <[email protected]>

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

Upvotes: 5

Views: 2457

Answers (4)

maguri
maguri

Reputation: 454

Django Setting is the trick!

Django sends the emails in background job, and you have to set this ENV VARs correctly if you want to use and external job manager.

Upvotes: -1

Fadil Olamyy Wahab
Fadil Olamyy Wahab

Reputation: 626

From your output,it clearly shows that the email is being logged to the console which means the sending process is being simulated on your console. This technically constitute sending the email.

Anyway, I suspect this is happening because you have your email backend set to

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

What you need to do is change the email backend to :

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

Upvotes: 1

addohm
addohm

Reputation: 2475

First off, you're missing your EMAIL_BACKEND

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

Upvotes: 2

When I am configured it. It sends me email successfully. I have done the code please see it. Visit the link for code: 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 = '[email protected]'
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 = ['[email protected]']
             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>

Upvotes: 1

Related Questions