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. Если заданы дополнительные параметры хоста и порта, метод SMTPconnect()вызывается вместе с этими параметрами во время инициализации. Если указано, local_hostname используемый в качестве полного доменного имени хоста локальная в команде HELO/EHLO. В противном случае имя хоста локальная будет найдено с помощьюsocket.getfqdn(). Если вызовconnect()возвращает что-либо, кроме успешного код, возникаетSMTPConnectError. Дополнительный параметр timeout определяет перерыв в секундах для блокирования операций как попытка связи (если не определенный, глобальная настройка перерыва по умолчанию будет используемый). Если время ожидания истекает,socket.timeoutувеличивается. Необязательный параметр source_address позволяет биндинг к определенному адресу источника в машине с несколькими сетевыми интерфейсами и/или к определенному порту TCP источника. Перед подключением требуется 2-кортеж (хост, порт) для привязки сокет в качестве адреса источника. Если опущено (или если хост или порт''и/или 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).
-
class
smtplib.SMTP_SSL(host='', port=0, local_hostname=None, keyfile=None, certfile = None, [тайм-аут, ]контекст = 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()выбрать доверенные сертификаты цС системы.
-
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 новыми командами, поддержка динамического обнаружения команд, предоставляемых сервером, и определяются несколько дополнительных команд.
Объекты SMTP¶
В SMTP сущность используются следующие методы:
-
SMTP.set_debuglevel(level)¶ Установка выходного уровня отладки. значение 1 или
Trueдля level приводит к появлению отладочных сообщений для подключения и для всех сообщений, отправляемых и получаемых с сервера. В результате значение 2 для level эти сообщения помечаются по времени.Изменено в версии 3.5: Added debuglevel 2.
-
SMTP.docmd(cmd, args='')¶ Отправьте командный cmd на сервер. Необязательный аргумент args просто связывается с командой, разделяясь пробелом.
Это возвращает 2-х кортеж, состоящий из числового код ответа и фактической линии ответа (многострочные ответы объединяются в одну длинную линию.)
При нормальной работе нет необходимости вызывать этот метод явным образом. Это используемый реализовать другие методы и может быть полезно для тестирования частных расширений.
Если соединение с сервером будет потеряно во время ожидания ответа,
SMTPServerDisconnectedбудет поднята.
-
SMTP.connect(host='localhost', port=0)¶ Подключение к хосту на данном порте. Значения по умолчанию - подключение к локальная хосту через стандартный SMTP-порт (25). Если имя хоста заканчивается двоеточием (
':'), за которым следует число, этот суффикс будет удален, а номер интерпретирован как номер порта для использования. Этот метод автоматически вызывается конструктором, если во время создания экземпляра указан хост. Возвращает 2-кортеж код ответа и сообщения, отправленного сервером в ответ на соединение.Raises an auditing event
smtplib.connectwith argumentsself,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. Сначала выполняется попыткаEHLOESMTP.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, этот метод сначала пытается выполнитьEHLOESMTP. Этот метод обычно возвращает, если аутентификация прошла успешно, или может вызвать следующие исключения: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)Если параметр ключевой argument initial_response_ok имеет значение true,
authobject()будет вызван сначала без аргумента. Он может возвращает RFC 4954 «начальный ответ» ASCIIstrкоторый будет кодированный и отправлен с помощью командыAUTH, как показано ниже. Еслиauthobject()не поддерживает первоначальный ответ (например, потому, что требует вызова), он должен возвращаетNoneпри вызове сchallenge=None. Если initial_response_ok имеет значение false, тоauthobject()не будет вызван первым с помощьюNone.Если проверка начального ответа возвращает
None, или если initial_response_ok имеет значение false,authobject()вызывается для обработки ответа сервера на запрос; переданный аргумент challenge будетbytes. Он должен возвращает ASCIIstrdata, который будет base64 кодированный и отправляться на сервер.Класс
SMTPобеспечиваетauthobjectsмеханизмовCRAM-MD5,PLAINиLOGIN; они называются соответственноSMTP.auth_cram_md5,SMTP.auth_plainиSMTP.auth_login. Они все требуют, чтобыuserи свойстваpasswordSMTPсущность собирались адаптировать значения.Пользователь код обычно не должен вызывать
authнапрямую, а может вместо этого вызвать методlogin(), который будет пробовать каждый из вышеперечисленных механизмов по очереди, в указанном порядке.authможет облегчить реализацию методов аутентификации, которые не поддерживаются (или еще не поддерживаются) непосредственноsmtplib.Добавлено в версии 3.5.
-
SMTP.starttls(keyfile=None, certfile=None, context=None)¶ Перевести SMTP-соединение в режим TLS (безопасность транспортного уровня). Все следующие команды SMTP будут зашифрованы. Тогда позвони
ehlo()еще раз.При наличии keyfile и certfile создается используемый
ssl.SSLContext.Необязательный параметр context является объектом
ssl.SSLContext; это альтернатива использованию ключевого файла и файла certfile, и, если указано, keyfile и certfile должны бытьNone.Если в этом сеансе не было предыдущей команды
EHLOилиHELO, этот метод сначала пытается выполнитьEHLOESMTP.Не рекомендуется, начиная с версии 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 from-address строка, список RFC 822 to-address строки (голый строка будет рассматриваться как список с 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, этот метод сначала пытается выполнитьEHLOESMTP. Если сервер выполняет ESMTP, ему будет передан размер сообщения и каждая из указанных опций (если опция находится в наборе функций, объявленном сервером). ЕслиEHLOзавершится неуспешно, будет выполнена попыткаHELOи подавлены опции ESMTP.Этот метод обычно возвращает, если почта принимается хотя бы для одного получателя. В противном случае это вызовет исключение. То есть если этот метод не вызывает исключения, то кто-то должен получить вашу почту. Если этот метод не вызывает исключение, он возвращает словарь с одной записью для каждого получателя, которому было отказано. Каждая запись содержит кортеж код об ошибке SMTP и сопутствующее сообщение об ошибке, отправленное сервером.
Если
SMTPUTF8включен в mail_options и сервер поддерживает его, from_addr и to_addrs могут содержать символы, отличные от ASCII.Этот метод может вызвать следующие исключения:
SMTPRecipientsRefusedвсем получателям отказано. Никто не получил почту.recipientsатрибут объекта исключения - это словарь с информацией об отклоненных получателях (например, возвращенный, когда был принят хотя бы один получатель).SMTPHeloErrorсервер неправильно ответил наHELOприветствие.SMTPSenderRefusedсервер не принял from_addr.SMTPDataErrorсервер ответил неожиданным код об ошибке (кроме отказа получателя).SMTPNotSupportedErrorSMTPUTF8указан в 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(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: Примеры.
