Как отправить excel файл по почте python

Обновлено: 04.07.2024

В данной инструкции мы рассмотрим фрагменты скриптов на Python 3 для работы с почтой. Для примера мы выполним:

  • отправку письма
  • чтение почты на сервере
  • копирование и удаление почты

В качестве операционной системы нами будет использоваться Linux, однако такой же набор команд будет работать на Windows.

Подготовка

Установка python

Ставим python в систему одной из команд.

а) На системах RPM (Red Hat, CentOS, Fedora):

yum install python3

б) На системах DEB (Debian, Ubuntu):

apt-get install python3

Создание скрипта

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

Создадим сам скрипт:

* в данном примере мы создали скрипт mail.py с двумя строчками — шебангом и определением кодировки.

И, на последок, даем разрешение на выполнение скрипта:

chmod +x /scripts/mail.py

Настройка почты

В случае использования собственного сервера, нам необходимо создать почтовую учетную запись или использовать имеющуюся.

Отправка почты

Чтение почты

Разобьем процесс на несколько шагов.

Подключение к почтовому ящику

Чтение электронной почты начинается с подключения к почтовому ящику на сервере. Для этого используем такой код:

Пробуем запустить наш скрипт:

. он ничего не должен вернуть. В противном случае, изучаем ошибку — как правило, это может быть ошибка доступа.

Поиск нужного письма

Найдем письмо, с которым будем работать — в данном примере, последнее:

Пробуем запустить скрипт — он тоже должен вернуть пустой ответ. Мы можем добавить в конец нашего скрипта такую строку:

. это позволит увидеть тело письма. После проверки удаляем строку.

Чтение заголовков

Если нам нужны заголовки письма, выполняем такой блок кода:

Описание
1 Импортируем модуль email для получения заголовков и тела писем
2 Получаем заголовки и тело письма и заносим результат в переменную email_message. Обратите внимание, что мы используем переменную raw_email_string, в которую на этапе выше занесли необработанное письмо.
4 Выводим на экран заголовок To (кому отправлено письмо)
5 Выводим на экран заголовок From (от кого отправлено письмо)
6 Выводим на экран заголовок Date (дата отправки письма)
7 Выводим на экран заголовок Subject (тема письма)
8 Выводим на экран заголовок Message-Id (идентификатор письма)

* в данном скрипте приведен пример нескольких заголовков. Весь массив с заголовками можно вывести строкой print(email_message).

Чтение тела письма

Получаем текст письма:

Описание
1 Импортируем модуль email для получения заголовков и тела писем
2 Получаем заголовки и тело письма и заносим результат в переменную email_message. Обратите внимание, что мы используем переменную raw_email_string, в которую на этапе выше занесли необработанное письмо.
4 - 7 Проверяем, является ли письмо многокомпонентным. Если да, то выводим по очереди на экран значения каждого компонента. Предварительно, перекодируем текст в UTF-8.
8 - 10 Если письмо не многокомпонентное, выводим его содержимое.

Копирование

Для копирования предусмотрен специальный метод copy:

Удаление

* в данном примере мы вызываем метод store сессии mail, устанавливаем флаг Deleted для письма с идентификатором mail_id.

Перемещение

Перемещение можно выполнить копированием с последующим удалением:

* в данном примере мы копируем письмо с mail_id в INBOX/Completed; если копирование выполнено успешно, то письмо помечается на удаление и удаляется окончательно.

Пример скрипта


Как аналитик данных, чаще всего я получаю запросы типа «Можете ли вы отправлять мне этот отчет еженедельно?» Или «Можете ли вы отправлять эти данные мне по электронной почте каждый месяц?». Отправка отчета проста, но будет раздражать, если вам придется делать одно и то же каждую неделю. Вот почему вы должны научиться использовать Python для отправки электронной почты / отчета и планировать сценарий на вашем сервере.

Сначала вы должны создать файл конфигурации для хранения всех запросов SQL. Рекомендуется разделять скрипт Python на SQL-запрос, особенно если ваш SQL-запрос длинный (более 20 строк). Таким образом, ваш главный скрипт не будет загроможден длинным SQL-запросом.

Пример файла конфигурации

[Доклад1]ваш субконфек. filename , dialect а также query являются атрибутами субконфигурации.

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

