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 заданы, методconnect()SMTP вызывается с этими параметрами во время инициализации. Если указано, 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, keyfile=None, certfile=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и позволяет настроить различные аспекты безопасного подключения. Для получения рекомендаций по лучшим практикам, см. Рекомендации по безопасности.keyfile и certfile — устаревший альтернативный способ вместо context и могут указывать на файл закрытого ключа и цепочки сертификатов в формате PEM для SSL-соединения.
Изменено в версии 3.3: Добавлен context.
Изменено в версии 3.3: Добавлен аргумент source_address.
Изменено в версии 3.4: Класс теперь поддерживает проверку имени хоста с помощью
ssl.SSLContext.check_hostnameи Server Name Indication (см.ssl.HAS_SNI).Устарело начиная с версии 3.6: keyfile и certfile устарели в пользу context. Используйте
ssl.SSLContext.load_cert_chain()вместо этого или позвольтеssl.create_default_context()выбрать доверенные сертификаты ЦС системы.Изменено в версии 3.9: Если параметр timeout установлен в ноль, будет поднято исключение
ValueErrorдля предотвращения создания неблокирующего сокета
-
class smtplib.LMTP(host='', port=LMTP_PORT, local_hostname=None, source_address=None[, timeout]) -
Протокол LMTP, который очень похож на ESMTP, в значительной степени основан на стандартном клиенте SMTP. Для LMTP часто используются Unix-сокеты, поэтому наш метод
connect()должен поддерживать это, а также обычный сервер host:port. Необязательные аргументы local_hostname и source_address имеют то же значение, что и в классеSMTP. Для указания Unix-соккета необходимо использовать абсолютный путь для host, начинающийся с ‘/’.Поддерживается аутентификация, используя обычный механизм SMTP. При использовании Unix-сокетa 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 просто конкатенируется с командой, разделенной пробелом.
Возвращает пару из числового кода ответа и фактической строки ответа (многострочные ответы объединяются в одну длинную строку).
В обычном режиме вызывать этот метод явно не нужно. Он используется для реализации других методов и может быть полезен для тестирования частных расширений.
Если соединение с сервером будет потеряно во время ожидания ответа, будет поднято исключение
SMTPServerDisconnected.
-
SMTP.connect(host='localhost', port=0) -
Подключиться к хосту на указанном порту. По умолчанию подключается к локальному хосту на стандартном SMTP-порту (25). Если имя хоста заканчивается двоеточием (
':') и числом, этот суффикс будет удален, а число будет интерпретировано как номер порта для использования. Этот метод автоматически вызывается конструктором, если при создании объекта указан хост. Возвращает пару из кода ответа и сообщения, отправленного сервером в ответе на подключение.Вызывает событие аудита
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(keyfile=None, certfile=None, 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.6: keyfile и certfile устарели в пользу context. Пожалуйста, используйте
ssl.SSLContext.load_cert_chain()вместо этого или позвольтеssl.create_default_context()выбрать системные сертификаты доверенных центров сертификации.-
SMTPHeloError -
Сервер некорректно ответил на приветствие
HELO. -
SMTPNotSupportedError -
Сервер не поддерживает расширение STARTTLS.
-
RuntimeError -
Поддержка SSL/TLS недоступна в вашем интерпретаторе Python.
Изменено в версии 3.3: Добавлен параметр context.
Изменено в версии 3.4: Метод теперь поддерживает проверку имени хоста с помощью
SSLContext.check_hostnameи индикатора имени сервера (см.HAS_SNI).Изменено в версии 3.5: Ошибка, возникающая из-за отсутствия поддержки STARTTLS, теперь является подклассом
SMTPNotSupportedErrorвместо базового классаSMTPException. -
-
SMTP.sendmail(from_addr, to_addrs, msg, mail_options=(), rcpt_options=()) -
Отправка почты. Требуемые аргументы: строка адреса отправителя RFC 822, список строк адресов получателей RFC 822 (одиночная строка будет обработана как список из одного адреса) и строка сообщения. Вызывающий код может передать список опций 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, размер сообщения и все указанные опции будут переданы ему (если опция входит в набор функций, объявленных сервером). Если ESMTPEHLOтерпит неудачу, будет использоваться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
В этом примере пользователь вводит адреса, необходимые в конверте сообщения («Получатель» и «Отправитель»), и само сообщение. Обратите внимание, что заголовки, которые должны быть включены в сообщение, должны быть включены в введённое сообщение; в этом примере не производится обработка заголовков RFC 822. В частности, адреса «Получатель» и «Отправитель» должны быть явно указаны в заголовках сообщения.
import smtplib
def prompt(prompt):
return input(prompt).strip()
fromaddr = prompt("From: ")
toaddrs = prompt("To: ").split()
print("Enter message, end with ^D (Unix) or ^Z (Windows):")
# Add the From: and To: headers at the start!
msg = ("From: %s\r\nTo: %s\r\n\r\n"
% (fromaddr, ", ".join(toaddrs)))
while True:
try:
line = input()
except EOFError:
break
if not line:
break
msg = msg + line
print("Message length is", len(msg))
server = smtplib.SMTP('localhost')
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()
Примечание
В общем случае вы захотите использовать возможности пакета email для создания электронного письма, которое затем можно отправить через send_message(); см. email: Примеры.
© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/smtplib.html