Как сделать почтовый клиент на python

Добавил пользователь Morpheus
Обновлено: 05.10.2024

В Стандартной библиотеке Python есть несколько отличных модулей, которые можно использовать для создания и отправки электронных писем. Это модули email и smtplib . В этом материале не будут рассматриваться API этих двух модулей (объекты и их методы), здесь будут представлены реальные приемы использования этих модулей.

В частности, материал охватывает следующее:

Здесь импортируется только модуль smtplib . Две трети этого кода используются для настройки электронной почты. Большинство переменных не требуют пояснений, поэтому рассмотрим только одну переменную body .

Для создания этой переменной используется метод str.join() , который объединяет все предыдущие переменные в одну строку, где каждая строка заканчивается символом возврата каретки ('/r') плюс новая строка ('/n'). В итоге, переменная body , будет выглядеть как-то так:

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

Обычно, представленный код выше оборачивают в функцию и вызывают ее с некоторыми из этих параметров.

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

Получился очень простой файл конфигурации, в котором есть только один раздел с пометкой [smtp] . Чтобы прочитать файл конфигурации и превратить его в словарь Python, будем использовать модуль ConfigParser . Вот обновленная версия кода.

В дальнейшем, следует еще добавить обработчик исключений вокруг вызова ConfigParser.read() , так как файл может существовать, но быть поврежденным, или может не быть разрешения на его открытие, что вызовет исключение.

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

Для отправки письма нескольким адресатам одновременно необходимо вместо одного email-адреса, записанного в качестве строки, предоставить список адресов электронной почты. Чтобы это работало, нужно создать строку, разделенную запятыми, в части f"To: " , при создании переменной body , а также передать список адресов электронной почты методу smtp.sendmail() .

Использование строк TO , CC и BCC при отправке email.

В этом коде передадим три списка, в каждом из которых по одному адресу электронной почты. Создадим поля CC и BCC точно так же, как и раньше, а также необходимо объединить три списка адресов в один, чтобы передать его методу smtp.sendmail() .

Добавление вложения/файла с помощью модуля email .

Модуль email делает добавление вложений чрезвычайно простым.

В этом примере, в функцию отправки электронной почты добавим новый аргумент file_to_attach , а также создадим и добавим заголовок Content-Disposition и объект MIMEMultipart . Заголовок можно создать и добавить в любое время, но, до добавления вложения.

Письмо формируется в объекте MIMEMultipart() путем добавления необходимых полей, как ключей словаря. Если необходимо указать дату формирования письма, нужно использовать функцию formatdate модуля email , чтобы вставить правильно отформатированную дату.

Заключение.

Теперь вы знаете, как отправлять электронные письма с помощью Python. Для тех, кто любит мини-проекты, нужно вернуться и добавить более подробную обработку ошибок в часть кода smtp.sendmail() на случай, если во время процесса произойдет что-то странное. Одним из примеров может быть добавление исключений SMTPAuthenticationError или SMTPConnectError и т. д.

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

Mailpile представляет собой open source почтовый клиент, направленный на предоставление быстрого и очень дружественного с пользователями опыта взаимодействия.

Он был разработан на Python, и может работать с любым email-ящиком при помощи популярных протоколов (SMTP, IMAP, POP3).

Здесь также присутствует продуманный поиск, который позволяет находить нужные письма.

Mailpile: open source почтовый веб-клиент на Python

Сигнатуры и шифрование OpenPGP – это часть ядра Mailpile, что позволяет вам обезопасить себя и свои чувствительные данные.

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

Обнаружили ошибку или мёртвую ссылку?
Выделите проблемный фрагмент мышкой и нажмите CTRL+ENTER.
В появившемся окне опишите проблему и отправьте уведомление Администрации ресурса.

Вам понравился материал? Поблагодарить легко!
Будем весьма признательны, если поделитесь этой статьей в социальных сетях:

Pin It

Reportr: open source консоль управления для отслеживания событий

RainLoop: бесплатный почтовый веб-клиент на PHP с красивым UI

Monsta FTP: open source веб-приложение для работы с FTP

Converse.js: open source клиент для чата в стиле Facebook

phpFreeChat: open source скрипт чата на PHP

ICEcoder: Open Source веб-IDE на PHP

iio Engine: Open Source-фреймворк для разработки HTML5-приложений

Pinry: open source веб-приложение для сайтов вроде Pinterest

SprintApp: open-source приложение на Ruby on Rails для управления проектами



Копирование материалов сайта разрешено только с указанием активной индексируемой гиперссылки на наш сайт!

Мы сами вдохновляемся материалами, которые предлагаем вам на обозрение, будь то интересные руководства или полезные и впечатляющие подборки (дизайнов, шаблонов, сниппетов и т.д.), и мы всегда сохраняем ссылки на источники, и сообщаем авторов изображений, использованных в подборках или руководствах. Зачастую, ссылка на источник не ведёт напрямую к автору шедевра, но мы ведь не волшебники, чтобы угадывать, кто является автором.

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

