Почта без хлопот: автоматизация отправки писем с помощью Python

15 ИЮНЯ 2022

------------------------------------------------------------------------

Наш телеграм-канал: t.me/@mailsgun_online

Youtube: youtube.com/@mailsgun_online

------------------------------------------------------------------------

Обновить

Рейтинг
Тензор

Разработчик системы СБИС

LolaS 7 часов назад

Уровень сложностиПростой
Время на прочтение3 мин

Количество просмотров1.2K

Туториал

Привет-привет! С вами снова Оля — программист Учебного центра компании «Тензор». Ранее я писала здесь о разработке ботов в Telegram, но в моем отделе не скупятся на творческие задачи — так что и эта статья вряд ли будет последней.

В этой статье расскажу, как автоматизировать процесс рассылки писем по электронной почте. Статья будет полезна абсолютно каждому, кто когда-либо сталкивался с необходимостью отправлять информацию или рекламные сообщения большому количеству получателей.

Задача

Поскольку Тензор работает с сотней вузов по всей России и каждый год отправляет около 4000 сертификатов о прохождении обучения или поздравления от компании, мы решили автоматизировать этот процесс😊.

Отправка писем по email — тема не новая, поэтому я направила силы в сторону интернета. Первый же запрос в google выдал нужный результат. Но радоваться было рано: при детальном разборе оказалось, что почта работает не так, как обычные мессенджеры. Сообщение, конечно, отправляется получателю, но не появляется в «Исходящих» вашего почтового ящика. В первых ссылках google по запросу «python отправить email» такая проблема не была даже упомянута 😞.

Для нас важно видеть все отправленные письма. Выяснилось: чтобы сообщение появилось в «Исходящих», его нужно принудительно туда записать. Как отправлять письма по email так, чтобы они сохранялись в вашем почтовом ящике, а не канули в Лету, расскажу в этой статье.

Процесс

Шаг 1. Создание

Перед тем как отправить письмо, его нужно создать (ясно как день). Для этого используется библиотека email. Её возможностям нет предела: отформатировать текст письма (поддерживается html-разметка), указать тему и даже прикрепить необходимые файлы.

Шаг 2. Отправка

Для отправки используется библиотека smtplib. С ее помощью подключаемся к серверу и отправляем письмо. Обычно по умолчанию используется порт 25, но пути email неисповедимы. Тут все индивидуально.

Шаг 3. Добавление в «Исходящие»

Чтобы добавить сообщение в «Исходящие» используется библиотека imaplib. С помощью нее подключаемся к нашему почтовому ящику и добавляем письмо в нужную папку. Важно, что при подключении используется другой порт — обычно это 143 (просто вот это число напиши и работать будет).

Скрипт готов. Итоговый вариант для отправки писем и записи в «Исходящие» с подробными комментариями прикреплен ниже.

import os
import time
import imaplib
import smtplib
from email.mime.text import MIMEText
from email.header    import Header
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
from email.utils import formatdate
from_mail = "corp-mail@tensor.ru"                         # Почта отправителя
from_passwd = "***"                                       # пароль от почты отправителя
server_adr = "***.tensor.ru"                              # адрес почтового сервера
to_mail = 'students-mail@tensor.ru'                       # адрес получателя
msg = MIMEMultipart()                                     # Создаем сообщение
msg["From"] = from_mail                                   # Добавляем адрес отправителя
msg['To'] = to_mail                                       # Добавляем адрес получателя
msg["Subject"] = Header('Тема сообщения', 'utf-8')        # Пишем тему сообщения
msg["Date"] = formatdate(localtime=True)                  # Дата сообщения
msg.attach(MIMEText("Текст сообщения", 'html', 'utf-8'))  # Добавляем форматированный текст сообщения
# Добавляем файл
filepath = "сертификат.pdf"                               # путь к файлу
part = MIMEBase('application', "octet-stream")            # Создаем объект для загрузки файла
part.set_payload(open(filepath,"rb").read())              # Подключаем файл
encoders.encode_base64(part)
part.add_header('Content-Disposition',
                f'attachment; filename="{os.path.basename(filepath)}"')
msg.attach(part)                                          # Добавляем файл в письмо
smtp = smtplib.SMTP(server_adr, 25)                       # Создаем объект для отправки сообщения
smtp.starttls()                                           # Открываем соединение
smtp.ehlo()
smtp.login(from_mail, from_passwd)                        # Логинимся в свой ящик
smtp.sendmail(from_mail, to_mail, msg.as_string())        # Отправляем сообщения
smtp.quit()                                               # Закрываем соединение
# Сохраняем сообщение в исходящие
imap = imaplib.IMAP4(server_adr, 143)                     # Подключаемся в почтовому серверу
imap.login(from_mail, from_passwd)                        # Логинимся в свой ящик
imap.select('Sent')                                       # Переходим в папку Исходящие
imap.append('Sent', None,                                 # Добавляем наше письмо в папку Исходящие
            imaplib.Time2Internaldate(time.time()),
            msg.as_bytes())

Ошибки

Без них никуда. В работе я столкнулась с ошибкой mailbox full: мой почтовый ящик переполнился, письма перестали отражаться в «Исходящих», а рассылка продолжала работать.

Как избежать ошибки? Следите за объемом папки «Исходящие», иначе она переполнится и новых отправленных писем вы не увидите.

Спасибо за прочтение, успеха вашим рассылкам!

Ну и напоследок напоминаю вам о нашем новом проекте vkserfing bot.