smtplib — Klient för SMTP-protokoll

Källkod: Lib/smtplib.py


Modulen smtplib definierar ett SMTP-klientsessionsobjekt som kan användas för att skicka e-post till en Internetmaskin med en SMTP- eller ESMTP-lyssnardemon. För detaljer om SMTP- och ESMTP-funktioner, se RFC 821 (Simple Mail Transfer Protocol) och RFC 1869 (SMTP Service Extensions).

Tillgänglighet: not WASI.

Den här modulen fungerar inte eller är inte tillgänglig på WebAssembly. Se WebAssembly-plattformar för mer information.

class smtplib.SMTP(host='', port=0, local_hostname=None, [timeout, ]source_address=None)

En SMTP-instans kapslar in en SMTP-anslutning. Den har metoder som stöder en fullständig repertoar av SMTP- och ESMTP-operationer. Om de valfria parametrarna host och port anges, anropas SMTP connect()-metoden med dessa parametrar under initialiseringen. Om local_hostname anges används det som FQDN för den lokala värden i HELO/EHLO-kommandot. Annars hittas det lokala värdnamnet med hjälp av socket.getfqdn(). Om anropet connect() returnerar något annat än en framgångskod, genereras ett SMTPConnectError. Den valfria parametern timeout anger en timeout i sekunder för blockerande operationer som anslutningsförsöket (om den inte anges kommer den globala standardinställningen för timeout att användas). Om tidsgränsen överskrids utlöses TimeoutError. Den valfria parametern source_address gör det möjligt att binda till en specifik källadress i en maskin med flera nätverksgränssnitt och/eller till en specifik TCP-källport. Den tar en 2-tupel (host, port), för uttaget att binda till som sin källadress innan anslutning. Om detta utelämnas (eller om host eller port är '' och/eller 0) kommer operativsystemets standardbeteende att användas.

För normal användning bör du bara behöva metoderna initialisering/anslutning, sendmail() och SMTP.quit(). Ett exempel finns nedan.

Klassen SMTP har stöd för with-satsen. När det används på det här sättet utfärdas SMTP-kommandot QUIT automatiskt när with-satsen avslutas. T.ex.:

>>> from smtplib import SMTP
>>> with SMTP("domain.org") as smtp:
...     smtp.noop()
...
(250, b'Ok')
>>>

Alla kommandon ger upphov till en auditing event smtplib.SMTP.send med argumenten self och data, där data är de bytes som ska skickas till fjärrvärden.

Ändrad i version 3.3: Stöd för with statement har lagts till.

Ändrad i version 3.3: argumentet source_address har lagts till.

Tillagd i version 3.5: SMTPUTF8-tillägget (RFC 6531) stöds nu.

Ändrad i version 3.9: Om parametern timeout är noll kommer den att skapa ett ValueError för att förhindra att en icke-blockerande socket skapas.

class smtplib.SMTP_SSL(host='', port=0, local_hostname=None, *, [timeout, ]context=None, source_address=None)

En instans av SMTP_SSL beter sig exakt likadant som instanser av SMTP. SMTP_SSL bör användas i situationer där SSL krävs från början av anslutningen och det inte är lämpligt att använda starttls(). Om host inte specificeras används den lokala värden. Om port är noll används standardporten för SMTP-over-SSL (465). De valfria argumenten local_hostname, timeout och source_address har samma betydelse som de har i klassen SMTP. context, som också är valfritt, kan innehålla en SSLContext och gör det möjligt att konfigurera olika aspekter av den säkra anslutningen. Läs Överväganden om säkerhet för bästa praxis.

Ändrad i version 3.3: sammanhang lades till.

Ändrad i version 3.3: Argumentet source_address har lagts till.

Ändrad i version 3.4: Klassen stöder nu kontroll av värdnamn med ssl.SSLContext.check_hostname och Server Name Indication (se ssl.HAS_SNI).

Ändrad i version 3.9: Om parametern timeout är noll kommer den att skapa ett ValueError för att förhindra att ett icke-blockerande uttag skapas

Ändrad i version 3.12: De föråldrade parametrarna keyfile och certfile har tagits bort.

class smtplib.LMTP(host='', port=LMTP_PORT, local_hostname=None, source_address=None[, timeout])