Существует довольно много способов отправки электронной почты с помощью Python, будь то через стороннюю библиотеку , такую как boston и SES, или через протокол электронной почты, такой как SMTP. В то время как тема использования Python для отправки электронных писем может показаться, что это было сделано до смерти, существует так много различных способов сделать это и так много проблем, которые могут возникнуть. Я подумал, что было бы полезно написать учебник о том, как отправлять электронные письма с Gmail в качестве поставщика с помощью Python.

Протокол SMTP

Это не может быть сюрпризом, но, конечно, Python уже имеет библиотеку, которая позволяет вам подключаться к серверу SMTP , как тот, который использует Gmail. Эта библиотека называется, как и следовало ожидать, smtplib и поставляется в комплекте с Python.

Открытие соединения

Как уже упоминалось, Python удобно поставляется с smtplib , который обрабатывает все различные части протокола, такие как подключение, аутентификация, проверка подлинности и, конечно же, отправка электронных писем.

Используя эту библиотеку, вы можете создать соединение с почтовым сервером несколькими различными способами. В этом разделе мы сосредоточимся на создании простого, небезопасного соединения (которое должно редко, если вообще когда-либо, использоваться). Это соединение не зашифровано и по умолчанию используется порт 25. Однако протокол отправки почты на самом деле использует 587, что мы и будем использовать.

Эти соединения очень просто создать с помощью smtplib . Незашифрованная версия может быть создана с помощью:

И это все. На самом деле это не намного больше, чем передача адреса сервера, порта и вызов .hello() , который идентифицирует вас на SMTP-сервере. Используя этот объект server , теперь вы можете отправлять электронную почту по небезопасному соединению.

Примечание: Возможно, вы еще не готовы отправлять электронные письма. Gmail накладывает некоторые ограничения на SMTP – соединения, подобные этому. См. Раздел “Аутентификация с помощью Gmail” ниже для получения дополнительной информации.

Использование защищенного соединения

Когда SMTP-соединение защищено через TLS/SSL, оно выполняется через порт 465 и обычно называется SMTPS. Излишне говорить, что вы должны всегда использовать защищенное соединение .

Существует несколько различных способов защиты SMTP-соединений в библиотеке smtplib . Первый способ-сначала создать небезопасное соединение, а затем перейти на TLS. Это делается с помощью метода .starttls () .

Обратите внимание, что хотя это очень похоже на предыдущее небезопасное соединение, которое мы создали, все, что отличается, – это то, что мы используем метод .starttls() для обновления соединения до безопасного.

Другой вариант-создать SSL-соединение с самого начала. В этом случае вместо этого вы захотите использовать метод .SMTP_SSL() :

Среди других незначительных отличий мы сразу же используем порт SMTPS (465), хотя вы можете просто оставить параметр port вне этого значения, и smtplib все равно будет иметь значение по умолчанию 465.

Теперь, когда у нас есть связь, давайте создадим электронную почту.

Создание электронной почты

Электронные письма по своей сути-это просто строки текста, соединенные символами новой строки. Большинство писем, по крайней мере, будут иметь поля “От”, “До”, “Тема” и “Тело”. Вот простой пример:

Как видите, каждая строка содержит новое поле со своими данными. Ни двоичного протокола, ни XML, ни JSON, только строки, разделенные строками.

Простой способ параметризации этих полей – использовать форматирование строк в Python:

Теперь все , что вам нужно сделать, это передать строку email_text в smtplib , которую мы покажем в следующем разделе, и вы можете идти.

Аутентификация с помощью Gmail

Есть несколько шагов, которые вам нужно сделать, прежде чем вы сможете отправлять электронные письма через Gmail с помощью SMTP, и это связано с аутентификацией. Если вы используете Gmail в качестве провайдера, вам нужно будет сказать Google, чтобы он разрешил вам подключаться через SMTP, который считается “менее безопасным” методом.

Вы действительно не можете винить Google за то, что он настроил его таким образом, так как ваше приложение (или какое-то другое стороннее приложение) должно будет иметь ваш пароль для жалобного текста, чтобы это работало, что определенно не идеально. Это не похоже на протокол OAuth, где выдается отзываемый токен, поэтому они должны найти другой способ гарантировать, что никакие несанкционированные стороны не получат доступа к вашим данным.

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

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

Разрешение менее защищенным приложениям получать доступ к вашей учетной записи

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

Войдите в систему с помощью паролей приложений

И наконец, если вы все еще получаете SMTPAuthenticationError с кодом ошибки 534, то вам нужно будет сделать еще один шаг, чтобы это сработало.

Display Unlock Captcha

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

