smtplib — Клиент протокола SMTP
Исходный код: Lib/smtplib.py
Модуль smtplib определяет объект сеанса SMTP-клиента, который можно использовать для отправки почты на любой интернет-машине с SMTP или ESMTP-демоном-слушателем. Для получения подробностей о работе SMTP и ESMTP см. RFC 821 (Простой протокол передачи почты) и RFC 1869 (Расширения службы SMTP).
Доступность: не Emscripten, не WASI.
Этот модуль не работает или недоступен на платформах WebAssembly wasm32-emscripten и wasm32-wasi. Дополнительную информацию см. в Платформах WebAssembly.
-
class smtplib.SMTP(host='', port=0, local_hostname=None, [timeout, ]source_address=None) -
Объект
SMTPинкапсулирует SMTP-соединение. Он имеет методы, поддерживающие весь набор операций SMTP и ESMTP. Если необязательные параметры host и port заданы, метод SMTPconnect()вызывается с этими параметрами во время инициализации. Если указано, local_hostname используется в качестве FQDN локального хоста в команде HELO/EHLO. В противном случае локальное имя хоста находится с помощьюsocket.getfqdn(). Если вызовconnect()возвращает что-либо, кроме кода успеха, генерируется исключениеSMTPConnectError. Необязательный параметр timeout задает таймаут в секундах для блокирующих операций, таких как попытка подключения (если не указан, используется глобальное значение таймаута по умолчанию). Если таймаут истекает, генерируетсяTimeoutError. Необязательный параметр source_address позволяет привязаться к конкретному адресу источника в машине с несколькими сетевыми интерфейсами и/или к конкретному TCP-порту источника. Он принимает кортеж из двух элементов(host, port), к которому сокет должен быть привязан как к своему адресу источника перед подключением. Если опущено (или если host или port являются''и/или0соответственно), используется поведение по умолчанию ОС.Для обычного использования вам потребуются только методы инициализации/подключения,
sendmail()иSMTP.quit(). Пример приведен ниже.Класс
SMTPподдерживает операторwith. При использовании таким образом команда SMTPQUITавтоматически выполняется при завершении оператораwith. Например:>>> from smtplib import SMTP >>> with SMTP("domain.org") as smtp: ... smtp.noop() ... (250, b'Ok') >>>Все команды будут вызывать событие аудита аудита
smtplib.SMTP.sendс аргументамиselfиdata, гдеdata— байты, которые будут отправлены удалённому хосту.Изменено в версии 3.3: Добавлена поддержка оператора
with.Изменено в версии 3.3: Добавлен аргумент source_address.
Добавлен в версии 3.5: Теперь поддерживается расширение SMTPUTF8 (RFC 6531).
Изменено в версии 3.9: Если параметр timeout установлен в ноль, будет выброшено
ValueErrorдля предотвращения создания неблокирующего сокета.
-
class smtplib.SMTP_SSL(host='', port=0, local_hostname=None, *, [timeout, ]context=None, source_address=None) -
Объект
SMTP_SSLведет себя точно так же, как объектыSMTP.SMTP_SSLследует использовать в ситуациях, когда SSL требуется с самого начала подключения, и использованиеstarttls()неприменимо. Если host не указан, используется локальный хост. Если port равен нулю, используется стандартный порт SMTP по SSL (465). Необязательные аргументы local_hostname, timeout и source_address имеют такое же значение, как и в классеSMTP. Необязательный параметр context может содержатьSSLContextи позволяет настраивать различные аспекты защищенного соединения. Для получения рекомендаций по лучшим практикам обратитесь к Рекомендациям по безопасности.Изменено в версии 3.3: Добавлен context.
Изменено в версии 3.3: Добавлен аргумент source_address.
Изменено в версии 3.4: Класс теперь поддерживает проверку имени хоста с помощью
ssl.SSLContext.check_hostnameи Server Name Indication (см.ssl.HAS_SNI).Изменено в версии 3.9: Если параметр timeout установлен в ноль, будет выброшено
ValueErrorдля предотвращения создания неблокирующего сокета.Изменено в версии 3.12: Устаревшие параметры keyfile и certfile были удалены.
-
class smtplib.LMTP(host='', port=LMTP_PORT, local_hostname=None, source_address=None[, timeout]) -
Протокол LMTP, очень похожий на ESMTP, в значительной степени основан на стандартном SMTP-клиенте. Для LMTP часто используются Unix-сокеты, поэтому наш метод
connect()должен поддерживать их, а также обычный хост:порт сервер. Необязательные аргументы local_hostname и source_address имеют такое же значение, как и в классеSMTP. Для указания Unix-сокета необходимо использовать абсолютный путь для host, начинающийся с ‘/’.Поддерживается аутентификация, использующая обычный механизм SMTP. При использовании Unix-сокеты LMTP, как правило, не поддерживают и не требуют аутентификации, но ваш опыт может отличаться.
Изменено в версии 3.9: Добавлен необязательный параметр timeout.
Также определен хороший набор исключений:
-
exception smtplib.SMTPException -
Подкласс
OSError, являющийся базовым классом исключений для всех других исключений, предоставляемых этим модулем.Изменено в версии 3.4: SMTPException стал подклассом
OSError
-
exception smtplib.SMTPServerDisconnected -
Это исключение генерируется при неожиданном отключении сервера или при попытке использовать экземпляр
SMTPдо подключения его к серверу.
-
exception smtplib.SMTPResponseException -
Базовый класс для всех исключений, содержащих код ошибки SMTP. Эти исключения генерируются в некоторых случаях, когда SMTP-сервер возвращает код ошибки. Код ошибки хранится в атрибуте
smtp_codeошибки, а атрибутsmtp_errorустанавливается в сообщение об ошибке.
-
exception smtplib.SMTPSenderRefused -
Адрес отправителя отклонен. В дополнение к атрибутам, установленным во всех исключениях
SMTPResponseException, это устанавливает ‘sender’ в строку, отклоненную SMTP-сервером.
-
exception smtplib.SMTPRecipientsRefused -
Все адреса получателей отклонены. Ошибки для каждого получателя доступны через атрибут
recipients, который представляет собой словарь точно такого же типа, как возвращаетSMTP.sendmail().
-
exception smtplib.SMTPDataError -
SMTP-сервер отказался принять данные сообщения.
-
exception smtplib.SMTPConnectError -
Произошла ошибка при установлении соединения с сервером.
-
exception smtplib.SMTPHeloError -
Сервер отклонил наше
HELOсообщение.
-
exception smtplib.SMTPNotSupportedError -
Сервер не поддерживает попытку выполнения команды или опции.
Добавлен в версии 3.5.
-
exception smtplib.SMTPAuthenticationError -
Произошла ошибка при аутентификации SMTP. Вероятнее всего, сервер не принял предоставленную комбинацию имени пользователя/пароля.
См. также
- RFC 821 - Простой протокол передачи почты
-
Определение протокола SMTP. В этом документе описываются модель, порядок работы и детали протокола SMTP.
- RFC 1869 - Расширения службы SMTP
-
Определение расширений ESMTP для SMTP. Здесь описывается механизм расширения SMTP новыми командами, поддержка динамического обнаружения команд, предоставляемых сервером, и определены несколько дополнительных команд.
Объекты SMTP
У экземпляра SMTP есть следующие методы:
-
SMTP.set_debuglevel(level) -
Установить уровень отладки вывода. Значение 1 или
Trueдля level приводит к сообщениям отладки для соединения и для всех сообщений, отправленных и полученных от сервера. Значение 2 для level приводит к тому, что эти сообщения будут иметь метки времени.Изменено в версии 3.5: Добавлен уровень отладки 2.
-
SMTP.docmd(cmd, args='') -
Отправить команду cmd на сервер. Дополнительный аргумент args просто добавляется к команде, разделенный пробелом.
Возвращает кортеж из 2 элементов: числовой код ответа и строку фактического ответа (многострочные ответы объединяются в одну длинную строку).
В нормальной работе явно вызывать этот метод не нужно. Он используется для реализации других методов и может быть полезен для тестирования частных расширений.
Если соединение с сервером разорвано во время ожидания ответа, будет поднято исключение
SMTPServerDisconnected.
-
SMTP.connect(host='localhost', port=0) -
Подключиться к хосту на указанном порту. По умолчанию подключается к локальному хосту на стандартном порте SMTP (25). Если имя хоста заканчивается двоеточием (
':') и числом, этот суффикс будет удален, а число интерпретируется как номер порта для использования. Этот метод автоматически вызывается конструктором, если хост указан во время создания экземпляра. Возвращает кортеж из 2 элементов: код ответа и сообщение, отправленное сервером в ответ на подключение.Вызывает событие аудита аудита
smtplib.connectс аргументамиself,host,port.
-
SMTP.helo(name='') -
Представиться серверу SMTP с использованием
HELO. Аргумент hostname по умолчанию — полное доменное имя локального хоста. Сообщение, возвращаемое сервером, сохраняется как атрибутhelo_respобъекта.В нормальной работе явно вызывать этот метод не нужно. Он будет неявно вызван методом
sendmail()при необходимости.
-
SMTP.ehlo(name='') -
Представиться серверу ESMTP с использованием
EHLO. Аргумент hostname по умолчанию — полное доменное имя локального хоста. Проверьте ответ на опции ESMTP и сохраните их для использования в методеhas_extn(). Также устанавливаются несколько информационных атрибутов: сообщение, возвращаемое сервером, сохраняется как атрибутehlo_resp,does_esmtpустанавливается вTrueилиFalseв зависимости от того, поддерживает ли сервер ESMTP, иesmtp_featuresбудет словарем, содержащим имена расширений службы SMTP, которые поддерживает данный сервер, и их параметры (если таковые имеются).Если вы не хотите использовать
has_extn()перед отправкой почты, явно вызывать этот метод не нужно. Он будет неявно вызван методомsendmail()при необходимости.
-
SMTP.ehlo_or_helo_if_needed() -
Этот метод вызывает
ehlo()и/илиhelo(), если в текущем сеансе не было предыдущей командыEHLOилиHELO. Сначала пытается использовать ESMTPEHLO.-
SMTPHeloError -
Сервер некорректно ответил на приветствие
HELO.
-
-
SMTP.has_extn(name) -
Возвращает
True, если name присутствует в наборе расширений службы SMTP, возвращенных сервером, иFalseв противном случае. Регистр игнорируется.
-
SMTP.verify(address) -
Проверить валидность адреса на этом сервере с помощью SMTP
VRFY. Возвращает кортеж, состоящий из кода 250 и полного адреса RFC 822 (включая имя пользователя), если адрес пользователя действителен. В противном случае возвращает код ошибки SMTP 400 или выше и строку с ошибкой.Примечание
Многие сайты отключают SMTP
VRFYдля предотвращения спама.
-
SMTP.login(user, password, *, initial_response_ok=True) -
Войти на сервер SMTP, требующий аутентификации. Аргументами являются имя пользователя и пароль для аутентификации. Если в текущем сеансе не было предыдущих команд
EHLOилиHELO, этот метод сначала пытается использовать ESMTPEHLO. Этот метод вернет стандартный результат, если аутентификация прошла успешно, или может вызвать следующие исключения:-
SMTPHeloError -
Сервер некорректно ответил на приветствие
HELO. -
SMTPAuthenticationError -
Сервер не принял комбинацию имени пользователя/пароля.
-
SMTPNotSupportedError -
Команда
AUTHне поддерживается сервером. -
SMTPException -
Не был найден подходящий метод аутентификации.
Каждый из методов аутентификации, поддерживаемых
smtplib, пытается использоваться по очереди, если они объявлены как поддерживаемые сервером. Список поддерживаемых методов аутентификации см. вauth(). Параметр initial_response_ok передается методуauth().Необязательный ключевой параметр initial_response_ok указывает, можно ли, для методов аутентификации, которые это поддерживают, отправить «начальный ответ», как указано в RFC 4954 вместе с командой
AUTH, вместо того, чтобы требовать вызов-ответ.Изменено в версии 3.5: Исключение
SMTPNotSupportedErrorможет быть поднято, и был добавлен параметр initial_response_ok. -
-
SMTP.auth(mechanism, authobject, *, initial_response_ok=True) -
Выполните команду
SMTPAUTHдля указанного механизма аутентификации и обработайте ответ на вызов с помощью authobject.mechanism указывает, какой механизм аутентификации использовать в качестве аргумента для команды
AUTH; допустимые значения указаны в элементеauthобъектаesmtp_features.authobject должен быть вызываемым объектом, принимающим необязательный единственный аргумент:
data = authobject(challenge=None)
Если необязательный ключевой аргумент initial_response_ok имеет значение true, то
authobject()будет вызван первым без аргументов. Он может вернуть ASCII-строку «начального ответа» RFC 4954, которая будет закодирована и отправлена с помощью командыAUTH, как показано ниже. Если сервер не поддерживает начальный ответ (например, если требуется вызов), он должен возвращатьNone, когда вызывается сchallenge=None. Если initial_response_ok имеет значение false, тоauthobject()не будет вызываться первым сNone.Если проверка начального ответа возвращает
None, или если initial_response_ok имеет значение false,authobject()будет вызван для обработки ответа сервера на вызов; аргумент challenge, который ему передается, будетbytes. Он должен вернуть ASCII-строку данных data, которая будет закодирована в base64 и отправлена серверу.Класс
SMTPпредоставляет реализацию для механизмовCRAM-MD5,PLAINиLOGIN; они называютсяSMTP.auth_cram_md5,SMTP.auth_plainиSMTP.auth_loginсоответственно. Все они требуют, чтобы свойстваuserиpasswordэкземпляраSMTPбыли установлены в соответствующие значения.Пользовательскому коду обычно не нужно вызывать
authнапрямую, но вместо этого можно вызвать методlogin(), который будет по очереди пытаться использовать каждый из перечисленных механизмов в указанном порядке.authпредоставляет возможность для реализации методов аутентификации, которые не (или еще не) поддерживаются напрямую модулемsmtplib.Добавлена в версии 3.5.
-
SMTP.starttls(*, context=None) -
Переводит соединение SMTP в режим TLS (Transport Layer Security). Все последующие команды SMTP будут зашифрованы. После этого вы должны снова вызвать
ehlo().Если указаны keyfile и certfile, они используются для создания объекта
ssl.SSLContext.Необязательный параметр context — это объект
ssl.SSLContext; это альтернатива использованию keyfile и certfile, и если он указан, то keyfile и certfile должны бытьNone.Если до этой команды в сессии не было предыдущей команды
EHLOилиHELO, метод сначала попробует ESMTPEHLO.Изменено в версии 3.12: Устаревшие параметры keyfile и certfile были удалены.
-
SMTPHeloError -
Сервер некорректно ответил на приветствие
HELO. -
SMTPNotSupportedError -
Сервер не поддерживает расширение STARTTLS.
-
RuntimeError -
Поддержка SSL/TLS недоступна для вашей интерпретатора Python.
Изменено в версии 3.3: Добавлен параметр context.
Изменено в версии 3.4: Метод теперь поддерживает проверку имени хоста с помощью
SSLContext.check_hostnameи Server Name Indicator (см.HAS_SNI).Изменено в версии 3.5: Ошибка, возникающая при отсутствии поддержки STARTTLS, теперь является подклассом
SMTPNotSupportedError, а не базовым классомSMTPException. -
-
SMTP.sendmail(from_addr, to_addrs, msg, mail_options=(), rcpt_options=()) -
Отправка почты. Требуемые аргументы: строка адреса «от» в формате RFC 822, список строк адресов «к» в формате RFC 822 (простая строка будет обработана как список с 1 адресом) и строка сообщения. Вызывающий метод может передать список ESMTP-опций (например,
8bitmime) для использования в командахMAIL FROMв виде mail_options. ESMTP-опции (например,DSNкоманды), которые должны использоваться со всеми командамиRCPT, могут быть переданы в виде rcpt_options. (Если вам нужно использовать разные ESMTP-опции для разных получателей, вам нужно использовать низкоуровневые методы, такие какmail(),rcpt()иdata()для отправки сообщения.)Примечание
Параметры from_addr и to_addrs используются для построения оболочки сообщения, используемой агентами передачи.
sendmailникак не изменяет заголовки сообщения.msg может быть строкой, содержащей символы в диапазоне ASCII, или байтовой строкой. Строка кодируется в байты с помощью кодека ascii, а одиночные символы
\rи\nпреобразуются в символы\r\n. Байтовая строка не изменяется.Если до этой команды в сессии не было предыдущей команды
EHLOилиHELO, метод сначала попробует ESMTPEHLO. Если сервер поддерживает ESMTP, размер сообщения и каждая из указанных опций будут переданы ему (если опция присутствует в наборе функций, которые сервер объявил). Если ESMTP неудачен, будет использоватьсяHELO, и ESMTP-опции будут подавлены.Этот метод вернет нормальное значение, если почта принята хотя бы для одного получателя. В противном случае он поднимет исключение. То есть, если этот метод не поднимает исключение, то кто-то получит ваше письмо. Если этот метод не поднимает исключение, он возвращает словарь, содержащий одну запись для каждого получателя, которому было отказано. Каждая запись содержит кортеж из кода ошибки SMTP и сопровождающего сообщения об ошибке, отправленного сервером.
Если
SMTPUTF8включен в mail_options и сервер его поддерживает, from_addr и to_addrs могут содержать символы, отличные от ASCII.Этот метод может поднять следующие исключения:
-
SMTPRecipientsRefused -
Все получатели были отклонены. Никто не получил письмо. Атрибут
recipientsобъекта исключения — это словарь с информацией об отклоненных получателях (как тот, что возвращается, когда хотя бы один получатель был принят). -
SMTPHeloError -
Сервер некорректно ответил на приветствие
HELO. -
SMTPSenderRefused -
Сервер не принял from_addr.
-
SMTPDataError -
Сервер ответил с неожиданным кодом ошибки (кроме отказа получателя).
-
SMTPNotSupportedError -
SMTPUTF8был указан в mail_options, но не поддерживается сервером.
Если не указано иное, соединение останется открытым даже после возникновения исключения.
Изменено в версии 3.2: msg может быть байтовой строкой.
Изменено в версии 3.5: Добавлена поддержка
SMTPUTF8, иSMTPNotSupportedErrorможет быть поднято, еслиSMTPUTF8указан, но не поддерживается сервером. -
-
SMTP.send_message(msg, from_addr=None, to_addrs=None, mail_options=(), rcpt_options=()) -
Это метод для удобства вызова
sendmail()с сообщением, представленным объектомemail.message.Message. Аргументы имеют такое же значение, как и дляsendmail(), за исключением того, что msg является объектомMessage.Если from_addr
Noneили to_addrsNone,send_messageзаполняет эти аргументы адресами, извлечёнными из заголовков msg, как указано в RFC 5322: from_addr устанавливается в поле Sender, если оно есть, в противном случае — в поле From. to_addrs объединяет значения (если есть) полей To, Cc и Bcc из msg. Если в сообщении присутствует ровно один набор заголовков Resent-*, обычные заголовки игнорируются, и вместо них используются заголовки Resent-*. Если в сообщении содержится более одного набора заголовков Resent-*, генерируется исключениеValueError, так как нет однозначного способа определить наиболее актуальный набор заголовков Resent-.send_messageсериализует msg с помощьюBytesGeneratorс\r\nв качестве linesep и вызываетsendmail()для передачи полученного сообщения. Независимо от значений from_addr и to_addrs,send_messageне передает любые заголовки Bcc или Resent-Bcc, которые могут присутствовать в msg. Если любой из адресов в from_addr и to_addrs содержит не-ASCII символы, а сервер не поддерживаетSMTPUTF8, возникает ошибкаSMTPNotSupported. В противном случаеMessageсериализуется с клоном егоpolicyс атрибутомutf8, установленным в значениеTrue, иSMTPUTF8иBODY=8BITMIMEдобавляются в mail_options.Добавлена в версии 3.2.
Добавлена в версии 3.5: Поддержка интернационализированных адресов (
SMTPUTF8).
-
SMTP.quit() -
Завершает сеанс SMTP и закрывает соединение. Возвращает результат команды SMTP
QUIT.
Также поддерживаются низкоуровневые методы, соответствующие стандартным командам SMTP/ESMTP HELP, RSET, NOOP, MAIL, RCPT, и DATA. Обычно их не нужно вызывать напрямую, поэтому они здесь не документированы. Для получения подробностей обратитесь к коду модуля.
Пример SMTP
В этом примере пользователя просят ввести адреса, необходимые в оболочке сообщения (адреса «To» и «From»), а также само сообщение. Обратите внимание, что заголовки, которые должны быть включены в сообщение, должны быть включены в введённое сообщение; этот пример не выполняет никаких операций с заголовками RFC 822. В частности, адреса «To» и «From» должны быть включены в заголовки сообщения явно:
import smtplib
def prompt(title):
return input(title).strip()
from_addr = prompt("From: ")
to_addrs = prompt("To: ").split()
print("Enter message, end with ^D (Unix) or ^Z (Windows):")
# Add the From: and To: headers at the start!
lines = [f"From: {from_addr}", f"To: {', '.join(to_addrs)}", ""]
while True:
try:
line = input()
except EOFError:
break
else:
lines.append(line)
msg = "\r\n".join(lines)
print("Message length is", len(msg))
server = smtplib.SMTP("localhost")
server.set_debuglevel(1)
server.sendmail(from_addr, to_addrs, msg)
server.quit()
Примечание
В общем случае вы захотите использовать возможности пакета email для создания электронного сообщения, которое затем можно отправить с помощью send_message(); см. email: Примеры.
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/smtplib.html