LMTP-protokollet, som är mycket likt ESMTP, är starkt baserat på standard SMTP-klienten. Det är vanligt att använda Unix-sockets för LMTP, så vår connect()-metod måste stödja detta såväl som en vanlig host:port-server. De valfria argumenten local_hostname och source_address har samma betydelse som de har i klassen SMTP. För att ange en Unix-socket måste du använda en absolut sökväg för host, som börjar med ’/’.

Autentisering stöds med hjälp av den vanliga SMTP-mekanismen. När du använder ett Unix-uttag stöder eller kräver LMTP i allmänhet inte någon autentisering, men det kan variera.

Ändrad i version 3.9: Den valfria parametern timeout har lagts till.

Ett bra urval av undantag definieras också:

exception smtplib.SMTPException

Underklass till OSError som är basundantagsklassen för alla andra undantag som tillhandahålls av denna modul.

Ändrad i version 3.4: SMTPException blev underklass till OSError

exception smtplib.SMTPServerDisconnected

Detta undantag uppstår när servern oväntat kopplas från, eller när man försöker använda SMTP-instansen innan den ansluts till en server.

exception smtplib.SMTPResponseException

Basklass för alla undantag som innehåller en SMTP-felkod. Dessa undantag genereras i vissa fall när SMTP-servern returnerar en felkod. Felkoden lagras i attributet smtp_code för felet, och attributet smtp_error sätts till felmeddelandet.

exception smtplib.SMTPSenderRefused

Avsändaradressen nekades. Förutom de attribut som anges för alla SMTPResponseException-undantag, anger detta ’sender’ till den sträng som SMTP-servern nekade.

exception smtplib.SMTPRecipientsRefused

Alla mottagaradresser nekades. Felen för varje mottagare är tillgängliga via attributet recipients, som är en ordbok av exakt samma typ som SMTP.sendmail() returnerar.

exception smtplib.SMTPDataError

SMTP-servern vägrade att acceptera meddelandedata.

exception smtplib.SMTPConnectError

Ett fel inträffade när en anslutning till servern upprättades.

exception smtplib.SMTPHeloError

Servern avvisade vårt HELO-meddelande.

exception smtplib.SMTPNotSupportedError

Kommandot eller alternativet stöds inte av servern.

Tillagd i version 3.5.

exception smtplib.SMTPAuthenticationError

SMTP-autentiseringen gick fel. Troligen accepterade inte servern den kombination av användarnamn och lösenord som angavs.

Se även

RFC 821 - Protokoll för överföring av enkel e-post

Protokolldefinition för SMTP. Detta dokument beskriver modell, arbetssätt och protokolldetaljer för SMTP.

RFC 1869 - SMTP-tjänsttillägg

Definition av ESMTP-tillägg för SMTP. Här beskrivs ett ramverk för att utöka SMTP med nya kommandon, med stöd för dynamisk identifiering av de kommandon som tillhandahålls av servern, och några ytterligare kommandon definieras.

SMTP-objekt

En instans av SMTP har följande metoder:

SMTP.set_debuglevel(level)

Ställer in nivån för felsökningsutmatning. Ett värde på 1 eller True för level resulterar i felsökningsmeddelanden för anslutning och för alla meddelanden som skickas till och tas emot från servern. Ett värde på 2 för level resulterar i att dessa meddelanden tidsstämplas.

Ändrad i version 3.5: Lagt till felsökningsnivå 2.

SMTP.docmd(cmd, args='')

Skicka ett kommando cmd till servern. Det valfria argumentet args är helt enkelt sammanlänkat med kommandot, separerat med ett mellanslag.

Detta returnerar en 2-tupel som består av en numerisk svarskod och den faktiska svarsraden (svar med flera rader sammanfogas till en lång rad)

I normal drift ska det inte vara nödvändigt att anropa denna metod explicit. Den används för att implementera andra metoder och kan vara användbar för att testa privata tillägg.

Om anslutningen till servern bryts medan du väntar på svaret kommer SMTPServerDisconnected att aktiveras.

SMTP.connect(host='localhost', port=0)

Anslut till en värd på en given port. Standardinställningen är att ansluta till den lokala värden på standard SMTP-porten (25). Om värdnamnet slutar med ett kolon (':') följt av ett nummer, kommer detta suffix att tas bort och numret tolkas som det portnummer som ska användas. Denna metod anropas automatiskt av konstruktören om en värd anges under instantiering. Returnerar en 2-tupel av svarskoden och meddelandet som skickas av servern i dess anslutningssvar.

