Reputation: 2035
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
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
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
Reputation: 2475
First off, you're missing your EMAIL_BACKEND
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
Upvotes: 2
Reputation: 393
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