Отправка email в Python через SMTP: простое и быстрое руководство
Введение в SMTP
Simple Mail Transfer Protocol (SMTP) — протокол для отправки и маршрутизации электронной почты между почтовыми серверами.
Python предоставляет модуль smtplib, определяющий объект сессии SMTP-клиента, который можно использовать для отправки почты на любой компьютер в Интернете с SMTP или ESMTP демоном-слушателем.
Создание SMTP-объекта
import smtplib
smtpObj = smtplib.SMTP([host[, port[, local_hostname]]])
Параметры:
host — хост, на котором работает ваш SMTP-сервер. Можно указать IP-адрес или доменное имя (например,
tutorialspoint.com). Опционально.port — если задан
host, нужно указать порт, где слушает SMTP-сервер. Обычно это 25.local_hostname — если SMTP-сервер работает на локальной машине, можно указать
localhost.
Метод sendmail
У объекта SMTP есть метод экземпляра sendmail, обычно используемый для отправки сообщения. Принимает три параметра:
sender — строка с адресом отправителя.
receivers — список строк, по одной для каждого получателя.
message — сообщение как строка, отформатированная согласно соответствующим RFC.
Пример: отправка простого email
#!/usr/bin/python
import smtplib
sender = 'from@fromdomain.com'
receivers = ['to@todomain.com']
message = """From: From Person
To: To Person
Subject: SMTP e-mail test
This is a test e-mail message.
"""
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message)
print("Successfully sent email")
except smtplib.SMTPException:
print("Error: unable to send email")
Здесь базовое email-сообщение помещено в message с использованием тройных кавычек, с правильным форматированием заголовков. Email требует заголовки From, To и Subject, отделенные от тела пустой строкой.
Для отправки используется smtpObj для подключения к SMTP-серверу на локальной машине, затем метод sendmail с сообщением, адресом отправителя и адресом назначения (даже если from и to внутри письма, они не всегда используются для маршрутизации).
Если у вас нет SMTP-сервера на локальной машине, можно использовать smtplib для связи с удаленным SMTP-сервером. Если вы не используете веб-почту (Hotmail, Yahoo! Mail), ваш провайдер должен предоставить детали исходящего почтового сервера:
smtplib.SMTP('mail.your-domain.com', 25)
Отправка HTML-email с помощью Python
При отправке текстового сообщения через Python всё содержимое рассматривается как простой текст. Даже если включить HTML-теги в текстовое сообщение, оно отобразится как обычный текст, и теги не будут отформатированы по HTML-синтаксису. Но Python позволяет отправить HTML-сообщение как настоящее HTML.
При отправке можно указать MIME-версию, тип содержимого и кодировку символов для отправки HTML-email.
Пример: HTML-email
#!/usr/bin/python
import smtplib
message = """From: From Person
To: To Person
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP HTML e-mail test
This is an e-mail message to be sent in HTML format
This is HTML message.
This is headline.
"""
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message)
print("Successfully sent email")
except smtplib.SMTPException:
print("Error: unable to send email")
Отправка вложений как email
Для отправки email со смешанным содержимым нужно установить заголовок Content-type в multipart/mixed. Затем текстовые и вложенные разделы можно указать внутри границ (boundaries).
Граница начинается с двух дефисов и уникального номера, который не может появиться в теле сообщения. Финальная граница, обозначающая последнюю секцию email, также должна заканчиваться двумя дефисами.
Прикрепленные файлы должны быть закодированы функцией pack("m") для base64-кодирования перед передачей.
Пример: отправка файла как вложения
#!/usr/bin/python
import smtplib
import base64
filename = "/tmp/test.txt"
# Чтение файла и кодирование в base64
fo = open(filename, "rb")
filecontent = fo.read()
encodedcontent = base64.b64encode(filecontent)
sender = 'webmaster@tutorialpoint.com'
receiver = 'amrood.admin@gmail.com'
marker = "AUNIQUEMARKER"
body = """This is a test email to send an attachment."""
# Основные заголовки
part1 = """From: From Person
To: To Person
Subject: Sending Attachment
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=%s
--%s
""" % (marker, marker)
# Текстовая часть
part2 = """Content-Type: text/plain
Content-Transfer-Encoding: 8bit
%s
--%s
""" % (body, marker)
# Секция вложения
part3 = """Content-Type: multipart/mixed; name="%s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=%s
%s
--%s--
""" % (filename, filename, encodedcontent, marker)
message = part1 + part2 + part3
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receiver, message)
print("Successfully sent email")
except Exception:
print("Error: unable to send email")
Python
- Освоение типов данных в Python: практическое руководство
- Мастерство операторов Python: Полное руководство
- Оператор pass в Python: практическое руководство
- Аргументы функций в Python: позиционные, именованные и параметры по умолчанию
- Словари в Python: создание, манипуляции и продвинутые техники
- Обработка исключений в Python: try, except, else и finally подробно
- ИК-датчик температуры TMP006 с Raspberry Pi: библиотека Python и руководство по настройке
- Создание удалённого датчика температуры на Raspberry Pi и Python — пошаговое руководство
- Вычисление среднего значения в Python: практическое руководство
- Легкая перемена двух Python-переменных без временной переменной