Utlöser en auditing event smtplib.connect med argumenten self, host, port.

SMTP.helo(name='')

Identifiera dig för SMTP-servern med hjälp av HELO. Argumentet hostname är som standard det fullständigt kvalificerade domännamnet för den lokala värden. Det meddelande som returneras av servern lagras som attributet helo_resp för objektet.

I normal drift bör det inte vara nödvändigt att anropa denna metod explicit. Den kommer att anropas implicit av sendmail() när det behövs.

SMTP.ehlo(name='')

Identifiera dig för en ESMTP-server med hjälp av EHLO. Argumentet hostname är som standard det fullständigt kvalificerade domännamnet för den lokala värden. Undersöker svaret för ESMTP-alternativ och lagrar dem för användning av has_extn(). Ställer också in flera informationsattribut: meddelandet som returneras av servern lagras som attributet ehlo_resp, does_esmtp sätts till True eller False beroende på om servern stöder ESMTP, och esmtp_features kommer att vara en ordbok som innehåller namnen på de SMTP-tjänsttillägg som denna server stöder och deras parametrar (om några).

Om du inte vill använda has_extn() innan du skickar e-post, bör det inte vara nödvändigt att anropa denna metod explicit. Den kommer att anropas implicit av sendmail() när det behövs.

SMTP.ehlo_or_helo_if_needed()

Den här metoden anropar ehlo() och/eller helo() om det inte har funnits något tidigare EHLO- eller HELO-kommando i den här sessionen. Den försöker först med ESMTP EHLO.

SMTPHeloError

Servern svarade inte korrekt på hälsningsfrasen HELO.

SMTP.has_extn(name)

Returnerar True om namn finns med i uppsättningen SMTP-tjänsttillägg som returneras av servern, annars False. Case ignoreras.

SMTP.verify(address)

Kontrollerar giltigheten för en adress på denna server med hjälp av SMTP VRFY. Returnerar en tupel bestående av kod 250 och en fullständig RFC 822-adress (inklusive mänskligt namn) om användaradressen är giltig. I annat fall returneras en SMTP-felkod på 400 eller högre och en felsträng.

Anteckning

Många webbplatser inaktiverar SMTP VRFY för att motverka spammare.

SMTP.login(user, password, *, initial_response_ok=True)

Logga in på en SMTP-server som kräver autentisering. Argumenten är användarnamnet och lösenordet som ska användas för autentisering. Om det inte har förekommit något tidigare EHLO- eller HELO-kommando i den här sessionen, försöker den här metoden först med ESMTP EHLO. Denna metod returnerar normalt om autentiseringen lyckades, eller kan ge upphov till följande undantag:

SMTPHeloError

Servern svarade inte korrekt på hälsningsfrasen HELO.

SMTPAuthenticationError

Servern accepterade inte kombinationen av användarnamn/lösenord.

SMTPNotSupportedError

Kommandot AUTH stöds inte av servern.

SMTPException

Ingen lämplig autentiseringsmetod hittades.

Alla autentiseringsmetoder som stöds av smtplib prövas i tur och ordning om de annonseras som stödda av servern. Se auth() för en lista över autentiseringsmetoder som stöds. initial_response_ok skickas vidare till auth().

Det valfria nyckelordsargumentet initial_response_ok anger om, för autentiseringsmetoder som stöder detta, ett ”initialt svar” enligt RFC 4954 kan skickas tillsammans med kommandot AUTH, i stället för att kräva en utmaning/svar.

Ändrad i version 3.5: SMTPNotSupportedError kan uppstå, och parametern initial_response_ok har lagts till.

SMTP.auth(mechanism, authobject, *, initial_response_ok=True)

Utfärda ett SMTP AUTH-kommando för den angivna autentiseringsmekanismen och hantera utmaningsvaret via authobject.

mechanism anger vilken autentiseringsmekanism som skall användas som argument till kommandot AUTH; de giltiga värdena är de som anges i elementet auth i esmtp_features.

authobject måste vara ett anropbart objekt som tar ett valfritt enda argument:

data = authobject(utmaning=None)

