Зачем все это?
Почта на python - все еще распространенная задача, которая может потребоваться для:
- автоматической рассылки уведомлений или новостей
- интеграции функциональности email в твои приложения
- создания инструментов для автоматизации бизнес-процессов
Что же брать для этого? Ну тут 2 модуля есть в python. И они встроены в язык:
- smtplib - библиотечка для взаимодействия с SMTP серверами
- email - поможет с текстом, вложениями и HTML для небольшой красоты
База SMTP
В общем, это протокол, который поможет тебе отправить отчет на электронную почту. Думай о почтальоне, который бежит с твоим письмом.
Что надо для подключения к SMTP серверу?
- Адрес сервера - например, smtp.mail.ru. Нагуглить можно для нужного сервиса
- Порт - указывай 587 (TLS), потому что он более современный. Но помни и про старичка 465 порт, который SSL
- Логин - твой почтовый адрес
- Пароль - это пароль приложения, который создается в настройках безопасности твоего почтового ящика
Основы модуля email
Этот дружок-пирожок предоставляет тебе мощные инструменты для создания и обработки электронных писем. База модуля заключается в следующих компонентах:
- email.message - представление электронного письма
- email.mime - различные типы MIME (текст, вложения, разметка)
Также не забудь про Email Headers - это заголовки письма, такие как From, To, Subject - без них ты не сможешь отправить письмецо.
Давай код быстрее
Итак, давай подключимся к SMTP серверу:
import smtplib
server = smtplib.SMTP("smtp.mail.ru", 587)
server.starttls()
server.login("your@mail.ru", "gigapassword123")
Здесь ты видишь что мы сервер с портом указываем. Затем устанавливаем шифрование через starttls(). Ну а потом логинимся с нашим email и паролем.
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
server = smtplib.SMTP("smtp.mail.ru", 587)
server.starttls()
server.login("your@mail.ru", "gigapassword123")
msg = MIMEMultipart()
msg["From"] = "your@mail.ru"
msg["To"] = "stuffyuser@yandex.ru"
msg["Subject"] = "Test email"
body = "Some text this email"
msg.attach(MIMEText(body, "plain"))
server.send_message(msg)
Ну а здесь мы кидаем обычным текстовым письмом в получателя. Указываем заголовки письма и текст. В body можно упаковать также твою HTML разметку, затем меняем "plain" на "html" в прикреплении тела к письму. И твой электронный конверт улетит другому человеку.
body = "<h1>Hello</h1>"
msg.attach(MIMEText(body, "html"))
Теперь давай вложение прикрепим:
import smtplib
from email import encoders
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
server = smtplib.SMTP("smtp.mail.ru", 587)
server.starttls()
server.login("your@mail.ru", "gigapassword123")
msg = MIMEMultipart()
msg["From"] = "your@mail.ru"
msg["To"] = "stuffyuser@yandex.ru"
msg["Subject"] = "Test email"
body = "Test text"
msg.attach(MIMEText(body, "plain"))
filename = "test.txt"
with open(filename, "rb") as attachment:
part = MIMEBase("application", "octet-stream")
part.set_payload(attachment.read())
encoders.encode_base64(part)
part.add_header("Content-Disposition", f"attachment; filename={filename}")
msg.attach(part)
server.send_message(msg)
Читаем файл в бинарном режиме, кодируем его и прикрепляем.
Так, а обработка ошибок?
Теперь просто оберни все это в try-except. Ну а в finally укажи закрыть соединение с почтой.
import smtplib
from email import encoders
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
try:
server = smtplib.SMTP("smtp.mail.ru", 587)
server.starttls()
server.login("your@mail.ru", "gigapassword123")
msg = MIMEMultipart()
msg["From"] = "your@mail.ru"
msg["To"] = "stuffyuser@yandex.ru"
msg["Subject"] = "Test email"
body = "Test text"
msg.attach(MIMEText(body, "plain"))
filename = "test.txt"
with open(filename, "rb") as attachment:
part = MIMEBase("application", "octet-stream")
part.set_payload(attachment.read())
encoders.encode_base64(part)
part.add_header("Content-Disposition", f"attachment; filename={filename}")
msg.attach(part)
server.send_message(msg)
except Exception as e:
print(f"Error - {e}")
finally:
server.quit()
Заключение
Ну вот и все. Рассмотрели как отправить через python сообщения на почту своим друзьям-товарищам. Не забывай только о безопасности шифрования соединения, хранение паролей в переменных окружения и логирование можно еще прикрутить сюда.