Email

Back

Loading concept...

📧 Django Email: Your App’s Digital Post Office

Imagine your Django app is a friendly village. Sometimes, villagers need to send letters to people in other villages. That’s exactly what email does for your app!


🎯 The Big Picture: Email Overview

What is Django Email?

Think of Django’s email system like a magic mailbox. You write a letter, put it in the mailbox, and whoosh — it flies to someone’s inbox anywhere in the world!

graph TD A["🖊️ Your Django App"] --> B["📮 Django Email System"] B --> C["📡 Email Server SMTP"] C --> D[📬 User's Inbox]

Why do apps send emails?

  • 🔐 “Hey! Here’s your password reset link!”
  • 👋 “Welcome to our app!”
  • 🛒 “Your order is on its way!”
  • 📢 “Don’t miss our new features!”

Django gives you two main ways to send emails:

Tool Best For
send_mail() Quick, simple messages
EmailMessage Fancy emails with attachments

📤 The send_mail Function

Your First Magic Spell for Sending Email

The send_mail function is like saying: “Dear mailbox, please send this message for me!”

The Basic Recipe

from django.core.mail import send_mail

send_mail(
    subject='Hello!',
    message='How are you?',
    from_email='me@myapp.com',
    recipient_list=['friend@email.com'],
)

Breaking It Down (Like Building Blocks!)

Block What It Does Example
subject The title of your letter 'Welcome!'
message What you want to say 'Hi there!'
from_email Who is sending 'noreply@myapp.com'
recipient_list Who receives it (a list!) ['user@email.com']

🌟 Real Example: Welcome Email

from django.core.mail import send_mail

def welcome_new_user(user_email, username):
    send_mail(
        subject=f'Welcome, {username}!',
        message='We are so happy you joined!',
        from_email='welcome@myapp.com',
        recipient_list=[user_email],
    )

Extra Options (Power-Ups!)

send_mail(
    subject='Important!',
    message='Plain text version',
    from_email='me@myapp.com',
    recipient_list=['friend@email.com'],
    fail_silently=False,  # Show errors
    html_message='<b>HTML version</b>',
)
Option What It Does
fail_silently=False Tells you if something breaks
fail_silently=True Stays quiet even if it fails
html_message Pretty HTML version of email

📦 The EmailMessage Class

When You Need More Control

Imagine send_mail is a paper airplane. EmailMessage is a full delivery truck — it can carry more stuff!

When to Use EmailMessage?

  • 📎 You want to attach files
  • 📋 You need CC or BCC
  • 🎨 You want full control over everything

The Basic Recipe

from django.core.mail import EmailMessage

email = EmailMessage(
    subject='Your Report',
    body='Here is your monthly report.',
    from_email='reports@myapp.com',
    to=['boss@company.com'],
)
email.send()

Adding Attachments (Like Taping a Photo to Your Letter!)

from django.core.mail import EmailMessage

email = EmailMessage(
    subject='Photos from Trip',
    body='Check out these pics!',
    from_email='me@myapp.com',
    to=['friend@email.com'],
)

# Attach a file from disk
email.attach_file('/path/to/photo.jpg')

# Or attach content directly
email.attach(
    'report.pdf',
    pdf_content,
    'application/pdf'
)

email.send()

Adding CC and BCC

email = EmailMessage(
    subject='Team Update',
    body='Great news everyone!',
    from_email='manager@company.com',
    to=['team@company.com'],
    cc=['supervisor@company.com'],
    bcc=['records@company.com'],
)
email.send()
Field Who Sees It? What It Means
to Everyone Main recipients
cc Everyone “Also sending to…”
bcc Only sender Secret copy

⚙️ Email Configuration

Setting Up Your Magic Mailbox

Before sending any email, you need to tell Django where to send it. This is like giving your app the address of the post office!

The Settings You Need

Add these to your settings.py:

# Email Configuration
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'your@gmail.com'
EMAIL_HOST_PASSWORD = 'your-app-password'
DEFAULT_FROM_EMAIL = 'noreply@myapp.com'

What Does Each Setting Mean?

graph TD A["EMAIL_BACKEND"] --> B["Which delivery truck?"] C["EMAIL_HOST"] --> D["Post office address"] E["EMAIL_PORT"] --> F["Which door to use"] G["EMAIL_USE_TLS"] --> H["Lock the envelope?"] I["EMAIL_HOST_USER"] --> J["Your ID badge"] K["EMAIL_HOST_PASSWORD"] --> L["Your secret code"]
Setting Simple Meaning Example
EMAIL_BACKEND How to send emails SMTP, Console, File
EMAIL_HOST Email server address smtp.gmail.com
EMAIL_PORT Server door number 587 or 465
EMAIL_USE_TLS Encrypt? (Yes!) True
EMAIL_HOST_USER Your login you@gmail.com
EMAIL_HOST_PASSWORD Your password Use app passwords!

Different Backends (Different Delivery Methods!)

For Development (Testing):

# Prints emails to console
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

For Testing (Saves to files):

EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'
EMAIL_FILE_PATH = '/tmp/emails'

For Production (Real sending):

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

🔐 Security Tip: Use Environment Variables!

import os

EMAIL_HOST_USER = os.environ.get('EMAIL_USER')
EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_PASSWORD')

🎨 HTML Emails

Making Your Emails Beautiful!

Plain text is fine, but HTML emails are like postcards with pictures instead of plain letters!

Two Ways to Send HTML Emails

Method 1: Using send_mail with html_message

from django.core.mail import send_mail

send_mail(
    subject='Pretty Email!',
    message='Fallback text',
    from_email='me@myapp.com',
    recipient_list=['friend@email.com'],
    html_message='<h1>Hello!</h1><p>Nice</p>',
)

Method 2: Using EmailMessage

from django.core.mail import EmailMessage

email = EmailMessage(
    subject='Pretty Email!',
    body='<h1>Hello!</h1><p>This is nice!</p>',
    from_email='me@myapp.com',
    to=['friend@email.com'],
)
email.content_subtype = 'html'
email.send()

Using Django Templates (The Pro Way!)

from django.core.mail import send_mail
from django.template.loader import render_to_string

# Create email content from template
html_content = render_to_string(
    'emails/welcome.html',
    {'username': 'Alex', 'site_name': 'MyApp'}
)

text_content = render_to_string(
    'emails/welcome.txt',
    {'username': 'Alex', 'site_name': 'MyApp'}
)

send_mail(
    subject='Welcome to MyApp!',
    message=text_content,
    from_email='welcome@myapp.com',
    recipient_list=['alex@email.com'],
    html_message=html_content,
)

Example HTML Template (emails/welcome.html)

<!DOCTYPE html>
<html>
<head>
    <style>
        .container { padding: 20px; }
        .header { color: #4CAF50; }
        .button {
            background: #4CAF50;
            color: white;
            padding: 10px 20px;
            text-decoration: none;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1 class="header">Welcome, {{ username }}!</h1>
        <p>Thanks for joining {{ site_name }}.</p>
        <a href="#" class="button">Get Started</a>
    </div>
</body>
</html>

💡 Best Practices for HTML Emails

Do ✅ Don’t ❌
Include plain text fallback Forget non-HTML readers
Use inline CSS Use external stylesheets
Test across email clients Assume it looks same everywhere
Keep images small Use huge images

🎉 Putting It All Together

A Complete Example: Order Confirmation

from django.core.mail import EmailMessage
from django.template.loader import render_to_string

def send_order_confirmation(order):
    # Render HTML template
    html = render_to_string('emails/order.html', {
        'order': order,
        'items': order.items.all(),
    })

    # Create email
    email = EmailMessage(
        subject=f'Order #{order.id} Confirmed!',
        body=html,
        from_email='orders@shop.com',
        to=[order.customer.email],
    )
    email.content_subtype = 'html'

    # Attach receipt PDF
    email.attach_file(order.receipt_path)

    # Send it!
    email.send()

🧠 Quick Recap

graph TD A["Django Email"] --> B["send_mail"] A --> C["EmailMessage"] B --> D["Quick &amp; Simple"] C --> E["Attachments &amp; Control"] A --> F["Configuration"] F --> G["settings.py"] A --> H["HTML Emails"] H --> I["Templates"]

Remember:

  • 📤 send_mail() = Fast and simple
  • 📦 EmailMessage = Full control + attachments
  • ⚙️ Configure in settings.py first!
  • 🎨 HTML emails = Pretty but include text fallback

You’re now ready to make your Django app communicate with the world! 🚀

Loading story...

Story - Premium Content

Please sign in to view this story and start learning.

Upgrade to Premium to unlock full access to all stories.

Stay Tuned!

Story is coming soon.

Story Preview

Story - Premium Content

Please sign in to view this concept and start learning.

Upgrade to Premium to unlock full access to all content.