Printing emails in Django

When developing applications in Django, it may be nice to print emails instead of sending them. If you send them you have to be careful which addresses you use. Just being on the safe side and always using @example.{com,org,net} is not enough, you have to use an address you can actually retrieve emails for. And you have to configure your development environment to actually deliver mails. And then wait for the whole thing in each code-try iteration.

So, basing myself on the testing code, I’ve added this to settings.py and mails are now printed:

if DEBUG:
 from utils import BogusSMTPConnection
 from django.core import mail
 mail.SMTPConnection = BogusSMTPConnection

Of course you’ll also need the BogusSMTPConnection class, I’ve defined it as following:

from textwrap import wrap
class BogusSMTPConnection(object):
  """Instead of sending emails, print them to the console."""

  def __init__(*args, **kwargs):
    print("Initialized bogus SMTP connection")

  def open(self):
    print("Open bogus SMTP connection")

  def close(self):
    print("Close bogus SMTP connection")

  def send_messages(self, messages):
    print("Sending through bogus SMTP connection:")
    for message in messages:
      print("tFrom: %s" % message.from_email)
      print("tTo: %s" % ", ".join(message.to))
      print("tSubject: %s" % message.subject)
      print("t%s" % "nt".join(wrap(message.body)))
      print(messages)
      return len(messages)

And that’s it.

You may also like:


6 responses to “Printing emails in Django”

  1. Jon Avatar

    This was really helpful, thanks. I was dreading the thought of setting up an SMTP server just to send emails I didn’t care about.

  2. Peter Avatar

    Just a nit, but I assume in the close method above you meant to print(“Close….) not clone.

    1. Pablo Avatar

      Thanks Peter, fixed!

  3. rohan Avatar

    Have you tried this:
    python -m smtpd -n -c DebuggingServer localhost:1025

    This will catch everything and redirect the input into standard out, which you can redirect if you want of course.

    Can’t claim credit, my fellow worker showed me. :)

  4. Jon Avatar

    FYI in Django 1.2 mail.SMTPConnection is deprecated, and this little trick no longer works. I don’t have a replacement solution yet, but I’ll post it here if I find one.

  5. Jon Avatar

    Ok, so this got much easier as of Django 1.2. Instead of writing your own class, just throw this in your settings.py:

    if DEBUG:
    EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

    See the rest of the options here.

Leave a Reply

Hi, I'm Pablo, this is my web site. You can follow me or connect with me:

Or get new content delivered directly to your inbox.

Join 4,025 other subscribers

I'm writing a book

Stack of copies of How to Hire and Manage Remote Teams

How to Hire and Manage Remote Teams, where I distill all the techniques I've been using to build and manage distributed teams for the past 10 years.

I write about:

announcement blogging book book review book reviews books building Sano Business C# Clojure ClojureScript Common Lisp database Debian Esperanto Git history idea Java Kubuntu Lisp music Non-Fiction OpenID programming Python Rails rant re-frame release Ruby Ruby on Rails Sano science science fiction security self-help Star Trek startups technology Ubuntu video web Windows WordPress

I've been writing for a while:

%d bloggers like this: