Работа с почтой — модули email / smtplib в Python

Пайтон содержит несколько действительно полезных модулей, которые можно использовать для создания электронной рассылки. Это модули email и smtplib. Вместо того чтобы рассматривать различные методы в этих двух модулях, мы уделим больше времени на то, как их, собственно, использовать. В частности, мы рассмотрим следующие этапы работы:

  • Основы работы с почтой;
  • Как выполнять рассылку нескольким адресатам за раз;
  • Как отправлять письма, используя строки TO, CC и BCC
  • Как создавать содержимое и тело письма при помощи модуля email.

Начнем!

Основы работы с почтой – как отправлять письма при помощи smtplib

Модуль smtplib весьма интуитивен в пользовании. Давайте проведем небольшой пример, который покажет, как при помощи данного модуля отправлять почту. Сохраните нижеизложенный код в файле на вашем жестком диске:

Мы выполнили импорт двух модулей, smtplib и string. Две трети этого кода используются для настройки почты. Большая часть переменных прекрасно объясняют сами себя, так что мы сфокусируемся на BODY. Мы воспользуемся модулем string, чтобы скомбинировать все переменные в единую строку, в которой каждая строчка заканчивается“/r”, а новая начинается с “/n”. После вывода BODY вы получите следующую картину:

После этого, нам нужно установить соединение нашего хоста с сервером, после чего мы вызываем метод sendmail в модуле smtplib и отправляем письмо. После этого мы отключаемся от сервера. Обратите внимание на то, что в этом коде нет пароля и логина. Если ваш сервер требует залогиниться, вам нужно будет добавить следующий код:

Эта часть должна быть добавлена сразу после создания объекта сервер. Как правило, вам, скорее всего, захочется добавить этот код в функцию и вызвать его с теми или иными параметрами. Или же вам может потребоваться использовать часть этой информации в файл config. Попробуем добавить этот код в функцию.

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

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

Зачем? К примеру, в работе вам может понадобиться несколько почтовых серверов для рассылки писем, или если почтовый сервер обновился, и название теперь новое. В таком случае нам нужно только изменить файл config, а не менять сам код. То же самое может понадобиться, если ваша компания была куплена, или слилась с другой. Давайте взглянем на файл config (сохраните его под названием email.ini):

Это очень простой файл config. В нем есть секция, под названием smtp, в которой у нас есть два объекта: server и from_addr. Мы воспользуемся configObj для чтения этого файла и вернемся к словарю Пайтон. Вот обновленная версия кода (сохраните её под именем smtp_config.py):

Мы добавили в этот код небольшую проверку. Нам нужно взять путь, в котором находится сам скрипт, который представляет base_path. Далее мы комбинируем данный путь с названием файла для получения окончательного пути к файлу config. После этого мы проверим, существует ли данный файл. Если да, мы создаем ConfigParser, если нет, мы выводим сообщение и выходим из скрипта. Мы можем добавить обработчик исключений в рамках вызова ConfigParser.read() чтобы проверить, что файл существует, но поврежден, или у нас закрыт к нему доступ, что и будет причиной исключения. Это будет небольшой проект, который вы можете выполнить самостоятельно. В любом случае, представим, что все хорошо и объект ConfigParser был успешно создан. Теперь мы можем извлечь хост и информацию from_addr при помощи обычного синтаксиса ConfigParser.

Сайт doctorsmm.com предлагает заказать ботов в Инстаграм по очень недорогим ценам. При этом Вы получаете не просто массовку на страницу, а аудиторию среднего качества с естественным для Вашего аккаунта приростом. А это значит, что Вы можете не беспокоиться за безопасность своего профиля! Торопитесь совершить заказ, пока на сайте действуют большие оптовые скидки!

Теперь мы готовы к тому, чтобы научиться отправлять несколько писем сразу.

Одновременная отправка нескольких писем

Давайте немного модифицируем предыдущий пример так, чтобы отправить несколько писем!

Обратите внимание на то, что в этом примере мы убрали параметр to_addr и добавили параметр emails, который является списком электронных почтовых адресов. Чтобы это заработало, нам нужно создать разделенную запятыми строку в части BODY под названием «To:» ,а также указать список адресов в методе sendmail. Таким образом, мы получаем рабочую, разделенную запятыми строку: ’, ‘.join(emails). Ничего сложного, не правда ли?

Рассылка писем при помощи строчек TO, CC и BCC

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

В этом коде мы указали три списка, каждый из которых содержит по одному электронному адресу. Мы создали поля CC и BCC таким же образом, как делали это ранее, с той разницей, что теперь нам нужно соединить три списка в один, чтобы мы могли указать полученный список методу sendmail(). На разных форумах пишут, что некоторые почтовые клиенты обрабатывают поле BCC нечётно, из-за чего получатель может видеть содержимое списка ВСС через заголовки писем. Однако мы точно знаем, что Gmail успешно удаляет ВСС данные из заголовка письма.

Теперь мы готовы перейти к модулю email!

Добавление вложения \ тела письма при помощи модуля email

Теперь мы возьмем все то, чему мы научились в предыдущих разделах и смешаем их вместе с модулем email, чтобы отправлять письма с прикрепленными файлами. Модуль email позволяет прикреплять вложения к письму очень просто. Вот код:

В данном коде мы переименовали нашу функцию и добавили новый аргумент file_to_attach. Нам также нужно добавить заголовок и создать объект MIMEMultipart. Заголовок может быть создан в любое время, перед тем как мы добавим вложение. Мы добавим элементы в объект MIMEMultipart (msg) также, как и ключевые слова в словарь. Обратите внимание на то, что нам нужно использовать метод formatdate модуля email, чтобы ввести данные правильного формата. Чтобы добавить тело письма, нам нужно создать экземпляр MIMEText. Как вы могли заметить, мы не добавляем информацию BCC, но вы можете легко это сделать, следуя условиям написанного выше кода. Далее мы добавляем вложение. Мы размещаем его в обработчике исключений и используем оператор with для извлечения файла и помещения его в наш объект MIMEBase. Наконец мы добавляем его в переменную msg и отправляем. Обратите внимание на то, что нам нужно конвертировать msg в методе sendmail в строку.

Подведем итоги

Теперь вы знаете, как отправлять почту при помощи Python. Для тех из вас, кто любит мини проекты, вы можете вернуться назад и добавить обработку дополнительную ошибку в кодовой части server.sendmail, если что-то не так пойдет во время процесса работы, типа ошибки SMTPAuthenticationError или SMTPConnectError. Мы можем также увеличить обработку ошибок во время прикрепления файла к телу письма, чтобы уловить другие ошибки. Наконец, мы можем взять списки различных писем, чтобы создать один нормальный, в котором отсутствуют дубликаты адресов. Это очень важно, если мы читаем список электронных адресов из файла. Также обратите внимание на то, что адрес from – не настоящий. Мы можем подделывать письма при помощи Пайтона и других языков программирование, однако это крайне неэтично, а в некоторых странах еще и нелегально. Имейте ввиду! Используйте свои знания правильно и пользуйтесь Пайтоном для удовольствия и с пользой.