User’s Guide

Sending Messages

Sending Message Objects

To send a message, create an email.message.EmailMessage object, set appropriate headers (“From” and one of “To”, “Cc” or “Bcc”, at minimum), then pass it to send() with the hostname and port of an SMTP server.

For details on creating email.message.EmailMessage objects, see the stdlib documentation examples.

Note

Confusingly, email.message.Message objects are part of the legacy email API (prior to Python 3.3), while email.message.EmailMessage objects support email policies other than the older email.policy.Compat32.

Use email.message.EmailMessage where possible; it makes headers easier to work with.

import asyncio
from email.message import EmailMessage

import aiosmtplib

async def send_hello_world():
    message = EmailMessage()
    message["From"] = "root@localhost"
    message["To"] = "somebody@example.com"
    message["Subject"] = "Hello World!"
    message.set_content("Sent via aiosmtplib")

    await aiosmtplib.send(message, hostname="127.0.0.1", port=1025)

event_loop = asyncio.get_event_loop()
event_loop.run_until_complete(send_hello_world())

Multipart Messages

Pass email.mime.multipart.MIMEMultipart objects to send() to send messages with both HTML text and plain text alternatives.

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText


message = MIMEMultipart("alternative")
message["From"] = "root@localhost"
message["To"] = "somebody@example.com"
message["Subject"] = "Hello World!"

plain_text_message = MIMEText("Sent via aiosmtplib", "plain", "utf-8")
html_message = MIMEText(
    "<html><body><h1>Sent via aiosmtplib</h1></body></html>", "html", "utf-8"
)
message.attach(plain_text_message)
message.attach(html_message)

Sending Raw Messages

You can also send a str or bytes message, by providing the sender and recipients keyword arguments.

import asyncio

import aiosmtplib

async def send_hello_world():
    message = """To: somebody@example.com
    From: root@localhost
    Subject: Hello World!

    Sent via aiosmtplib
    """

    await aiosmtplib.send(
        message,
        sender="root@localhost",
        recipients=["somebody@example.com"],
        hostname="127.0.0.1",
        port=1025
    )

event_loop = asyncio.get_event_loop()
event_loop.run_until_complete(send_hello_world())

Authentication

To authenticate, pass the username and password keyword arguments to send().

await send(
    message,
    hostname="127.0.0.1",
    port=1025,
    username="test",
    password="test"
)

Connection Options

Connecting Over TLS/SSL

If an SMTP server supports direct connection via TLS/SSL, pass use_tls=True.

await send(message, hostname="smtp.gmail.com", port=465, use_tls=True)

STARTTLS connections

Many SMTP servers support the STARTTLS extension over port 587. When using STARTTLS, the initial connection is made over plaintext, and after connecting a STARTTLS command is sent, which initiates the upgrade to a secure connection. To connect to a server that uses STARTTLS, set start_tls to True.

await send(message, hostname="smtp.gmail.com", port=587, start_tls=True)