Что касается фактического кода Python, то все, что вам нужно сделать, это вызвать метод login :

Отправка электронной почты

Теперь, когда вы настроили SMTP-соединение и авторизовали свое приложение с помощью Google, вы, наконец, можете использовать Python для отправки электронной почты с помощью Gmail.

Используя строку электронной почты, которую мы построили выше, и подключенный/аутентифицированный сервер объект, вам нужно вызвать метод .sendmail () . Вот полный код, включая методы закрытия соединения:

Вывод

Помимо специфичных для Gmail шагов авторизации (включая менее безопасные приложения и т. Д.), этот код должен работать практически для любого другого поставщика электронной почты, поддерживающего SMTP-доступ, При условии, что у вас есть правильный адрес сервера и порт. Если вы обнаружите, что другие провайдеры вводят специальные ограничения на доступ SMTP, как это делает Google, сообщите нам об этом! Мы хотели бы включить сюда как можно больше информации.

Вы программно отправляете электронные письма с помощью SMTP? Для каких приложений вы его используете? Дайте нам знать в комментариях!

Ресурсы

Edit : Спасибо crop (в комментариях) за то, что вы указали, что Gmail накладывает ряд ограничений на людей, отправляющих электронную почту с помощью SMTP. Бесплатные аккаунты ограничены 500 электронными письмами в день и ограничиваются примерно 20 электронными письмами в секунду.

Если вы считаете, что превысите эти ограничения, то можете либо настроить свой собственный SMTP-сервер, либо воспользоваться такими сервисами, как AWS SES или Sendgrid.


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

Основы электронной почты

Данный сервер используется для отправки электронной почты, независимо от используемого почтового клиента, такого как Outlook, Thunderbird или Python программы. Когда создаётся учётная запись в любой почтовой хостинговой компании, предоставляется учётные данные SMTP для отправки электронной почты с помощью своих серверов.

SMTP сервер не всегда является внешним сервером. В некоторых случаях отправка электронной почты производится с того же компьютера, на котором запущен Python скрипт. В данном случае используется localhost в качестве SMTP сервера. Чтобы узнать параметры конфигурации, ознакомьтесь с документацией поставщика услуг электронной почты. В данной статье будет использоваться сервис Gmail. Для начала нужно собрать параметры электронной почты. Их можно затребовать от пользователя из входного потока, либо жёстко закодированных в коде.

Для отправки электронки требуются следующие реквизиты:

Обычно для подключение по SMTP используется 25 TCP порт, но также может быть 2525 и 587. Можете использовать любой адрес электронной почты отправителя, но некоторые принимающие серверы, например Gmail, обнаруживают поддельные адреса отправителя и могут поместить электронную почту в папку с спамом.

Отправка электронной почты с помощью модуля smtplib

Первый шагом будет импорт встроенной в Python библиотеки smtplib. Данная библиотека выполняет большую часть кода в своих внутренних методах и свойствах, поэтому не потребуется писать много кода для отправки электронной почты.

Введите следующий код в начале файла:

Перед рассылкой писем нужно настроить параметры электронной почты, например, определим их в виде переменных:

Обратите внимание, что переменная text содержит только одно предложение. Если нужен многострочный текст, то можно использовать символ \n для добавления новых строк текста:

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

Поскольку конфиденциальность является важным условием, воспользуемся классом SMTP_SSL, чтобы обеспечить защиту взаимодействия программы Python и SMTP сервером.

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

Во-первых, метод SMTP_SSL устанавливает параметры подключения к серверу с помощью SSL. Затем метод login() проверяет имя пользователя и пароль. Если они будут ошибочны, то будет вызвано исключение:

Кроме того, если воспользоваться неправильным именем пользователя и паролем в сервисе Gmail, будет отправлено уведомление о неудачной попытке входа. Если используется Gmail, для практики работы с электронной почты с Python, старайтесь избегать слишком частых неправильных попыток входа в систему, иначе Google заблокирует учетную запись в целях безопасности. Лучше использовать тестовую учётную запись для экспериментов.

Если возникает проблема с именем пользователя и паролем или сбой вызова login(), может возникнуть исключение SMTPSenderRefused:

Примечание. Для разрешения отправки Гуглом отправлять электронные письма перейдем на сайт настройки безопасности приложений и активируем переключатель "Небезопасные приложения разрешены".


Модуль определяет класс POP3 , который инкапсулирует соединение с сервером POP3 и реализует протокол, определенный в RFC 1939. Класс POP3 поддерживает как минимальные, так и необязательные наборы команд RFC 1939. Класс POP3 также поддерживает команду STLS , введенную в RFC 2595, чтобы разрешить шифрованную связь по уже установленному соединению.

Кроме того, модуль предоставляет класс POP3_SSL , который оказывает поддержку для соединения с серверами POP3, которые используют SSL в качестве основного слоя протокола.