Om det valfria nyckelordsargumentet initial_response_ok är sant, kommer authobject() att anropas först utan något argument. Den kan returnera RFC 4954 ”initial response” ASCII str som kommer att kodas och skickas med AUTH kommandot enligt nedan. Om authobject() inte stöder ett initialt svar (t.ex. för att det kräver en utmaning), bör det returnera None när det anropas med challenge=None. Om initial_response_ok är false, så kommer inte authobject() att anropas först med None.

Om den initiala svarskontrollen returnerar None, eller om initial_response_ok är false, kommer authobject() att anropas för att bearbeta serverns utmaningssvar; argumentet challenge som den skickas till kommer att vara en bytes. Den bör returnera ASCII str data som kommer att base64-kodas och skickas till servern.

Klassen SMTP tillhandahåller authobjects för mekanismerna CRAM-MD5, PLAIN och LOGIN; de heter SMTP.auth_cram_md5, SMTP.auth_plain respektive SMTP.auth_login. De kräver alla att egenskaperna user och password i SMTP-instansen är inställda på lämpliga värden.

Användarkoden behöver normalt inte anropa auth direkt, utan kan istället anropa metoden login`(), som kommer att prova var och en av ovanstående mekanismer i tur och ordning, i den ordning som anges. auth är exponerad för att underlätta implementeringen av autentiseringsmetoder som inte (eller ännu inte) stöds direkt av smtplib.

Tillagd i version 3.5.

SMTP.starttls(*, context=None)

Sätt SMTP-anslutningen i TLS-läge (Transport Layer Security). Alla SMTP-kommandon som följer kommer att krypteras. Du bör sedan anropa ehlo() igen.

Om keyfile och certfile anges används de för att skapa en ssl.SSLContext.

Den valfria parametern context är ett ssl.SSLContext-objekt; Detta är ett alternativ till att använda en keyfile och en certfile och om både keyfile och certfile anges bör de vara None.

Om det inte har funnits något tidigare EHLO- eller HELO-kommando i den här sessionen, försöker den här metoden ESMTP EHLO först.

Ändrad i version 3.12: De föråldrade parametrarna keyfile och certfile har tagits bort.

SMTPHeloError

Servern svarade inte korrekt på hälsningsfrasen HELO.

SMTPNotSupportedError

Servern har inte stöd för tillägget STARTTLS.

RuntimeError

SSL/TLS-stöd är inte tillgängligt för din Python-tolk.

Ändrad i version 3.3: sammanhang lades till.

Ändrad i version 3.4: Metoden stöder nu kontroll av värdnamn med SSLContext.check_hostname och Server Name Indicator (se HAS_SNI).

Ändrad i version 3.5: Felet som uppstår på grund av avsaknad av STARTTLS-stöd är nu underklassen SMTPNotSupportedError istället för basen SMTPException.

SMTP.sendmail(from_addr, to_addrs, msg, mail_options=(), rcpt_options=())

Skicka e-post. De nödvändiga argumenten är en RFC 822 från-adresssträng, en lista med RFC 822 till-adresssträngar (en naken sträng kommer att behandlas som en lista med 1 adress) och en meddelandesträng. Den som anropar kan skicka en lista med ESMTP-alternativ (t.ex. 8bitmime) som ska användas i MAIL FROM-kommandon som mail_options. ESMTP-alternativ (t.ex. DSN-kommandon) som ska användas med alla RCPT-kommandon kan skickas som rcpt_options. (Om du behöver använda olika ESMTP-alternativ till olika mottagare måste du använda lågnivåmetoder som mail(), rcpt() och data() för att skicka meddelandet)

Anteckning

Parametrarna from_addr och to_addrs används för att konstruera det meddelandekuvert som används av transportagenterna. sendmail ändrar inte meddelandehuvudena på något sätt.

msg kan vara en sträng som innehåller tecken i ASCII-intervallet eller en bytesträng. En sträng kodas till byte med hjälp av ascii-kodeken, och ensamma ”r”- och ”n”-tecken konverteras till ”r”-tecken. En byte-sträng modifieras inte.

Om det inte har förekommit något tidigare EHLO- eller HELO-kommando i den här sessionen, försöker den här metoden först med ESMTP EHLO. Om servern använder ESMTP skickas meddelandestorlek och alla angivna alternativ till den (om alternativet finns i den funktionsuppsättning som servern annonserar). Om EHLO misslyckas, kommer HELO att provas och ESMTP-alternativen undertrycks.

Denna metod returnerar normalt om posten accepteras för minst en mottagare. Annars kommer den att ge upphov till ett undantag. Det vill säga, om den här metoden inte ger upphov till ett undantag bör någon få din e-post. Om den här metoden inte ger upphov till ett undantag returneras en ordbok med en post för varje mottagare som nekades. Varje post innehåller en tupel av SMTP-felkoden och det tillhörande felmeddelandet som skickas av servern.

Om SMTPUTF8 ingår i mail_options och servern stöder det, kan from_addr och to_addrs innehålla icke-ASCII-tecken.

Denna metod kan ge upphov till följande undantag:

SMTPRecipientsRefused

Alla mottagare nekades. Ingen fick mailet. Attributet recipients i exception-objektet är en ordbok med information om de avvisade mottagarna (som den som returneras när minst en mottagare accepterades).

SMTPHeloError

Servern svarade inte korrekt på hälsningsfrasen HELO.

SMTPSenderRefused

Servern accepterade inte from_addr.

SMTPDataError

Servern svarade med en oväntad felkod (annat än att en mottagare nekades).

SMTPNotSupportedError

SMTPUTF8 angavs i mail_options men stöds inte av servern.

Om inget annat anges kommer anslutningen att vara öppen även efter att ett undantag har uppstått.

Ändrad i version 3.2: msg kan vara en byte-sträng.

Ändrad i version 3.5: stöd för SMTPUTF8 har lagts till, och SMTPNotSupportedError` kan uppstå om SMTPUTF8 anges men servern inte stöder det.

