Blog‎ > ‎

Send mails with Django

posted Jul 12, 2011, 9:12 AM by Luca Stancapiano   [ updated Aug 4, 2011, 11:33 AM ]
Here a simple script to send a mail through Django, a very fast web framework written in Python:

sendmail.py:

from django.core.mail import send_mail

send_mail('subject', 'text by Luke', 'jedim@vige.it', ['lsflashboss62@gmail.com'], fail_silently=False)


settings.py:

# Host for sending e-mail.
EMAIL_HOST = 'smtp.gmail.com'

# Port for sending e-mail.
EMAIL_PORT = 25

# Optional SMTP authentication information for EMAIL_HOST.
EMAIL_HOST_USER = 'lsflashboss62@gmail.com'
EMAIL_HOST_PASSWORD = 'passwwooooooorddddd'
EMAIL_USE_TLS = True


If we want send attachments we need to write a new send_mail function. Here an example:

from django.core.mail import get_connection, EmailMessage
import tempfile

def send_mail(subject, message, from_email, recipient_list,
              fail_silently=False, auth_user=None, auth_password=None,
              connection=None):
    connection = connection or get_connection(username=auth_user,
                                    password=auth_password,
                                    fail_silently=fail_silently)
    mail = EmailMessage(subject, message, from_email, recipient_list,
                        connection=connection)
    attach = tempfile.NamedTemporaryFile(delete=True)
    mail.attach(attach.name, attach.read(), attach.content_type)
    return mail.send()


To create a mail crawler, it's very simple:

download Django cron from svn:

svn checkout http://django-cron.googlecode.com/svn/trunk/ django-cron-read-only

and install it in the python path. More details are in the README.txt of the django cron project.

In the INSTALLED_APPS of your settings.py add the django_cron project:

INSTALLED_APPS = (
    ...
    'django_cron',
    ...
)

Add the rows in the urls.py:

...
import django_cron

...
django_cron.autodiscover()
...

Add a cron.py file in the same path of your settings.py:

from django_cron import cronScheduler, Job

from Myproject.polls import send_mail


class CheckMail(Job):


        # run every 300 seconds (5 minutes)

        run_every = 300

                

        def job(self):

                # This will be executed every 5 minutes

                send_mail('ciao', 'ciao da Luke', 'jedim@vige.it', ['lsflashboss62@gmail.com'], fail_silently=False)


cronScheduler.register(CheckMail)


This cron starts at the first request of the webapp and it will send emails each 300 ms

Comments