Обратите внимание, что POP3, хотя и пользуется широкой поддержкой, устаревает. Качество внедрения серверов POP3 сильно различается, и многие из них являются довольно плохими. Если почтовый сервер поддерживает IMAP, лучше использовать класс imaplib.IMAP4 , так как серверы IMAP, как правило, лучше реализованы.

Модуль poplib предоставляет два класса:

class poplib. POP3 ( host, port=POP3_PORT [ , timeout ] ) ¶

Класс фактически реализует протокол POP3. Соединение создается при инициализации сущность. Если параметр port опущен, стандартный порт POP3 (110) имеет значение используемый. Необязательный параметр timeout указывает тайм-аут в секундах для попытки подключения (если не указан, то глобальным параметром тайм-аута по умолчанию будет используемый).

Поднимает событие аудита poplib.connect с аргументами self , host , port .

Все команды поднимают событие аудита poplib.putline с аргументами self и line , где line - это байты, отправляемые удаленному узлу.

class poplib. POP3_SSL ( host, port=POP3_SSL_PORT, keyfile=None, certfile=None, timeout=None, context=None ) ¶

Подкласс POP3 , который подключается к серверу через SSL- шифрованный сокет. Если port не указан, 995, используется стандартный порт POP3-over-SSL. timeout работает как в конструкторе POP3 . context является необязательным объектом ssl.SSLContext , который позволяет объединить опции конфигурации SSL, сертификаты и закрытые ключи в единую (потенциально долгоживущую) структуру. Пожалуйста, прочитайте Соображения безопасности для лучших практик.

keyfile и certfile являются устаревшей альтернативой context - они могут указывать на файлы закрытого ключа и цепочки сертификатов в формате PEM, соответственно, для SSL-соединения.

Поднимает событие аудита poplib.connect с аргументами self , host , port .

Все команды поднимают событие аудита poplib.putline с аргументами self и line , где line - это байты, отправляемые удаленному узлу.

Изменено в версии 3.2: Добавлен context параметр.

Не рекомендуется, начиная с версии 3.6: keyfile и certfile обесцениваются в пользу context. Пожалуйста, Использовать ssl.SSLContext.load_cert_chain() или позвольте ssl.create_default_context() выбрать сертификаты CA системы, которым доверяют, для вас.

Одно исключение определяется как атрибут модуля poplib :

exception poplib. error_proto ¶

Исключение, возникшее при любых ошибках из этого модуля (ошибки из модуля socket не обнаружены). Причина исключения передается конструктору как строка.

Модуль imaplib стандартный модуль Python IMAP.

Часто задаваемые вопросы о Fetchmail Часто задаваемые вопросы о клиенте fetchmail POP/IMAP собирают информацию о вариантах сервера POP3 и несоответствии RFC, которые могут быть полезны при необходимости создания приложения на основе протокола POP.

POP3 объекты¶

Все команды POP3 представлены одноименными методами в нижнем регистре; наиболее возвращает текст ответа, отправленный сервером.

Метод POP3 сущность имеет следующие методы:

POP3. set_debuglevel ( level ) ¶

Установить уровень отладки сущности. Это управляет количеством напечатанных выходных данных отладки. Значение по умолчанию, 0 , не выводит отладку. значение 1 производит умеренный объем отладки продукции, обычно одна линия за запрос. значение 2 или выше производит максимальный объем отладки продукции, логирование каждая линия, посланная и полученная на связи контроля.

Возвращает приветственную строку посланую сервером POP3.

Запрос возможностей сервера, указанных в разделе RFC 2449. Возвращает словарь в виде .

POP3. pass_ ( password ) ¶

Использовать более безопасную аутентификацию APOP для входа на сервер POP3.

Использовать идентификацию RPOP (подобный r-командам UNIX), чтобы зарегистрироваться в сервер POP3.

Получение состояния почтового ящика. В результате получается кортеж из 2 целых чисел: (message count, mailbox size) .

Удалить все метки удаления для почтового ящика.

Ничего не делает. Может быть использовано для поддержания соединения (keep-alive).

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

POP3. uidl ( which=None ) ¶

Попробовать переключиться в режим UTF-8. Возвращает ответ сервера, если он успешен, вызывает error_proto если нет. Определено в RFC 6856.

Запустить сеанс TLS для активного соединения, как указано в разделе RFC 2595. Это разрешено только перед проверкой подлинности пользователя

Параметр context - это объект ssl.SSLContext , который позволяет объединить опции конфигурации SSL, сертификаты и закрытые ключи в единую (потенциально долгоживущую) структуру. Пожалуйста, прочитайте Соображения безопасности для лучших практик.

У сущности POP3_SSL нет дополнительных методов. Интерфейс этого подкласса идентичен своему родителю.

Пример POP3¶

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

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