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-порту источника. Он принимает кортеж из 2 элементов (host, port) для сокета, к которому нужно привязаться в качестве адреса источника перед подключением. Если он опущен (или если host или port равны''и/или 0 соответственно), будет использовано поведение по умолчанию ОС.Для нормального использования вам потребуются только методы инициализации/подключения,
sendmail()и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).
-
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, этот исключение устанавливает ‘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 новыми командами, поддержки динамического обнаружения команд, предоставляемых сервером, и определяет несколько дополнительных команд.
1. Объекты 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). Если имя хоста заканчивается двоеточием (
':') за которым следует число, этот суффикс будет удален, а число интерпретируется как номер порта, который следует использовать. Этот метод автоматически вызывается конструктором, если имя хоста указано во время создания экземпляра. Возвращает кортеж из двух элементов: код ответа и сообщение, отправленное сервером в ответ на подключение.
-
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()будет вызван первым без аргументов. Он может вернуть байты «начального ответа» RFC 4954, которые будут закодированы и отправлены с командойAUTHкак показано ниже. Еслиauthobject()не поддерживает начальный ответ (например, потому что требует вызова с параметром challenge), он должен вернутьNoneпри вызове сchallenge=None. Если initial_response_ok равен false, тоauthobject()не будет вызван первым сNone.Если проверка начального ответа вернет
None, или если initial_response_ok равен false,authobject()будет вызван для обработки ответа сервера на вызов; аргумент challenge, который он получит, будетbytes. Он должен вернуть байты 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, они передаются в функцию
socketмодуляssl().Необязательный параметр context — это объект
ssl.SSLContext; В этом случае использование keyfile и certfileNone.Если до этого в сессии не было выполнены команды
EHLOилиHELO, этот метод сначала попытается использовать ESMTPEHLO.-
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. Обычно их вызывать напрямую не нужно, поэтому они здесь не документированы. Для получения подробностей обратитесь к коду модуля.
2. Пример 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.5/library/smtplib.html