imaplib
— IMAP4-protokollklient¶
Källkod: Lib/imaplib.py
Denna modul definierar tre klasser, IMAP4
, IMAP4_SSL
och IMAP4_stream
, som kapslar in en anslutning till en IMAP4-server och implementerar en stor del av IMAP4rev1-klientprotokollet enligt definitionen i RFC 2060. Den är bakåtkompatibel med IMAP4 (RFC 1730) servrar, men observera att kommandot STATUS
inte stöds i IMAP4.
Tillgänglighet: not WASI.
Den här modulen fungerar inte eller är inte tillgänglig på WebAssembly. Se WebAssembly-plattformar för mer information.
Tre klasser tillhandahålls av modulen imaplib
, varav IMAP4
är basklassen:
- class imaplib.IMAP4(host='', port=IMAP4_PORT, timeout=None)¶
Denna klass implementerar det faktiska IMAP4-protokollet. Anslutningen skapas och protokollversionen (IMAP4 eller IMAP4rev1) bestäms när instansen initialiseras. Om host inte specificeras används
''
(den lokala värden). Om port utelämnas används IMAP4:s standardport (143). Den valfria parametern timeout anger en timeout i sekunder för anslutningsförsöket. Om timeout inte anges eller ärNone
används den globala standardtimeouten för socket.Klassen
IMAP4
har stöd förwith
-satsen. När det används på detta sätt utfärdas IMAP4-kommandotLOGOUT
automatiskt närwith
-satsen avslutas. T.ex.:>>> from imaplib import IMAP4 >>> with IMAP4("domain.org") as M: ... M.noop() ... ('OK', [b'Nothing Accomplished. d25if65hy903weo.87'])
Ändrad i version 3.5: Stöd för
with
statement har lagts till.Ändrad i version 3.9: Den valfria parametern timeout har lagts till.
Tre undantag är definierade som attribut för klassen IMAP4
:
- exception IMAP4.error¶
Undantag som uppstår vid eventuella fel. Anledningen till undantaget skickas till konstruktören som en sträng.
- exception IMAP4.abort¶
Fel i IMAP4-servern orsakar att detta undantag tas upp. Detta är en subklass av
IMAP4.error
. Observera att om du stänger instansen och instansierar en ny, kommer du vanligtvis att kunna återhämta dig från detta undantag.
- exception IMAP4.readonly¶
Detta undantag uppstår när en skrivbar brevlåda har fått sin status ändrad av servern. Detta är en underklass till
IMAP4.error
. Någon annan klient har nu skrivbehörighet och brevlådan måste öppnas på nytt för att återfå skrivbehörighet.
Det finns också en underklass för säkra anslutningar:
- class imaplib.IMAP4_SSL(host='', port=IMAP4_SSL_PORT, *, ssl_context=None, timeout=None)¶
Detta är en underklass till
IMAP4
som ansluter via en SSL-krypterad socket (för att använda den här klassen behöver du en socketmodul som kompilerats med SSL-stöd). Om host inte anges används''
(den lokala värden). Om port utelämnas används standardporten för IMAP4-over-SSL (993). ssl_context är ettssl.SSLContext
-objekt som gör det möjligt att samla SSL-konfigurationsalternativ, certifikat och privata nycklar i en enda (potentiellt långlivad) struktur. Läs Överväganden om säkerhet för bästa praxis.Den valfria parametern timeout anger en timeout i sekunder för anslutningsförsöket. Om timeout inte anges eller är
None
används den globala standardtimeouten för socket.Ändrad i version 3.3: parametern ssl_context 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: Den valfria parametern timeout har lagts till.
Ändrad i version 3.12: De föråldrade parametrarna keyfile och certfile har tagits bort.
Den andra underklassen tillåter anslutningar som skapas av en underordnad process:
- class imaplib.IMAP4_stream(command)¶
Detta är en underklass som härrör från
IMAP4
som ansluter till filbeskrivarnastdin/stdout
som skapas genom att skicka command tillsubprocess.Popen()
.
Följande nyttofunktioner definieras:
- imaplib.Internaldate2tuple(datestr)¶
Analyserar en IMAP4
INTERNALDATE
-sträng och returnerar motsvarande lokal tid. Returvärdet är en tupel avtime.struct_time
ellerNone
om strängen har fel format.
- imaplib.Int2AP(num)¶
Konverterar ett heltal till en bytesrepresentation med hjälp av tecken från uppsättningen [
A
..P
].
- imaplib.ParseFlags(flagstr)¶
Konverterar ett IMAP4
FLAGS
-svar till en tupel av individuella flaggor.
- imaplib.Time2Internaldate(date_time)¶
Konverterar date_time till en IMAP4
INTERNALDATE
representation. Returvärdet är en sträng i formen:"DD-Mmm-YYYY HH:MM:SS +HHMM"
(inklusive dubbla citattecken). Argumentet date_time kan vara ett tal (int eller float) som representerar sekunder sedan epok (som returneras avtime.time()
), en 9-tupel som representerar lokal tid, en instans avtime.struct_time
(som returneras avtime.localtime()
), en medveten instans avdatetime.datetime
eller en sträng med dubbla citattecken. I det sista fallet antas den redan vara i rätt format.
Observera att IMAP4-meddelandenumren ändras när brevlådan ändras; i synnerhet efter att ett EXPUNGE
-kommando har raderat meddelanden numreras de återstående meddelandena om. Det är därför mycket lämpligt att använda UID:er i stället, med kommandot UID.
I slutet av modulen finns ett testavsnitt som innehåller ett mer omfattande exempel på användning.
Se även
Dokument som beskriver protokollet, källor för servrar som implementerar det, från University of Washingtons IMAP Information Center finns alla på (Source Code) https://github.com/uw-imap/imap (Not Maintained).
IMAP4-objekt¶
Alla IMAP4rev1-kommandon representeras av metoder med samma namn, antingen stora eller små bokstäver.
Alla argument till kommandon konverteras till strängar, utom för AUTHENTICATE
och det sista argumentet till APPEND
som skickas som en IMAP4-litteral. Om det behövs (strängen innehåller IMAP4-protokollkänsliga tecken och är inte omsluten av parenteser eller dubbla citattecken) citeras varje sträng. Argumentet password till kommandot LOGIN
är dock alltid citerat. Om du vill undvika att en argumentsträng citeras (t.ex. argumentet flags i kommandot STORE
) ska du sätta strängen inom parentes (t.ex. r'(\Deleted)'
).
De flesta kommandon returnerar en tupel: (typ, [data, ...])
där typ vanligtvis är 'OK'
eller 'NO'
, och data är antingen texten från kommandosvaret eller obligatoriska resultat från kommandot. Varje data är antingen en bytes
eller en tupel. Om det är en tupel är den första delen svarets rubrik och den andra delen innehåller data (dvs. ett ”bokstavligt” värde).
Alternativen message_set till kommandona nedan är en sträng som anger ett eller flera meddelanden som ska åtgärdas. Det kan vara ett enkelt meddelandenummer ('1'
), ett intervall av meddelandenummer ('2:4'
) eller en grupp av icke sammanhängande intervall separerade med kommatecken ('1:3,6:9'
). Ett intervall kan innehålla en asterisk för att ange en oändlig övre gräns ('3:*'
).
En instans av IMAP4
har följande metoder:
- IMAP4.append(mailbox, flags, date_time, message)¶
Lägg till meddelande i en namngiven brevlåda.
- IMAP4.authenticate(mechanism, authobject)¶
Autentiseringskommando — kräver svarsbehandling.
mechanism anger vilken autentiseringsmekanism som ska användas - den ska finnas i instansvariabeln
capabilities
i formenAUTH=mechanism
.authobject måste vara ett anropsbart objekt:
data = authobject(response)
Den kommer att anropas för att bearbeta serverns fortsättningssvar; argumentet response som den får är
bytes
. Den bör returnerabytes
data som kommer att base64-kodas och skickas till servern. Den ska returneraNone
om klientens avbrottssvar*
ska skickas istället.Ändrad i version 3.5: stränganvändarnamn och lösenord kodas nu till
utf-8
istället för att begränsas till ASCII.
- IMAP4.check()¶
Checkpoint-brevlåda på server.
- IMAP4.close()¶
Stäng aktuell vald brevlåda. Raderade meddelanden tas bort från den skrivbara brevlådan. Detta är det rekommenderade kommandot före
LOGOUT
.
- IMAP4.copy(message_set, new_mailbox)¶
Kopiera message_set meddelanden till slutet av new_mailbox.
- IMAP4.create(mailbox)¶
Skapa en ny brevlåda med namnet brevlåda.
- IMAP4.delete(mailbox)¶
Ta bort en gammal brevlåda med namnet brevlåda.
- IMAP4.deleteacl(mailbox, who)¶
Ta bort de ACL:er (ta bort alla rättigheter) som angetts för vem i brevlådan.
- IMAP4.enable(capability)¶
Aktivera funktion (se RFC 5161). De flesta funktioner behöver inte aktiveras. För närvarande stöds endast
UTF8=ACCEPT
-funktionen (se RFC 6855).
- IMAP4.expunge()¶
Ta bort raderade objekt permanent från vald brevlåda. Genererar ett
EXPUNGE
-svar för varje borttaget meddelande. Returnerade data innehåller en lista över meddelandenumren förEXPUNGE
i den ordning de mottagits.
- IMAP4.fetch(message_set, message_parts)¶
Hämta (delar av) meddelanden. message_parts ska vara en sträng med namn på meddelandedelar inom parentes, t.ex.:
"(UID BODY[TEXT])"
. Data som returneras är tupler av kuvert och data för meddelandedelar.
- IMAP4.getacl(mailbox)¶
Hämta
ACL
för mailbox. Metoden är inte standard, men stöds avCyrus
-servern.
- IMAP4.getannotation(mailbox, entry, attribute)¶
Hämtar angivna
ANNOTATION
för mailbox. Metoden är inte standard, men stöds avCyrus
-servern.
- IMAP4.getquota(root)¶
Hämta
quota
root:s resursanvändning och begränsningar. Den här metoden är en del av IMAP4 QUOTA-tillägget som definieras i rfc2087.
- IMAP4.getquotaroot(mailbox)¶
Hämta listan över
quota
roots
för den namngivna mailbox. Denna metod är en del av IMAP4 QUOTA-tillägget som definieras i rfc2087.
- IMAP4.idle(duration=None)¶
Returnera en
Idler
: en iterabel kontexthanterare som implementerar IMAP4-kommandotIDLE
enligt definitionen i RFC 2177.Det returnerade objektet skickar kommandot
IDLE
när det aktiveras avwith
-satsen, producerar IMAP-svar utan taggar via iterator-protokollet och skickarDONE
när kontexten avslutas.Alla omärkta svar som anländer efter att kommandot
IDLE
har skickats (inklusive de som anländer innan servern bekräftar kommandot) kommer att vara tillgängliga via iteration. Eventuella kvarvarande svar (de som inte har itererats iwith
-kontexten) kan hämtas på vanligt sätt efter attIDLE
har avslutats, medIMAP4.response()
.Svaren representeras som
(typ, [data, ...])
-tupler, enligt beskrivningen i IMAP4 Objects.Argumentet duration anger en maximal tid (i sekunder) för tomgångskörning, varefter alla pågående iterationer stoppas. Det kan vara en
int
ellerfloat
, ellerNone
för ingen tidsgräns. Anropare som vill undvika tidsgränser för inaktivitet på servrar som inför dem bör hålla detta till högst 29 minuter (1740 sekunder). Kräver en socket-anslutning; duration måste varaNone
påIMAP4_stream
-anslutningar.>>> with M.idle(duration=29 * 60) as idler: ... for typ, data in idler: ... print(typ, data) ... EXISTS [b'1'] RECENT [b'1']
- Idler.burst(interval=0.1)¶
Ger en serie svar med högst intervall sekunders mellanrum (uttryckt som en
int
ellerfloat
).Denna generator är ett alternativ till att iterera ett svar i taget och är avsedd att underlätta effektiv batchbearbetning. Den hämtar nästa svar tillsammans med alla omedelbart tillgängliga efterföljande svar. (Till exempel en snabb serie med
EXPUNGE
-svar efter en massradering)Kräver en socket-anslutning; fungerar inte på
IMAP4_stream
-anslutningar.>>> with M.idle() as idler: ... # get a response and any others following by < 0.1 seconds ... batch = list(idler.burst()) ... print(f'processing {len(batch)} responses...') ... print(batch) ... processing 3 responses... [('EXPUNGE', [b'2']), ('EXPUNGE', [b'1']), ('RECENT', [b'0'])]
Tips
IDLE
kontextens maximala varaktighet, som skickas tillIMAP4.idle()
, respekteras när man väntar på det första svaret i en burst. Därför kommer en utgångenIdler
att få denna generator att återvända omedelbart utan att producera något. Anropare bör tänka på detta om de använder den i en loop.
Anteckning
Den iterator som returneras av
IMAP4.idle()
är endast användbar i enwith
-sats. Före eller efter det sammanhanget samlas oönskade svar in internt när ett kommando avslutas och kan hämtas medIMAP4.response()
.Anteckning
Klassnamnet och strukturen för
Idler
är interna gränssnitt som kan komma att ändras. Anropande kod kan förlita sig på att dess kontexthantering, iteration och offentliga metod förblir stabil, men bör inte subklassa, instansiera, jämföra eller på annat sätt direkt referera till klassen.Tillagd i version 3.14.
- IMAP4.list([directory[, pattern]])¶
Lista namn på brevlådor i katalog som matchar mönster. directory är som standard e-postmappen på högsta nivån och pattern är som standard att matcha vad som helst. Returnerade data innehåller en lista med
LIST
-svar.
- IMAP4.login(user, password)¶
Identifiera klienten med hjälp av ett lösenord i klartext. Lösenordet kommer att citeras.
- IMAP4.login_cram_md5(user, password)¶
Tvinga fram användning av
CRAM-MD5
-autentisering när klienten identifieras för att skydda lösenordet. Fungerar endast om servernsCAPABILITY
-svar innehåller frasenAUTH=CRAM-MD5
.
- IMAP4.logout()¶
Stänger av anslutningen till servern. Returnerar serverns
BYE
-svar.Ändrad i version 3.8: Metoden ignorerar inte längre godtyckliga undantag i tysthet.
- IMAP4.lsub(directory='""', pattern='*')¶
Lista namn på prenumererade brevlådor i en katalog som matchar ett mönster. directory är standard för katalogen på högsta nivån och pattern är standard för att matcha alla brevlådor. Returnerade data är tupler av meddelandedel kuvert och data.
- IMAP4.myrights(mailbox)¶
Visa mina ACL:er för en brevlåda (dvs. de rättigheter som jag har för brevlådan).
- IMAP4.noop()¶
Skicka
NOOP
till servern.
- IMAP4.open(host, port, timeout=None)¶
Öppnar socket till port på host. Den valfria parametern timeout anger en timeout i sekunder för anslutningsförsöket. Om timeout inte anges eller är
None
används den globala standardtimeouten för socket. Observera också att om parametern timeout sätts till noll kommer den att ge upphov till ettValueError
för att avvisa skapandet av en icke-blockerande socket. Denna metod anropas implicit avIMAP4
-konstruktören. De anslutningsobjekt som upprättas med den här metoden kommer att användas i metodernaIMAP4.read()
,IMAP4.readline()
,IMAP4.send()
ochIMAP4.shutdown()
. Du kan åsidosätta denna metod.Utlöser en auditing event
imaplib.open
med argumentenself
,host
,port
.Ändrad i version 3.9: Parametern timeout har lagts till.
- IMAP4.partial(message_num, message_part, start, length)¶
Hämtar en avkortad del av ett meddelande. Returnerade data är en tupel av meddelandets delkuvert och data.
- IMAP4.proxyauth(user)¶
Anta autentisering som användare. Tillåter en behörig administratör att använda proxy för att komma åt en användares brevlåda.
- IMAP4.read(size)¶
Läser storlek byte från fjärrservern. Du kan åsidosätta den här metoden.
- IMAP4.readline()¶
Läser en rad från fjärrservern. Du kan åsidosätta den här metoden.
- IMAP4.recent()¶
Frågar servern om en uppdatering. Returnerad data är
None
om inga nya meddelanden, annars värdet avRECENT
svaret.
- IMAP4.rename(oldmailbox, newmailbox)¶
Byt namn på brevlådan oldmailbox till newmailbox.
- IMAP4.response(code)¶
Returnerar data för svaret code om det mottagits, eller
None
. Returnerar den angivna koden, istället för den vanliga typen.
- IMAP4.search(charset, criterion[, ...])¶
Sök efter matchande meddelanden i brevlådan. charset kan vara
None
, i vilket fall ingenCHARSET
kommer att anges i begäran till servern. IMAP-protokollet kräver att minst ett kriterium anges; ett undantag kommer att göras om servern returnerar ett fel. charset måste varaNone
om funktionenUTF8=ACCEPT
aktiverades med kommandotenable()
.Exempel:
# M is a connected IMAP4 instance... typ, msgnums = M.search(None, 'FROM', '"LDJ"') # or: typ, msgnums = M.search(None, '(FROM "LDJ")')
- IMAP4.select(mailbox='INBOX', readonly=False)¶
Välj en brevlåda. Data som returneras är antalet meddelanden i mailbox (svar
EXISTS
). Standardvärdet för brevlåda är'INBOX'
. Om flaggan readonly är inställd är det inte tillåtet att ändra i brevlådan.
- IMAP4.send(data)¶
Skickar
data
till fjärrservern. Du kan åsidosätta den här metoden.Utlöser en auditing event
imaplib.send
med argumentenself
,data
.
- IMAP4.setacl(mailbox, who, what)¶
Ställ in en
ACL
för mailbox. Metoden är inte standard, men stöds avCyrus
-servern.
- IMAP4.setannotation(mailbox, entry, attribute[, ...])¶
Ställ in
ANNOTATION
för brevlåda. Metoden är inte standard, men stöds avCyrus
-servern.
- IMAP4.setquota(root, limits)¶
Ställ in resursbegränsningarna för root
quota
. Denna metod är en del av IMAP4 QUOTA-tillägget som definieras i rfc2087.
- IMAP4.shutdown()¶
Stäng anslutningen som upprättades i
open
. Den här metoden anropas implicit avIMAP4.logout()
. Du kan åsidosätta den här metoden.
- IMAP4.socket()¶
Returnerar den socket-instans som används för att ansluta till servern.
- IMAP4.sort(sort_criteria, charset, search_criterion[, ...])¶
Kommandot
ort
är en variant avsearch
med sorteringssemantik för resultaten. Returnerade data innehåller en mellanslagsseparerad lista över matchande meddelandenummer.Sort har två argument före search_criterion-argumenten: en lista med sort_criteria inom parentes och den sökta charset. Observera att till skillnad från
search
är argumentet charset obligatoriskt. Det finns också ettuid sort
-kommando som motsvararort
på samma sätt somuid search
motsvararsearch
. Kommandotort
söker först igenom brevlådan efter meddelanden som matchar de angivna sökkriterierna med hjälp av argumentet charset för tolkning av strängar i sökkriterierna. Därefter returneras antalet matchande meddelanden.Detta är ett tilläggskommando till
IMAP4rev1
.
- IMAP4.starttls(ssl_context=None)¶
Skicka ett
STARTTLS
-kommando. Argumentet ssl_context är valfritt och bör vara ettssl.SSLContext
-objekt. Detta aktiverar kryptering på IMAP-anslutningen. Läs Överväganden om säkerhet för bästa praxis.Tillagd i version 3.2.
Ändrad i version 3.4: Metoden stöder nu kontroll av värdnamn med
ssl.SSLContext.check_hostname
och Server Name Indication (sessl.HAS_SNI
).
- IMAP4.status(mailbox, names)¶
Begär namngivna statusvillkor för mailbox.
- IMAP4.store(message_set, command, flag_list)¶
Ändrar flaggdispositioner för meddelanden i brevlådan. command anges i avsnitt 6.4.6 i RFC 2060 som ett av ”FLAGS”, ”+FLAGS” eller ”-FLAGS”, eventuellt med suffixet ”.SILENT”.
Till exempel, för att sätta raderingsflaggan på alla meddelanden:
typ, data = M.search(None, 'ALL') for num in data[0].split(): M.store(num, '+FLAGS', '\\Deleted') M.expunge()
Anteckning
Att skapa flaggor som innehåller ’]’ (till exempel: ”[test]”) bryter mot RFC 3501 (IMAP-protokollet). Imaplib har dock historiskt tillåtit skapandet av sådana taggar, och populära IMAP-servrar, som Gmail, accepterar och producerar sådana flaggor. Det finns icke-Python-program som också skapar sådana taggar. Även om det är en RFC-överträdelse och IMAP-klienter och -servrar ska vara strikta, fortsätter imaplib fortfarande att tillåta att sådana taggar skapas av bakåtkompatibilitetsskäl, och från och med Python 3.6 hanteras de om de skickas från servern, eftersom detta förbättrar kompatibiliteten i verkligheten.
- IMAP4.subscribe(mailbox)¶
Prenumerera på ny brevlåda.
- IMAP4.thread(threading_algorithm, charset, search_criterion[, ...])¶
Kommandot
thread
är en variant avsearch
med trådningssemantik för resultaten. Data som returneras innehåller en mellanslagsseparerad lista över trådmedlemmar.Trådmedlemmar består av noll eller flera meddelandenummer, avgränsade av mellanslag, som anger successiv förälder och barn.
Thread har två argument före search_criterion-argumenten: en threading_algoritm och den sökta charset. Observera att till skillnad från
search
är argumentet charset obligatoriskt. Det finns också ettuid thread
-kommando som motsvararthread
på samma sätt somuid search
motsvararsearch
. Kommandotthread
söker först igenom brevlådan efter meddelanden som matchar de angivna sökkriterierna med hjälp av argumentet charset för tolkning av strängar i sökkriterierna. Därefter returneras de matchande meddelandena trådade enligt den angivna trådningsalgoritmen.Detta är ett tilläggskommando till
IMAP4rev1
.
- IMAP4.uid(command, arg[, ...])¶
Utför kommandot med meddelanden som identifieras med UID i stället för meddelandenummer. Returnerar svar som är lämpligt för kommandot. Minst ett argument måste anges; om inget anges kommer servern att returnera ett fel och ett undantag kommer att tas upp.
- IMAP4.unsubscribe(mailbox)¶
Avregistrera dig från gammal brevlåda.
- IMAP4.unselect()¶
imaplib.IMAP4.unselect()
frigör serverns resurser som är associerade med den valda brevlådan och återställer servern till det autentiserade tillståndet. Det här kommandot utför samma åtgärder somimaplib.IMAP4.close()
, förutom att inga meddelanden tas bort permanent från den valda brevlådan.Tillagd i version 3.9.
- IMAP4.xatom(name[, ...])¶
Tillåt enkla tilläggskommandon som meddelas av servern i
CAPABILITY
-svaret.
Följande attribut är definierade för instanser av IMAP4
:
- IMAP4.PROTOCOL_VERSION¶
Det senaste protokoll som stöds i svaret
CAPABILITY
från servern.
- IMAP4.debug¶
Heltalsvärde för att styra felsökningsutmatningen. Initialiseringsvärdet hämtas från modulvariabeln
Debug
. Värden större än tre spårar varje kommando.
IMAP4-exempel¶
Här är ett minimalt exempel (utan felkontroll) som öppnar en brevlåda och hämtar och skriver ut alla meddelanden:
import getpass, imaplib
M = imaplib.IMAP4(host='example.org')
M.login(getpass.getuser(), getpass.getpass())
M.select()
typ, data = M.search(None, 'ALL')
for num in data[0].split():
typ, data = M.fetch(num, '(RFC822)')
print('Message %s\n%s\n' % (num, data[0][1]))
M.close()
M.logout()