SMTP.send_message(msg, from_addr=None, to_addrs=None, mail_options=(), rcpt_options=())

Detta är en bekvämlighetsmetod för att anropa sendmail() med ett meddelande som representeras av ett email.message.Message-objekt. Argumenten har samma betydelse som för sendmail(), förutom att msg är ett Message-objekt.

Om from_addr är None eller to_addrs är None, fyller send_message dessa argument med adresser som hämtats från rubrikerna i msg enligt RFC 5322: from_addr sätts till fältet Sender om det finns, och annars till fältet From. to_addrs kombinerar värdena (om sådana finns) i fälten To, Cc och Bcc från msg. Om det finns exakt en uppsättning Resent-*-rubriker i meddelandet ignoreras de vanliga rubrikerna och Resent-*-rubrikerna används i stället. Om meddelandet innehåller mer än en uppsättning Resent-*-rubriker, uppstår ett ValueError, eftersom det inte finns något sätt att entydigt upptäcka den senaste uppsättningen Resent--rubriker.

send_message serialiserar msg med hjälp av BytesGenerator med \r\n som linjesep, och anropar sendmail() för att skicka det resulterande meddelandet. Oavsett värdena på from_addr och to_addrs överför inte send_message några Bcc- eller Resent-Bcc-rubriker som kan förekomma i msg. Om någon av adresserna i from_addr och to_addrs innehåller icke-ASCII tecken och servern inte annonserar SMTPUTF8 stöd, kommer ett SMTPNotSupportedError` att uppstå. Annars serialiseras Message med en klon av dess policy med attributet utf8` satt till True, och SMTPUTF8 och BODY=8BITMIME läggs till i mail_options.

Tillagd i version 3.2.

Tillagd i version 3.5: Stöd för internationaliserade adresser (SMTPUTF8).

SMTP.quit()

Avslutar SMTP-sessionen och stänger anslutningen. Returnerar resultatet av SMTP-kommandot QUIT.

Lågnivåmetoder som motsvarar standard SMTP/ESMTP-kommandona HELP, RSET, NOOP, MAIL, RCPT och DATA stöds också. Normalt behöver dessa inte anropas direkt, så de är inte dokumenterade här. För mer information, se modulens kod.

SMTP Exempel

I detta exempel uppmanas användaren att ange de adresser som behövs i meddelandekuvertet (”Till”- och ”Från”-adresser) och det meddelande som ska levereras. Observera att de rubriker som ska ingå i meddelandet måste ingå i meddelandet som det anges; i detta exempel görs ingen bearbetning av RFC 822-rubrikerna. I synnerhet måste adresserna ”To” och ”From” uttryckligen ingå i meddelanderubrikerna:

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()

Anteckning

I allmänhet vill du använda email-paketets funktioner för att konstruera ett e-postmeddelande, som du sedan kan skicka via send_message(); se email: Exempel.