smtplib — Клиент протокола SMTP
Исходный код: Lib/smtplib.py
Модуль smtplib определяет объект сеанса SMTP-клиента, который может использоваться для отправки почты на любой интернет-машине с демоном-слушателем SMTP или ESMTP. Для получения подробностей об операциях SMTP и ESMTP см. RFC 821 (Простой протокол передачи почты) и RFC 1869 (Расширения службы SMTP).
Доступность: не WASI.
Этот модуль не работает или недоступен в WebAssembly. Для получения дополнительной информации см. Платформы 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-порту источника. Он принимает кортеж из 2-х элементов(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-over-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()должен поддерживать это наряду с обычным сервером host:port. Необязательные аргументы local_hostname и source_address имеют то же значение, что и в классеSMTP. Для указания Unix-сокетa необходимо использовать абсолютный путь для 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-строкуstrdata, которая будет закодирована в 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, размер сообщения и каждая из указанных опций будут переданы ему (если опция находится в наборе функций, которые сервер рекламирует). ЕслиEHLOне удается, пытается использовать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.13/library/smtplib.html