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 SMTPconnect()
-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 avsocket.getfqdn()
. Om anropetconnect()
returnerar något annat än en framgångskod, genereras ettSMTPConnectError
. 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ösesTimeoutError
. 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/eller0
) kommer operativsystemets standardbeteende att användas.För normal användning bör du bara behöva metoderna initialisering/anslutning,
sendmail()
ochSMTP.quit()
. Ett exempel finns nedan.Klassen
SMTP
har stöd förwith
-satsen. När det används på det här sättet utfärdas SMTP-kommandotQUIT
automatiskt närwith
-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 argumentenself
ochdata
, därdata
ä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 avSMTP
.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ändastarttls()
. 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 klassenSMTP
. context, som också är valfritt, kan innehålla enSSLContext
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 (sessl.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 klassenSMTP
. 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 attributetsmtp_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 somSMTP.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 argumentenself
,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 attributethelo_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 avhas_extn()
. Ställer också in flera informationsattribut: meddelandet som returneras av servern lagras som attributetehlo_resp
,does_esmtp
sätts tillTrue
ellerFalse
beroende på om servern stöder ESMTP, ochesmtp_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 avsendmail()
när det behövs.
- SMTP.ehlo_or_helo_if_needed()¶
Den här metoden anropar
ehlo()
och/ellerhelo()
om det inte har funnits något tidigareEHLO
- ellerHELO
-kommando i den här sessionen. Den försöker först med ESMTPEHLO
.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, annarsFalse
. 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
- ellerHELO
-kommando i den här sessionen, försöker den här metoden först med ESMTPEHLO
. 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. Seauth()
för en lista över autentiseringsmetoder som stöds. initial_response_ok skickas vidare tillauth()
.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 elementetauth
iesmtp_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” ASCIIstr
som kommer att kodas och skickas medAUTH
kommandot enligt nedan. Omauthobject()
inte stöder ett initialt svar (t.ex. för att det kräver en utmaning), bör det returneraNone
när det anropas medchallenge=None
. Om initial_response_ok är false, så kommer inteauthobject()
att anropas först medNone
.Om den initiala svarskontrollen returnerar
None
, eller om initial_response_ok är false, kommerauthobject()
att anropas för att bearbeta serverns utmaningssvar; argumentet challenge som den skickas till kommer att vara enbytes
. Den bör returnera ASCIIstr
data som kommer att base64-kodas och skickas till servern.Klassen
SMTP
tillhandahållerauthobjects
för mekanismernaCRAM-MD5
,PLAIN
ochLOGIN
; de heterSMTP.auth_cram_md5
,SMTP.auth_plain
respektiveSMTP.auth_login
. De kräver alla att egenskapernauser
ochpassword
iSMTP
-instansen är inställda på lämpliga värden.Användarkoden behöver normalt inte anropa
auth
direkt, utan kan istället anropa metodenlogin`()
, 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 avsmtplib
.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 varaNone
.Om det inte har funnits något tidigare
EHLO
- ellerHELO
-kommando i den här sessionen, försöker den här metoden ESMTPEHLO
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 (seHAS_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 basenSMTPException
.
- 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 iMAIL FROM
-kommandon som mail_options. ESMTP-alternativ (t.ex.DSN
-kommandon) som ska användas med allaRCPT
-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 sommail()
,rcpt()
ochdata()
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
- ellerHELO
-kommando i den här sessionen, försöker den här metoden först med ESMTPEHLO
. Om servern använder ESMTP skickas meddelandestorlek och alla angivna alternativ till den (om alternativet finns i den funktionsuppsättning som servern annonserar). OmEHLO
misslyckas, kommerHELO
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, ochSMTPNotSupportedError`
kan uppstå omSMTPUTF8
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 ettemail.message.Message
-objekt. Argumenten har samma betydelse som försendmail()
, förutom att msg är ettMessage
-objekt.Om from_addr är
None
eller to_addrs ärNone
, fyllersend_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 ettValueError
, 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 avBytesGenerator
med\r\n
som linjesep, och anroparsendmail()
för att skicka det resulterande meddelandet. Oavsett värdena på from_addr och to_addrs överför intesend_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 annonserarSMTPUTF8
stöd, kommer ettSMTPNotSupportedError`
att uppstå. Annars serialiserasMessage
med en klon av desspolicy
med attributetutf8`
satt tillTrue
, ochSMTPUTF8
ochBODY=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.