smtplib — Клиент протокола SMTP
Исходный код: Lib/smtplib.py
Модуль smtplib определяет объект сессии SMTP-клиента, который можно использовать для отправки почты на любой интернет-машине с SMTP или ESMTP слушающим демоном. Для получения подробной информации об операциях SMTP и ESMTP обратитесь к RFC 821 (Простой протокол передачи почты) и RFC 1869 (Расширения сервиса SMTP).
-
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 задаёт таймаут в секундах для блокирующих операций, таких как попытка соединения (если не указан, будет использоваться глобальная настройка таймаута по умолчанию). Если таймаут истекает, возникает исключениеsocket.timeout. Необязательный параметр 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') >>>Изменено в версии 3.3: Добавлена поддержка оператора
with.Изменено в версии 3.3: Добавлен аргумент source_address.
Добавлен в версии 3.5: Теперь поддерживается расширение SMTPUTF8 (RFC 6531).
-
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-over-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()выбрать доверенные сертификаты CA вашей системы.
-
class smtplib.LMTP(host='', port=LMTP_PORT, local_hostname=None, source_address=None) -
Протокол LMTP, очень похожий на ESMTP, сильно опирается на стандартного SMTP-клиента. Часто для LMTP используются Unix-сокеты, поэтому наш метод
connect()должен поддерживать это, а также обычный сервер host:port. Необязательные аргументы local_hostname и source_address имеют то же значение, что и в классеSMTP. Для указания Unix-соккета необходимо использовать абсолютный путь к host, начинающийся с «/».Поддерживается аутентификация с использованием обычного механизма SMTP. При использовании Unix-сокету LMTP обычно не поддерживает и не требует аутентификации, но ваши результаты могут отличаться.
Также определён ряд исключений:
-
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, это устанавливает «отправитель» в строку, которую 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 - Simple Mail Transfer Protocol
-
Определение протокола SMTP. Этот документ охватывает модель, порядок работы и детали протокола SMTP.
- RFC 1869 - SMTP Service Extensions
-
Определение расширений 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 элементов: код ответа и сообщение, отправленное сервером в ответ на подключение.
-
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для указанного механизма аутентификации mechanism и обработать ответ на вызов через authobject.mechanism указывает, какой механизм аутентификации использовать в качестве аргумента для команды
AUTH; допустимые значения — те, которые перечислены в элементеauthизesmtp_features.authobject должен быть вызываемым объектом, принимающим необязательный единственный аргумент:
data = authobject(challenge=None)
Если необязательный ключевой аргумент initial_response_ok равен true, то
authobject()будет вызван сначала без аргументов. Он может вернуть ASCII «начальный ответ» RFC 4954str, который будет закодирован и отправлен с командойAUTHкак показано ниже. Если сервер не поддерживает начальный ответ (например, потому что ему нужен вызов), он должен вернутьNoneпри вызове сchallenge=None. Если initial_response_ok равен false, тоauthobject()не будет вызван сначала сNone.Если проверка начального ответа возвращает
None, или если initial_response_ok равен false,authobject()будет вызван для обработки ответа сервера на вызов; аргумент challenge, который ему передаётся, будетbytes. Он должен вернуть ASCIIstrdata, которое будет закодировано в 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и 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 (одиночная строка будет обработана как список с одним адресом) и строка сообщения. Вызывающая сторона может передать список параметров 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_addrs равноNone,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–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.7/library/smtplib.html