Напишите функцию для чтения атрибута субконфигурации

Эта функция самоопределения будет читать атрибуты файла субконфигурации, который вы передаете, и выводить файл CSV.

yourProjectID будет вашим идентификатором проекта BigQuery, а credential.json будет вашим файлом BigQuery Credential JSON. Вы можете удалить это, если вы хотите использовать веб-аутентификацию для входа в систему.

Теперь вам просто нужен цикл для извлечения всех файлов, которые вы определили в своем конфигурационном файле. config.sections() вернет вам список файла субконфигурации в вашем конфигурационном файле.

Определите содержание вашей электронной почты

Выше описано, как вы определяете свои атрибуты электронной почты, такие как От, До, CC и Тема. htmlEmail будет вашим телом электронной почты. Вы можете использовать обычный текст или html в качестве тела письма. Я предпочитаю использовать HTML, потому что я могу сделать больше форматирования, каксмелый,курсивныйи измените цвет шрифта.

То же самое, мы будем использовать цикл, чтобы прикрепить весь файл.

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

Теперь вы узнали, как отправлять электронную почту с вложениями с помощью Python. Оставьте мне комментарий, если я допустил ошибку или опечатку.

Вы можете просмотреть полные сценарии в моемGithub, Дайте мне хлопок, чтобы поддержать меня, если вы считаете, что эта статья полезна для вас. Ура!


В нашем блоге мы много пишем о создании email-рассылок и работе с электронной почтой. В современном мире люди получают множество писем, а у некоторых даже есть несколько почтовых ящиков. Все это усложняет процесс их администрирования, что вынуждает искать пути решения проблемы. Не так давно мы рассказывали о том, как инженер из США упорядочивал свои письма с помощью нейронной сети (1, 2), а сегодня речь пойдет об автоматизации отправки писем для разных почтовых ящиков.

Редактор издания Motherboard Майкл Берн (Michael Byrne) написал материал о том, как отправлять электронные письма для различных почтовых ящиков с помощью Python. Мы представляем вашему вниманию адаптированный перевод этой заметки.

Берн пишет, что у него есть целых пять электронных ящиков: один личный, два университетских и два рабочих. Есть ещё и шестой, который он иногда использует, когда нужно быстро где-то зарегистрироваться. Немалая часть жизни журналиста состоит из быстрого просмотра и сортировки электронных писем, их удаления, добавления в избранное, и даже чтения этих писем и ответа на них. Берн говорит, что даже не хочет задумываться о том, сколько на все это уходит времени каждый день.

Журналист признается, что однажды в шутку подумал, что ему надо нанять помощника для управления своей электронной почтой. Это, в свою очередь, привело к размышлениям о том, какие указания такому сотруднику надо было бы давать: «Если в письме есть то-то и то-то, сделай одно, или если вот это так, сделай кое-что другое». Это был бы определённый набор правил, применённый к письмам.

Но когда я вижу словосочетание «набор правил», я сразу думаю о написании компьютерных программ. Пролистывая свои письма, я понимаю, что было бы разумно воплотить моего помощника в компьютерном коде.

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

Для начала потребуется скачать Python (если он еще не установлен). Также потребуется любой простой текстовый редактор. Отлично подойдет Sublime Text — его можно скачать здесь. ST не бесплатный, но в тестовом режиме им можно пользоваться бесконечно, хоть иногда и будет появляться предложение о покупке. Но своих денег он стоит.

Python можно использовать в двух режимах. Первый – это командный интерпретатор, где пользователь вводит команды или сниппеты на Python в консоль, и они сразу же выполняются (например, print(«Hello, World!»)). Второй режим – это скрипты на Python. По сути, это просто набор команд на Python в одном или нескольких файлах, которые могут быть вызваны одновременно из консоли. Фактически, эти файлы – это программы: иногда маленькие и простые (как то, что мы рассмотрим дальше), они могут разрастаться до больших проектов.

Если вы только что скачали Python, вам нужно сделать ещё две вещи перед тем, как начать. Первое: прочтите краткое руководство про написание «Hello, World!» на Python. Второе: уделите пять минут прочтению руководства по использованию модулей в Python. Установка и импорт расширений Python производятся предельно просто.

0) Протоколы для получения почты: краткое руководство

