In this Django Sending E-mails chapter, we will discuss Django comes with a ready and easy-to-use light engine to send e-mail. Similar to Python you just need an import of smtplib. In Django you just need to import django.core.mail. To start sending e-mail, edit your project settings.py file and set the following options β
- EMAIL_HOST β smtp server.
- EMAIL_HOST_USER β Login credential for the smtp server.
- EMAIL_HOST_PASSWORD β Password credential for the smtp server.
- EMAIL_PORT β smtp server port.
- EMAIL_USE_TLS or _SSL β True if secure connection.
Sending a Simple E-mail
Let’s create a “sendSimpleEmail” view to send a simple e-mail.
from django.core.mail import send_mail from django.http import HttpResponse def sendSimpleEmail(request,emailto): res = send_mail("hello paul", "comment tu vas?", "paul@polo.com", [emailto]) return HttpResponse('%s'%res)
Here is the details of the parameters of send_mail β
- subject β E-mail subject.
- message β E-mail body.
- from_email β E-mail from.
- recipient_list β List of receiversβ e-mail address.
- fail_silently β Bool, if false send_mail will raise an exception in case of error.
- auth_user β User login if not set in settings.py.
- auth_password β User password if not set in settings.py.
- connection β E-mail backend.
- html_message β (new in Django 1.7) if present, the e-mail will be multipart/alternative.
Let’s create a URL to access our view β
from django.conf.urls import patterns, url urlpatterns = paterns('myapp.views', url(r'^simpleemail/(?P<emailto> [\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4})/', 'sendSimpleEmail' , name = 'sendSimpleEmail'),)
So when accessing /myapp/simpleemail/polo@gmail.com, you will get the following page β
Sending Multiple Mails with send_mass_mail
The method returns the number of messages successfully delivered. This is same as send_mail but takes an extra parameter; datatuple, our sendMassEmail view will then be β
from django.core.mail import send_mass_mail from django.http import HttpResponse def sendMassEmail(request,emailto): msg1 = ('subject 1', 'message 1', 'polo@polo.com', [emailto1]) msg2 = ('subject 2', 'message 2', 'polo@polo.com', [emailto2]) res = send_mass_mail((msg1, msg2), fail_silently = False) return HttpResponse('%s'%res)
Let’s create a URL to access our view β
from django.conf.urls import patterns, url urlpatterns = paterns('myapp.views', url(r'^massEmail/(?P<emailto1> [\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4})/(?P<emailto2> [\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4})', 'sendMassEmail' , name = 'sendMassEmail'),)
When accessing /myapp/massemail/polo@gmail.com/sorex@gmail.com/, we get β
send_mass_mail parameters details are β
- datatuples β A tuple where each element is like (subject, message, from_email, recipient_list).
- fail_silently β Bool, if false send_mail will raise an exception in case of error.
- auth_user β User login if not set in settings.py.
- auth_password β User password if not set in settings.py.
- connection β E-mail backend.
As you can see in the above image, two messages were sent successfully.
Note β In this Django sending E-mails example we are using Python smtp debuggingserver, that you can launch using β
$python -m smtpd -n -c DebuggingServer localhost:1025
This means all your sent e-mails will be printed on stdout, and the dummy server is running on localhost:1025.
Sending e-mails to admins and managers using mail_admins and mail_managers methods
These methods send e-mails to site administrators as defined in the ADMINS option of the settings.py file, and to site managers as defined in MANAGERS option of the settings.py file. Let’s assume our ADMINS and MANAGERS options look like β
ADMINS = ((‘polo’, ‘polo@polo.com’),)
MANAGERS = ((‘popoli’, ‘popoli@polo.com’),)
from django.core.mail import mail_admins from django.http import HttpResponse def sendAdminsEmail(request): res = mail_admins('my subject', 'site is going down.') return HttpResponse('%s'%res)
The above code will send an e-mail to every admin defined in the ADMINS section.
from django.core.mail import mail_managers from django.http import HttpResponse def sendManagersEmail(request): res = mail_managers('my subject 2', 'Change date on the site.') return HttpResponse('%s'%res)
The above code will send an e-mail to every manager defined in the MANAGERS section.
Parameters details β
- Subject β E-mail subject.
- message β E-mail body.
- fail_silently β Bool, if false send_mail will raise an exception in case of error.
- connection β E-mail backend.
- html_message β (new in Django 1.7) if present, the e-mail will be multipart/alternative.
Sending HTML E-mail
Sending HTML message in Django >= 1.7 is as easy as β
from django.core.mail import send_mail from django.http import HttpResponse res = send_mail("hello paul", "comment tu vas?", "paul@polo.com", ["polo@gmail.com"], html_message=")
This will produce a multipart/alternative e-mail.
But for Django < 1.7 sending HTML messages is done via the django.core.mail.EmailMessage class then calling ‘send’ on the object β
Let’s create a “sendHTMLEmail” view to send an HTML e-mail.
from django.core.mail import EmailMessage from django.http import HttpResponse def sendHTMLEmail(request , emailto): html_content = "<strong>Comment tu vas?</strong>" email = EmailMessage("my subject", html_content, "paul@polo.com", [emailto]) email.content_subtype = "html" res = email.send() return HttpResponse('%s'%res)
Parameters details for the EmailMessage class creation β
- Subject β E-mail subject.
- message β E-mail body in HTML.
- from_email β E-mail from.
- to β List of receiversβ e-mail address.
- bcc β List of βBccβ receiversβ e-mail address.
- connection β E-mail backend.
Let’s create a URL to access our view β
from django.conf.urls import patterns, url urlpatterns = paterns('myapp.views', url(r'^htmlemail/(?P<emailto> [\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4})/', 'sendHTMLEmail' , name = 'sendHTMLEmail'),)
When accessing /myapp/htmlemail/polo@gmail.com, we get β
Sending E-mail with Attachment
This is done by using the ‘attach’ method on the EmailMessage object.
A view to send an e-mail with attachment will be β
from django.core.mail import EmailMessage from django.http import HttpResponse def sendEmailWithAttach(request, emailto): html_content = "Comment tu vas?" email = EmailMessage("my subject", html_content, "paul@polo.com", emailto]) email.content_subtype = "html" fd = open('manage.py', 'r') email.attach('manage.py', fd.read(), 'text/plain') res = email.send() return HttpResponse('%s'%res)
Details on attach arguments β
- filename β The name of the file to attach.
- content β The content of the file to attach.
- mimetype β The attachment’s content mime type.
Next Topic : Click Here