smtplib.md
1> **Источник:** https://python-all.ru/3.0/library/smtplib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `smtplib` – SMTP-клиент протокола89Модуль `smtplib` определяет объект сессии клиента SMTP, который можно использовать для отправки почты на любую машину в Интернете с демоном-слушателем SMTP или ESMTP. Подробности работы SMTP и ESMTP см. в [**RFC 821**](https://python-all.ru/3.0/library/smtplib.html) (Simple Mail Transfer Protocol – протокол простой передачи почты) и [**RFC 1869**](https://python-all.ru/3.0/library/smtplib.html) (SMTP Service Extensions).1011#### `[smtplib.SMTP]class smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])`1213Экземпляр [`SMTP`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTP) инкапсулирует SMTP-соединение. Он содержит методы, поддерживающие полный набор операций SMTP и ESMTP. Если указаны необязательные параметры host и port, то при инициализации вызывается метод SMTP [`connect()`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTP.connect) с этими параметрами. Исключение [`SMTPConnectError`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTPConnectError) возникает, если указанный хост не отвечает должным образом. Необязательный параметр *timeout* задаёт таймаут в секундах для блокирующих операций, таких как попытка подключения (если он не указан, будет использоваться глобальная настройка таймаута по умолчанию).1415Для обычного использования достаточно методов инициализации/соединения, [`sendmail()`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTP.sendmail) и [`quit()`](https://python-all.ru/3.0/library/constants.html#quit). Пример приведен ниже.1617#### `[smtplib.SMTP_SSL]class smtplib.SMTP_SSL([host[, port[, local_hostname[, keyfile[, certfile[, timeout]]]]]])`1819Экземпляр2021[`SMTP_SSL`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTP_SSL)2223ведет себя точно так же, как экземпляры2425[`SMTP`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTP)2627.2829[`SMTP_SSL`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTP_SSL)3031следует использовать в ситуациях, когда SSL требуется с самого начала соединения и использование3233`starttls()`3435не подходит. Если3637*host*3839не указан, используется локальный хост. Если4041*port*4243опущен, используется стандартный порт SMTP-over-SSL (465).4445*keyfile*4647и4849*certfile*5051также необязательны и могут содержать PEM-форматированный закрытый ключ и файл цепочки сертификатов для SSL-соединения. Необязательный параметр5253*timeout*5455задает таймаут в секундах для блокирующих операций, таких как попытка соединения (если не указан, будет использован глобальный таймаут по умолчанию).5657#### `[smtplib.LMTP]class smtplib.LMTP([host[, port[, local_hostname]]])`5859Протокол LMTP, очень похожий на ESMTP, во многом основан на стандартном клиенте SMTP. Для LMTP обычно используются Unix-сокеты, поэтому наш `connect()` метод должен поддерживать как их, так и обычный сервер вида host:port. Чтобы указать Unix-сокет, нужно использовать абсолютный путь для параметра *host*, начинающийся с '/'.6061Поддерживается аутентификация с использованием стандартного механизма SMTP. При использовании Unix-сокета LMTP обычно не поддерживает и не требует аутентификации, но результат может отличаться.6263Также определен неплохой набор исключений:6465#### `[smtplib.SMTPException]exception smtplib.SMTPException`6667Базовый класс исключений для всех исключений, порождаемых этим модулем.6869#### `[smtplib.SMTPServerDisconnected]exception smtplib.SMTPServerDisconnected`7071Это исключение возбуждается, когда сервер неожиданно разрывает соединение или когда предпринимается попытка использовать экземпляр7273[`SMTP`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTP)7475до подключения к серверу.7677#### `[smtplib.SMTPResponseException]exception smtplib.SMTPResponseException`7879Базовый класс для всех исключений, включающих код ошибки SMTP. Эти исключения генерируются в некоторых случаях, когда сервер SMTP возвращает код ошибки. Код ошибки хранится в атрибуте8081`smtp_code`8283объекта исключения, а атрибут8485`smtp_error`8687содержит сообщение об ошибке.8889#### `[smtplib.SMTPSenderRefused]exception smtplib.SMTPSenderRefused`9091Адрес отправителя отклонён. В дополнение к атрибутам, устанавливаемым для всех исключений9293[`SMTPResponseException`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTPResponseException)9495, в этом исключении атрибут 'sender' принимает значение строки, которую сервер SMTP отклонил.9697#### `[smtplib.SMTPRecipientsRefused]exception smtplib.SMTPRecipientsRefused`9899Все адреса получателей отклонены. Ошибки для каждого получателя доступны через атрибут100101`recipients`102103, который представляет собой словарь того же типа, что возвращает104105[`SMTP.sendmail()`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTP.sendmail)106107.108109#### `[smtplib.SMTPDataError]exception smtplib.SMTPDataError`110111Сервер SMTP отказался принимать данные сообщения.112113#### `[smtplib.SMTPConnectError]exception smtplib.SMTPConnectError`114115Произошла ошибка при установке соединения с сервером.116117#### `[smtplib.SMTPHeloError]exception smtplib.SMTPHeloError`118119Сервер отклонил наше сообщение120121`HELO`122123.124125#### `[smtplib.SMTPAuthenticationError]exception smtplib.SMTPAuthenticationError`126127Произошла ошибка аутентификации SMTP. Скорее всего, сервер не принял предоставленную комбинацию имени пользователя и пароля.128129> **См. также**130>131> **[**RFC 821**](https://python-all.ru/3.0/library/smtplib.html) – Простой протокол передачи почты**132>133> Определение протокола SMTP. Этот документ описывает модель, порядок работы и детали протокола SMTP.134>135> **[**RFC 1869**](https://python-all.ru/3.0/library/smtplib.html) – Расширения службы SMTP**136>137> Определение расширений ESMTP для SMTP. Описывается инфраструктура для расширения SMTP новыми командами, динамическое обнаружение команд, предоставляемых сервером, и определяются несколько дополнительных команд.138139## Объекты SMTP140141Экземпляр [`SMTP`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTP) имеет следующие методы:142143#### `[smtplib.SMTP.set_debuglevel]SMTP.set_debuglevel(level)`144145Устанавливает уровень отладочного вывода. Значение146147*level*148149, равное истине, приводит к выводу отладочных сообщений для соединения и для всех сообщений, отправленных на сервер и полученных от него.150151#### `[smtplib.SMTP.connect]SMTP.connect([host[, port]])`152153Подключается к хосту на указанном порту. По умолчанию выполняется подключение к локальному хосту на стандартном порту SMTP (25). Если имя хоста заканчивается двоеточием (154155`':'`156157), за которым следует число, этот суффикс отбрасывается, а число интерпретируется как номер порта для использования. Этот метод автоматически вызывается конструктором, если хост указан при создании экземпляра.158159#### `[smtplib.SMTP.docmd]SMTP.docmd(cmd[, argstring])`160161Отправляет команду *cmd* серверу. Необязательный аргумент *argstring* просто добавляется к команде через пробел.162163Возвращает кортеж из двух элементов: числового кода ответа и собственно строки ответа (многострочные ответы объединяются в одну длинную строку).164165При обычной работе нет необходимости явно вызывать этот метод. Он используется для реализации других методов и может быть полезен при тестировании частных расширений.166167Если соединение с сервером теряется во время ожидания ответа, будет возбуждено исключение [`SMTPServerDisconnected`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTPServerDisconnected).168169#### `[smtplib.SMTP.helo]SMTP.helo([hostname])`170171Идентификация на SMTP-сервере выполняется с помощью `HELO`. Аргумент hostname по умолчанию принимает полностью определённое доменное имя локального хоста. Сообщение, возвращаемое сервером, сохраняется в атрибуте `helo_resp` объекта.172173В обычной работе явно вызывать этот метод не требуется. Он будет вызван неявно методом [`sendmail()`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTP.sendmail) при необходимости.174175#### `[smtplib.SMTP.ehlo]SMTP.ehlo([hostname])`176177Идентификация на ESMTP-сервере выполняется с помощью `EHLO`. Аргумент hostname по умолчанию принимает полностью определённое доменное имя локального хоста. Проверить ответ на наличие опций ESMTP и сохранить их для использования методом [`has_extn()`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTP.has_extn). Также устанавливаются несколько информационных атрибутов: сообщение, возвращаемое сервером, сохраняется в атрибуте `ehlo_resp`; атрибут `does_esmtp` устанавливается в true или false в зависимости от того, поддерживает ли сервер ESMTP, а `esmtp_features` будет словарём, содержащим имена расширений SMTP-сервиса, которые поддерживает этот сервер, и их параметры (если есть).178179Если нет необходимости использовать [`has_extn()`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTP.has_extn) перед отправкой почты, вызывать этот метод явно не требуется. Он будет вызван неявно методом [`sendmail()`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTP.sendmail) при необходимости.180181#### `[smtplib.SMTP.ehlo_or_helo_if_needed]SMTP.ehlo_or_helo_if_needed()`182183Этот метод вызывает [`ehlo()`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTP.ehlo) и/или [`helo()`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTP.helo), если за эту сессию ещё не было предыдущей команды `EHLO` или `HELO`. Он сначала пытается использовать ESMTP `EHLO`.184185**[`SMTPHeloError`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTPHeloError)**186187Сервер не ответил должным образом на приветствие188189`HELO`190191.192193#### `[smtplib.SMTP.has_extn]SMTP.has_extn(name)`194195Возвращает196197[`True`](https://python-all.ru/3.0/library/constants.html#True)198199, если200201*name*202203присутствует в наборе расширений SMTP-сервиса, возвращённых сервером, иначе204205[`False`](https://python-all.ru/3.0/library/constants.html#False)206207. Регистр не учитывается.208209#### `[smtplib.SMTP.verify]SMTP.verify(address)`210211Check the validity of an address on this server using SMTP `VRFY`. Returns a tuple consisting of code 250 and a full [**RFC 822**](https://python-all.ru/3.0/library/smtplib.html) address (including human name) if the user address is valid. Otherwise returns an SMTP error code of 400 or greater and an error string.212213> **Примечание**214>215> Многие сайты отключают SMTP `VRFY`, чтобы помешать спамерам.216217#### `[smtplib.SMTP.login]SMTP.login(user, password)`218219Выполнить вход на SMTP-сервер, требующий аутентификации. Аргументами являются имя пользователя и пароль для аутентификации. Если за эту сессию ещё не было предыдущей команды `EHLO` или `HELO`, этот метод сначала пытается использовать ESMTP `EHLO`. Этот метод завершится нормально, если аутентификация прошла успешно, или может вызвать следующие исключения:220221**[`SMTPHeloError`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTPHeloError)**222223Сервер не ответил должным образом на приветствие224225`HELO`226227.228229**[`SMTPAuthenticationError`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTPAuthenticationError)**230231Сервер не принял комбинацию имя пользователя/пароль.232233**[`SMTPException`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTPException)**234235Не найден подходящий метод аутентификации.236237#### `[smtplib.SMTP.starttls]SMTP.starttls([keyfile[, certfile]])`238239Перевести SMTP-соединение в режим TLS (безопасность транспортного уровня). Все последующие SMTP-команды будут зашифрованы. После этого следует снова вызвать [`ehlo()`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTP.ehlo).240241Если указаны *keyfile* и *certfile*, они передаются функции `ssl()` модуля [`socket`](https://python-all.ru/3.0/library/socket.html#module-socket).242243Если за эту сессию ещё не было предыдущей команды `EHLO` или `HELO`, этот метод сначала пытается использовать ESMTP `EHLO`.244245**[`SMTPHeloError`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTPHeloError)**246247Сервер не ответил должным образом на приветствие248249`HELO`250251.252253**[`SMTPException`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTPException)**254255Сервер не поддерживает расширение STARTTLS.256257**[`RuntimeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.RuntimeError)**258259Поддержка SSL/TLS недоступна в текущем интерпретаторе Python.260261#### `[smtplib.SMTP.sendmail]SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])`262263Отправка почты. Обязательные аргументы: строка адреса отправителя в формате [**RFC 822**](https://python-all.ru/3.0/library/smtplib.html), список строк адресов получателей в формате [**RFC 822**](https://python-all.ru/3.0/library/smtplib.html) (отдельная строка будет рассматриваться как список с одним адресом) и строка сообщения. Вызывающий может передать список параметров ESMTP (например, `8bitmime`) для использования в командах `MAIL FROM` как *mail\_options*. Параметры ESMTP (например, команды `DSN`), которые следует использовать со всеми командами `RCPT`, можно передать как *rcpt\_options*. (Если нужно использовать разные параметры ESMTP для разных получателей, придётся использовать низкоуровневые методы, такие как `mail()`, `rcpt()` и `data()` для отправки сообщения.)264265> **Примечание**266>267> Параметры *from\_addr* и *to\_addrs* используются для построения конверта сообщения, используемого транспортными агентами. [`SMTP`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTP) никак не изменяет заголовки сообщения.268269Если в этом сеансе ещё не было предыдущей команды `EHLO` или `HELO`, этот метод сначала пробует ESMTP `EHLO`. Если сервер поддерживает ESMTP, ему передаётся размер сообщения и каждый из указанных параметров (если параметр входит в набор возможностей, объявляемых сервером). Если `EHLO` не удаётся, предпринимается попытка `HELO`, а параметры ESMTP отбрасываются.270271Этот метод завершается нормально, если почта принята хотя бы одним получателем. В противном случае он вызывает исключение. То есть, если этот метод не вызывает исключения, то кто-то должен получить вашу почту. Если этот метод не вызывает исключения, он возвращает словарь, по одной записи для каждого получателя, которому было отказано. Каждая запись содержит кортеж из кода ошибки SMTP и сопутствующего сообщения об ошибке, отправленного сервером.272273Этот метод может возбуждать следующие исключения:274275**[`SMTPRecipientsRefused`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTPRecipientsRefused)**276277Все получатели были отклонены. Почту не получил никто. Атрибут278279`recipients`280281объекта исключения представляет собой словарь с информацией об отклонённых получателях (аналогичный тому, который возвращается, когда был принят хотя бы один получатель).282283**[`SMTPHeloError`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTPHeloError)**284285Сервер не ответил должным образом на приветствие286287`HELO`288289.290291**[`SMTPSenderRefused`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTPSenderRefused)**292293Сервер не принял адрес294295*from\_addr*296297.298299**[`SMTPDataError`](https://python-all.ru/3.0/library/smtplib.html#smtplib.SMTPDataError)**300301Сервер ответил неожиданным кодом ошибки (не связанным с отказом отдельному получателю).302303Если не указано иное, соединение остаётся открытым даже после возбуждения исключения.304305#### `[smtplib.SMTP.quit]SMTP.quit()`306307Завершает сеанс SMTP и закрывает соединение. Возвращает результат команды SMTP308309`QUIT`310311.312313Также поддерживаются низкоуровневые методы, соответствующие стандартным командам SMTP/ESMTP: `HELP`, `RSET`, `NOOP`, `MAIL`, `RCPT` и `DATA`. Обычно их не нужно вызывать напрямую, поэтому они здесь не документируются. Подробности см. в коде модуля.314315## Пример SMTP316317Этот пример запрашивает у пользователя адреса, необходимые в конверте сообщения (адреса ‘To’\\nи ‘From’), а также само сообщение для отправки. Обратите внимание, что заголовки,\\nкоторые должны быть включены в сообщение, должны быть включены в сообщение при вводе; этот\\nпример не выполняет никакой обработки заголовков [**RFC 822**](https://python-all.ru/3.0/library/smtplib.html). В частности,\\nадреса ‘To’ и ‘From’ должны быть явно включены в заголовки сообщения.318319```python320import smtplib321322def prompt(prompt):323 return input(prompt).strip()324325fromaddr = prompt("From: ")326toaddrs = prompt("To: ").split()327print("Enter message, end with ^D (Unix) or ^Z (Windows):")328329# Добавьте заголовки From: и To: в начало!330msg = ("From: %s\r\nTo: %s\r\n\r\n"331 % (fromaddr, ", ".join(toaddrs)))332while True:333 try:334 line = input()335 except EOFError:336 break337 if not line:338 break339 msg = msg + line340341print("Message length is", len(msg))342343server = smtplib.SMTP('localhost')344server.set_debuglevel(1)345server.sendmail(fromaddr, toaddrs, msg)346server.quit()347```348