Существуют три основных протокола для работы с электронной почтой. Самый старый из них называется POP (Post Office Protocol). Его суть в том, что программное обеспечение для работы с электронной почтой (не браузер) подключается к удалённому серверу, скачивает письма на компьютер пользователя, и они становятся доступны без подключения к интернету. Это было хорошей идеей в те времена, когда к интернету подключались нечасто, и было нормальным не иметь выхода в Сеть, но в настоящее время такого почти не бывает.

1) Подключение SMTP-модуля Python

Для начала нам нужен подходящий модуль Python. Smtplib поставляется вместе с Python, поэтому не нужно предпринимать дополнительных действий, достаточно просто ввести эту строку в консоль:


Для получения справки по модулю (и чтобы удостовериться, что он подключился), можно использовать функцию help:


Следует отметить, что эта функция работает с любым модулем.

2) Подключение к серверу электронной почты

Прежде всего, нужно создать объект smtplib, который можно рассматривать как некий портал, дающий доступ к подключению и различным инструментам работы с ним из модуля smtplib.

В данном случае функция, возвращающая необходимый объект, принимает два параметра или аргумента. Первый аргумент содержит доменное имя, то есть адрес электронной почты, начинающийся с «smtp», как показано ниже. Второй аргумент – это номер порта, к которому будет осуществляться подключение на сервере электронной почты. Он почти всегда принимает значение 587 в соответствии со стандартом шифрования TLS. Очень редко встречаются сервисы, использующие порт 465.

Итак, нужно написать следующее:


Получается, что переменная smtpObj является объектом типа SMTP. В этом можно убедиться, если ввести имя переменной в консоль и подтвердить ввод. На экране появятся адрес её ячейки памяти и тип (при условии, что вы ввели предыдущую команду правильно). Переменную smtpObj можно назвать, как угодно, лишь бы это было допустимое в Python имя переменной.

3) Шифрование


Вот что мы сделали: мы сообщили Gmail, что хотим, чтобы наше соединение шифровалось с помощью протокола TLS (Transport Layer Security), который на сегодняшний день является стандартом для интернет-коммуникаций. Сам по себе TLS не является криптографическим алгоритмом, он скорее сообщает, что необходимо использовать шифрование или соединение не должно быть установлено.

В ответ вы должны получить подтверждение:

5) Авторизация

Для того чтобы авторизоваться, нужно всего лишь написать


На данном этапе пароль от электронной почты, так сказать, улетает в неизвестность, что довольно опасно. Это не проблема на локальном компьютере, но если вы действительно автоматизируете работу с электронной почтой с помощью скрипта на Python, то нужно проявить осторожность и дважды подумать, прежде чем публиковать код скрипта где-либо или загружать файл с ним на сторонние площадки.

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


Немного поскроллив страницу можно увидеть нужный метод:


Интерпретатор даже выведет пример его использования:


Заметьте, что в примере выше отсутствует команда авторизации. Это связано с тем, что программа подключалась к компьютеру пользователя, а не к удалённому серверу электронной почты. Для нашего случая напишем следующее:


6) Завершение соединения

Для завершения соединения достаточно использовать такую команду:


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

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

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

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

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

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

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

def send_email ( host , subject , to_addr , from_addr , body_text ) : send_email ( host , subject , to_addr , from_addr , body_text )

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

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

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

Telegram Чат & Канал

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

Паблик VK

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

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

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

base_path = os.path . dirname ( os.path . abspath ( __file__ ) )

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

base_path = os.path . dirname ( os.path . abspath ( __file__ ) )

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

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

def send_email ( subject , body_text , to_emails , cc_emails , bcc_emails ) : base_path = os.path . dirname ( os.path . abspath ( __file__ ) ) send_email ( subject , body_text , emails , cc_emails , bcc_emails )

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

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

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

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

def send_email_with_attachment ( subject , body_text , to_emails , cc_emails , bcc_emails , file_to_attach ) : base_path = os.path . dirname ( os.path . abspath ( __file__ ) ) header = 'Content-Disposition' , 'attachment; filename="%s"' % file_to _ attach msg = "Error opening attachment file %s" % file_to_attach server . sendmail ( from_addr , emails , msg . as_string ( ) ) send_email_with_attachment ( subject , body_text , emails , cc_emails , bcc_emails , path )

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

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

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


Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.

Читайте также: