IMAP API w Pythonimapalib, IMAPClient i OAuth XOAUTH2 - przewodnik
Kompletny przewodnik po tworzeniu klientów poczty e-mail w Pythonie z wykorzystaniem IMAP w 2026 roku: od podstaw modułu `imaplib` ze standardowej biblioteki, przez wzorce produkcyjne z IMAPClient, uwierzytelnianie OAuth XOAUTH2 dla Gmaila i Outlooka, aż po sytuacje, gdy ujednolicony interfejs API poczty e-mail ratuje Cię przed całym tym skomplikowaniem.
import imaplib, email
z nagłówek wątku import decode_header
# – Połącz się za pomocą OAuth XOAUTH2
poczta = imaplib.IMAP4_SSL('imap.gmail.com')
auth_str = konstruuj_xoauth2(użytkownik, token)
poczta.uwierzytelnij('XOAUTH2', lambda x: auth_str)
# Pobierz nieprzeczytane wiadomości
poczta.wybierz('SKRZYNKA')
_, identyfikatory = poczta.wyszukiwanie(Żaden, 'NIEWIDZIANY')
dla identyfikator użytkownika w identyfikatory0].podzielić():
_, dane = poczta.fetch(uid, '(RFC822)')
wiadomość = e-mail.wiadomość_z_bajtów(dane[0][1])Co to jest klient IMAP w Pythonie?
An IMAP API Python klient to dowolny program w języku Python, który komunikuje się z serwerem poczty przy użyciu protokołu IMAP4 (RFC 3501) w celu odczytu, wyszukiwania, organizowania i synchronizacji wiadomości e-mail. W przeciwieństwie do SMTP, który jedynie wysyła pocztę, IMAP zapewnia aplikacji dwukierunkowy dostęp do zdalnej skrzynki pocztowej: można pobierać nagłówki, odczytywać treść, ustawiać flagi, przenosić wiadomości między folderami oraz nasłuchiwać na nowe wiadomości w czasie rzeczywistym przy użyciu funkcji IMAP IDLE.
IMAP (Protokół dostępu do wiadomości internetowych) to standardowy protokół, który umożliwia pobieranie i zarządzanie wiadomościami e-mail przechowywanymi na serwerze zdalnym. Klient IMAP w języku Python łączy się przez port TLS 993, uwierzytelnia się (Basic lub OAuth XOAUTH2), a następnie wydaje polecenia IMAP, aby pobierać, wyszukiwać, oznaczać i organizować wiadomości. Python oferuje trzy poziomy abstrakcji: bibliotekę standardową imaplib, wyższego poziomu IMAPClient opakowanie, a także w pełni asynchroniczne opcje takie jak aioimaplib. Pełny przegląd architektury i przypadków użycia IMAP można znaleźć w naszym Przewodnik deweloperski API IMAP.
Synchronizuj skrzynki pocztowe użytkowników z Twoim CRM, ATS lub helpdeskiem. Python IMAP pozwala na pobieranie lub przesyłanie (IDLE) nowych wiadomości do Twojej bazy danych bez konieczności zarządzania pełnym serwerem poczty.
Wyodrębnij, klasyfikuj i kieruj przychodzące wiadomości e-mail za pomocą Pythona. Twój klient IMAP zasila kolejkę przetwarzania: parsowanie faktur, tworzenie zgłoszeń, punktacja potencjalnych klientów lub podsumowanie LLM.
Testowanie dostarczalności wiadomości e-mail, tworzenie narzędzi do osiągnięcia skrzynki odbiorczej zero lub audytowanie dostarczalności. Python IMAP zapewnia programowy dostęp do tej samej skrzynki pocztowej, którą widzą Twoi użytkownicy. Sprawdź nasze Przewodnik po API poczty e-mail dla całego ekosystemu.
3 opcje stosu IMAP w Pythonie
Wybór odpowiedniej biblioteki IMAP w Pythonie zależy od Twojego przypadku użycia: szybkiego skryptu, usługi produkcyjnej lub potoku asynchronicznego. Oto porównanie głównych opcji przed zanurzeniem się w przykłady kodu dla każdej z nich.
| Biblioteka | Typ | Obsługa OAuth | Asynchroniczne | Pomocnicy parsowania | Najlepsze dla |
|---|---|---|---|---|---|
| imaplib | Stdlib (bez zależności) | Podręcznik | Nie | Minimalny | Proste skrypty, bez zależności zewnętrznych |
| IMAPClient | Zewnętrzny program opakowujący | Podręcznik | Nie | Dobrze | Produkcja IMAP bez funkcji asynchronicznych |
| aioimaplib | Biblioteka asynchroniczna | Podręcznik | Tak | Ograniczony | potoki asyncio i IDLE na dużą skalę |
| Unipile APINajlepszy | Zunifikowany REST/SDK | Wbudowany | Tak | Pełny | Produkcja wielodostawcowa na dużą skalę |
Pomiń złożoność IMAP. Unipile abstrahuje imaplib, OAuth i logikę wielu dostawców w pojedynczy interfejs API REST. Jedna integracja dla Gmaila, Outlooka i dowolnego serwera IMAP.
Zacznij budować za darmoSzybki start: Łączenie z IMAP za pomocą imaplib
Standardowa biblioteka Pythona zawiera imaplib - nie wymaga instalacji. Oto kompletny przewodnik od połączenia do pobrania treści, z uczciwym komentarzem na temat jego trudnych punktów.
Użycie imaplib.IMAP4_SSL na porcie 993 dla zaszyfrowanego połączenia. W przypadku Gmaila i Outlooka adresy serwerów znajdziesz w naszym Przewodnik po połączeniu z serwerem IMAP. Podstawowe uwierzytelnianie (hasło) działa dla serwerów IMAP, które nadal na to pozwalają – ale Gmail i Outlook wymagają teraz OAuth XOAUTH2 (omówione w sekcji 5).
import imaplib
# – Połącz się z Gmailem przez IMAP (port TLS 993)
poczta = imaplib.IMAP4_SSL('imap.gmail.com', 993)
# – uwierzytelnianie podstawowe (tylko hasło aplikacji – zalecane jest OAuth)
poczta.zaloguj('user@gmail.com', 'hasło-aplikacji')
# Wyświetl wszystkie skrzynki pocztowe
status, skrzynki pocztowe = poczta.list()
dla pudełko w skrzynki pocztowe
print(pudełko.dekoduj('utf-8'))
poczta.wyloguj()The select() wywołanie otwiera skrzynkę pocztową i zwraca liczbę wiadomości. szukaj() zwraca ciąg bajtów rozdzielony spacjami identyfikatorów wiadomości - nie UID. Musisz ręcznie zdekodować i podzielić.
# Wybierz skrzynkę odbiorczą (lub dowolny folder)
status, liczba = poczta.wybierz('SKRZYNKA')
print(Wiadomości: {count[0].decode()}')
# Wyszukaj niewyświetlone wiadomości
status, msg_ids = poczta.wyszukiwanie(Żaden, 'NIEWIDZIANY')
id = msg_ids[0].podzielić()
print(Nieprzeczytane: {len(ids)}')
# Wyszukiwanie według nadawcy
_, z_id = poczta.wyszukiwanie(Żaden, 'OD', 'boss@company.com')
# Wyszukiwanie według przedziału czasowego
_, ostatnio = poczta.wyszukiwanie(Żaden, 'OD', '01-sty-2026')To tutaj imaplib brudzi się. Surowa odpowiedź to lista krotek zawierających bajty. Musisz indeksować dane[0][1] aby odwołać się do surowej wiadomości, a następnie przekazać ją do e-mail moduł do parsowania. Nagłówki są kodowane zgodnie z RFC 2047 i wymagają decode_header().
import e-mail
z nagłówek wątku import decode_header
def dekoduj_str(wartość):
"Dekompresuj wartość nagłówka zakodowaną zgodnie z RFC 2047."
części = decode_headerwartość
odszyfrowany = []
dla część, enc w części
jeśli isinstanceczęść, bajty):
odkodowane.dołączyćczęść.dekoduj(szyfr) lub 'utf-8', błędy='wymienić'))
inaczej:
odkodowane.dołączyćczęść
return ' '.połącz(odszyfrowane)
dla identyfikator użytkownika w ids[5:]: # – ostatnie 5 wiadomości
_, dane = poczta.fetch(uid, '(RFC822)')
surowy = data[0][1] Kłopoty z rozpakowywaniem krotek #
wiadomość = e-mail.wiadomość_z_bajtów(surowe)
podmiot = dekoduj_str(komunikat['Temat'] lub '')
nadawca = dekoduj_str(komunikat['Z'] lub '')
Elementy MIME # Walk dla treści w postaci zwykłego tekstu
jeśli wiadomość.jest_wieloczęściowy():
dla część w wiadomość.chodź():
jeśli Część.pobierz_typ_zawartości() == 'tekst/zwykły':
ciało = Część.pobierz_ładunek(dekoduj=Prawda).dekoduj('utf-8', błędy='wymienić')
print(Od: {sender} | Temat: {subject}')Problemy z imaplib: surowe odpowiedzi bajtowe wymagają starannego indeksowania krotekdane[0][1]), nagłówki są zakodowane w RFC 2047 i wymagają decode_header(), wieloczęściowe ciała MIME wymagają pełnego spacer, a nie ma wbudowanych pomocników dla UID kontra numery sekwencyjne. W przypadku obciążeń produkcyjnych rozważ IMAPClient (Sekcja 4) lub ujednolicony interfejs IMAP zamiast tego.
Dalsze kroki: IMAPClient do użytku produkcyjnego
Gdy przejdziesz do produkcji z imaplib, szybko zauważysz jego kruche parsowanie odpowiedzi, niespójne zarządzanie UID i brak pomocników dla typowych zadań. IMAPClient to pythonowy wrapper, który wygładza te niedoskonałości, pozostając jednocześnie blisko specyfikacji IMAP.
dane[0][1]uid() opakowanie ręcznieuse_uid=Prawda)szukaj(), pobierz(), ruszaj(), kopiuj() APIbezczynność() / idle_check()z imapclient import IMAPClient
import wydrukuj
# Łącze z IMAPClient (domyślnie use_uid=True)
serwer = IMAPClient('imap.gmail.com', ssl=Prawda, use_uid=Prawda)
serwer.zaloguj('user@gmail.com', 'hasło-aplikacji')
# Wybierz i wyszukaj
serwer.wybierz_folder('SKRZYNKA')
wiadomości = serwer.wyszukiwanie(['NIEWIDZIANY'])
print({len(messages)} nieprzeczytanych wiadomości')
# Fetch – zwraca uporządkowany słownik, a nie surowe bajty
response = serwer.fetch(wiadomości[:10], ['KOPERTA', 'BIAŁKO[]', 'FLAGI'])
dla uid, data w odzew.Przedmioty():
koperta = data[KOPERTA']
print(UID {uid}: {envelope.subject}')
# Przenieś wiadomości do folderu
serwer.poruszyć(wiadomości[:5], 'Archiwum')
# IDLE – oczekiwanie na nowe wiadomości (do 29 minut w serwisie Gmail)
serwer.bezczynny()
odpowiedzi = serwer.sprawdzanie_bezczynności(limit czasu=60)
print('ODPOWIEDŹ BEZCZYNNA:', odpowiedzi)
serwer.zakończono_bezczynność()
serwer.wyloguj()Nawet IMAPClient wymaga ręcznego zarządzania tokenami OAuth i obsługi wielu dostawców. Unipile abstrahuje wszystko to - odświeżanie OAuth, specyficzne dla dostawców rozwiązania, ponowne połączenia po bezczynności - za pojedynczym interfejsem API REST. Zobacz nasze pełne Przewodnik po API poczty e-mail.
Zbuduj to z UnipileOAuth XOAUTH2 w Pythonie: Gmail i Microsoft 365
Podstawowe uwierzytelnianie hasłem jest przestarzałe u głównych dostawców. Gmail zablokował je dla standardowych kont od maja 2022 r. Microsoft 365 wycofał Basic Auth dla IMAP we wrześniu 2024 r. XOAUTH2 (mechanizm SASL OAuth 2.0) jest teraz jedynym produkcyjnym sposobem uwierzytelniania klienta IMAP w Pythonie. Pełne wyjaśnienie przepływu OAuth znajduje się w naszym Przewodnik po OAuth dla interfejsu API poczty e-mail.
XOAUTH2 to mechanizm uwierzytelniania SASL, który koduje token uwierzytelniający OAuth w ciąg znaków zakodowany w formacie base64 w formacie: email\x01auth=Bearer {token}\x01\x01. Ten ciąg jest przekazywany do imaplib.IMAP4_SSL.authenticate('XOAUTH2', callback). Funkcja zwrotna zwraca ciąg znaków zakodowany w formacie Base64. Użytkownik jest odpowiedzialny za uzyskanie i odświeżenie tokenu dostępu OAuth za pośrednictwem punktów końcowych tożsamości Google lub Microsoft przed nawiązaniem połączenia IMAP. Informacje na temat wymaganych zakresów uprawnień dla Gmaila można znaleźć w naszym Przewodnik po zakresach Gmail API.
import imaplib, base64, json
z google.oauth2.credentials import Poświadczenia
z google.auth.transport.requests import Prośba
def build_xoauth2_string(adres_email_użytkownika, token_dostępu):
"Zbuduj ciąg SASL XOAUTH2 do uwierzytelniania IMAP."
ciąg_autoryzacyjny = f'user={user_email}\x01auth=Bearer {access_token}\x01\x01'
return base64.b64encode(auth_string.koduj('ascii'))
def get_valid_token(słownik_poświadczeń):
"Odśwież token, jeśli wygasł, używając biblioteki google-auth."
poświadczenia = Poświadczenia.z_informacji_autoryzowanego_użytkownika(słownik_danych_uwierzytelniających)
jeśli dane uwierzytelniające.po terminie oraz creds.refresh_token:
dane uwierzytelniające.odśwież(Prośba())
return token_dostępowy
Wymagany zakres IMAP dla konta Gmail: https://mail.google.com/
adres_email_użytkownika = 'user@gmail.com'
token_dostępu = get_valid_token(słownik_danych_uwierzytelniających)
poczta = imaplib.IMAP4_SSL('imap.gmail.com')
ciąg_autoryzacyjny = build_xoauth2_string(email_użytkownika, token_dostępu)
poczta.uwierzytelnij('XOAUTH2', lambda x: auth_string)
# Teraz używaj jak zwykle
poczta.wybierz('SKRZYNKA')
_, identyfikatory = poczta.wyszukiwanie(Żaden, 'WSZYSTKO')
print(Całkowita liczba wiadomości: {len(ids[0].split())}')https://mail.google.com/ zakres (nie gmail.tylko_do_odczytu sam - ten zakres nie zapewnia dostępu do IMAP). Zobacz naszą Przewodnik po zakresach Gmail API aby uzyskać pełny opis. Musisz również włączyć IMAP w ustawieniach Gmail i użyć identyfikatora klienta Google Cloud OAuth 2.0 z poprawnym adresem URI przekierowania.
import imaplib, base64
import msal
def build_xoauth2_string(adres_email_użytkownika, token_dostępu):
ciąg_autoryzacyjny = f'user={user_email}\x01auth=Bearer {access_token}\x01\x01'
return base64.b64encode(auth_string.koduj('ascii'))
# MSAL – biblioteka uwierzytelniania Microsoftu dla języka Python
CLIENT_ID = 'id-klienta-aplikacji-azure'
IDENTYFIKATOR_NAJEMCY = 'twoj-identyfikator-najemcy'
Zakres # dla dostępu IMAP (Outlook / Microsoft 365)
ZAKRES = ['https://outlook.office365.com/IMAP.AccessAsUser.All']
aplikacja = msal.PublicClientApplication(IDENTYFIKATOR_KLIENTA, autorytet=https://login.microsoftonline.com/{TENANT_ID}')
# Pobierz token (interaktywnie lub za pomocą tokenu odświeżającego)
wynik = aplikacja.pobierz_token_przez_kod_autoryzacyjny(kod, zakresy=ZAKRES, przekierowanie_uri=przekierowanie_uri)
token_dostępu = wynik['token dostępu']
# – Połącz się z kontem IMAP w programie Outlook przy użyciu protokołu XOAUTH2
adres_email_użytkownika = 'user@outlook.com'
poczta = imaplib.IMAP4_SSL('outlook.office365.com')
ciąg_autoryzacyjny = build_xoauth2_string(email_użytkownika, token_dostępu)
poczta.uwierzytelnij('XOAUTH2', lambda x: auth_string)
poczta.wybierz('SKRZYNKA')OAuth XOAUTH2 to ponad 50 linii na dostawcę. Unipile obsługuje odświeżanie tokenów, uzgadnianie XOAUTH2 i specyficzne dla dostawcy detale, dzięki czemu kod Pythona koncentruje się na logice biznesowej, a nie na okablowaniu uwierzytelniania.
Zbuduj swój przepływ OAuthWeryfikacja rzeczywistości wielodostawcy
Każdy dostawca ma swoje własne dziwactwa uwierzytelniania, adresy serwerów i limity zapytań. Oto co Twój klient IMAP w Pythonie musi obsłużyć dla każdego z nich. W sprawie nazw hostów serwerów i szczegółów portu TLS, zapoznaj się z naszym dedykowanym Przewodnik po połączeniu z serwerem IMAP.
https://mail.google.com/IMAP.AccessAsUser.AllObsługa wielu dostawców oznacza utrzymywanie oddzielnych przepływów uwierzytelniania, konfiguracji serwera i obejść specyficznych dla poszczególnych dostawców. Unipile normalizuje Gmail, Outlook i każdy serwer IMAP do jednego API. Przeczytaj nasz porównanie dostawców API e-mail dla kontekstu.
Zbuduj wielodostawcowy adres e-mailKiedy warto całkowicie zrezygnować z protokołu IMAP: podejście oparte na ujednoliconym interfejsie API
Po przejściu przez imaplib, IMAPClient i XOAUTH2, jedna prawda staje się jasna: surowy IMAP w Pythonie wymaga setek linii kodu powtarzalnego dla każdego obsługiwanego dostawcy. Unipile to ujednolicony interfejs IMAP które abstrahuje to wszystko do jednego interfejsu REST. Łączysz konta użytkowników (Gmail, Outlook lub dowolny serwer IMAP) za pomocą OAuth, a Unipile obsługuje za Ciebie wszystkie szczegóły protokołu.
# 1. Uzyskaj token OAuth (ponad 50 wierszy)
# 2. Utwórz ciąg znaków XOAUTH2
# 3. Połącz się i uwierzytelnij
# 4. Wybierz folder
# 5. Wyszukiwanie wiadomości
# 6. Pobierz surowe bajty
# 7. Przetworzenie danych krotki [0][1]
# 8. Dekodowanie nagłówków RFC 2047
# 9. Przejście przez sekcję MIME
# 10. Uchwyty do mocowania
# 11. Zarządzanie limitami czasu bezczynności
# 12. Ponowne połączenie w przypadku błędu
# 13. Powtórz tę czynność dla programu Outlook...
# 14. Powtórz tę czynność dla serwerów IMAP...import żądania
# Pobierz wiadomości e-mail z dowolnego połączonego konta
r = żądania.uzyskać(
'https://api6.unipile.com/api/v1/emails',
nagłówki={'Klucz API X': klucz_api},
parametry={'id_konta': identyfikator_konta}
)
e-maile = r.json()['elementy']
# działa z Gmailem, Outlookiem i dowolnym serwerem IMAPUnipile zarządza pozyskiwaniem, odświeżaniem i wygasaniem tokenów XOAUTH2 dla Gmail i Outlook. Nie jest potrzebna konfiguracja MSAL ani google-auth w twoim kodzie.
Bez surowych bajtów, bez rozpakowywania krotek, bez dekodowania RFC 2047. Każdy e-mail zwracany jest jako czysty, ustrukturyzowany JSON z przetworzonymi nagłówkami, treścią i załącznikami.
Zamiast zarządzać sesjami IDLE i ponownymi połączeniami, Unipile wysyła nowe zdarzenia e-mail do Twojego punktu końcowego webhook. Bez odpytywania, bez zarządzania gniazdami.
Jeden punkt końcowy API obsługuje Gmail, Outlook i dowolny serwer IMAP. Dodaj nowych dostawców, łącząc konta — nie są wymagane żadne zmiany kodu po Twojej stronie.
Unipile obejmuje pełny cykl życia poczty e-mail. Czytaj, wyszukuj, przenoś, oznaczaj i wysyłaj – wszystko z poziomu tego samego API. Zobacz nasz Poradnik wysyłania e-maili w Pythonie ze strony wysyłającej.
Każdy z Twoich użytkowników łączy swoje własne konto za pośrednictwem OAuth. Unipile działa jako niezależny pośrednik techniczny w imieniu każdego uwierzytelnionego użytkownika - nie jest to współdzielona pula danych uwierzytelniających.
Typowe pułapki produkcyjne
Po uzyskaniu działającego lokalnie klienta IMAP w Pythonie, produkcja ujawnia przypadki brzegowe, które mogą powodować utratę danych bez powiadomienia, zerwanie połączenia lub uszkodzenie kodowania znaków. Oto najczęstsze problemy i sposoby ich rozwiązania.
Microsoft zakończył usuwanie podstawowego uwierzytelniania dla IMAP we wszystkich dzierżawach Microsoft 365 w Wrzesień 2024. Dowolny kod w języku Python używający mail.login(użytkownik, hasło) przeciwko outlook.office365.com otrzymacie teraz UWWIERZYTELNIANIE nie powiodło się. Migracja do XOAUTH2 (Sekcja 5) jest obowiązkowa dla wszystkich integracji Microsoft 365 / Outlook IMAP. Wdrożenia Exchange on-premises mogą nadal obsługiwać uwierzytelnianie podstawowe w zależności od konfiguracji serwera.
Gmail cicho kończy połączenia IDLE po około 29 minutach. Jeśli Twój kod nie odnowi sesji IDLE, nowe wiadomości przestaną przychodzić bez zgłoszenia żadnego wyjątku.
gotowe_bezczynnie() co 25 minut, a następnie natychmiast zadzwoń bezczynność() jeszcze raz. Użyj wybierz_folder('SKRZYNKA_ODBIORCZA',readonly=False) ponownie sprawdzić liczbę wiadomości po ponownym połączeniu.Nagłówki wiadomości e-mail, takie jak Subject i From, używają kodowania RFC 2047 (=?UTF-8?B?...?=). Wywoływanie str(msg['Temat']) bezpośrednio na wartości bajtowej zwraca śmieci lub powoduje błąd Błąd dekodowania Unicode.
email.header.decode_header() i obsługuj kodowanie każdej części jawnie. Przekaż błędy='zastąp' do .decode() aby uniknąć awarii spowodowanych błędnie utworzonymi nagłówkami.Załączniki znajdują się w zagnieżdżonych częściach MIME. Wywołanie get_payload() wieloczęściowej wiadomości zwraca listę części, a nie zawartość. Obrazy wbudowane są Content-Disposition: inline i mieć Identyfikator treści.
msg.przejdź(), sprawdź pobierz_nagłówek dla załącznik, i zadzwoń pobierz_ładunek(dekoduj=Prawda) załączonych części do pobrania zdekodowanych bajtów.imaplib.IMAP4_SSL instancje NIE są bezpieczne wątkowo. Używanie jednego połączenia między wieloma wątkami powoduje zniekształcone odpowiedzi. Tworzenie nowego połączenia na każde żądanie jest kosztowne i objęte limitami.
aioimaplib. Zawsze implementuj wykładnicze wycofywanie się przy próbach ponownego połączenia po IMAP4.przerwij wyjątki.Gmail ogranicza jednoczesne połączenia IMAP do 15 na konto i egzekwuje limity przepustowości (2500 MB dziennie przez IMAP). Pobieranie całych treści RFC822 na dużą skalę szybko wyczerpie te limity.
RFC822.NAGŁÓWEK), a następnie pobieraj ciała wybiórczo. Użyj BODY.PEEK[] zamiast RFC822 aby uniknąć automatycznego oznaczenia jako przeczytane. Zaimplementuj wykładnicze wycofywanie się na [PRZEKRÓCZONO LIMIT] odpowiedzi.Tokeny dostępu z Google i Microsoftu wygasają po 3600 sekundach (1 godzinie). Jeśli Twoja sesja IMAP jest nadal otwarta po wygaśnięciu tokenu, następne polecenie po wygaśnięciu zakończy się cicho błędem lub zwróci NIE.
wygasa o timestamp. Przed każdą operacją wsadową sprawdź, czy token wygasa w ciągu 5 minut i odśwież go proaktywnie. Bezpiecznie przechowuj tokeny odświeżania. Dokładnie tak Unipile obsługuje automatycznie.Uniknięcie wszystkich 6 pułapek wymaga znacznej infrastruktury. Unipile obsługuje ponowne nawiązywanie połączeń w stanie bezczynności, odświeżanie tokenów, ograniczanie liczby żądań i normalizację wielu dostawców - dzięki czemu możesz skupić się na logice swojego produktu. Część naszego pełnego Przewodnik po API poczty e-mail.
Buduj bez pułapekCzęsto zadawane pytania
Często zadawane pytania dotyczące klientów IMAP w Pythonie, biblioteki imaplib, IMAPClient, uwierzytelniania XOAUTH2 oraz kiedy zamiast tego użyć ujednoliconego API poczty e-mail.
imap.gmail.com na porcie 993 używając imaplib.IMAP4_SSL. Jednakże Gmail nie akceptuje już logowania za pomocą nazwy użytkownika i hasła dla aplikacji innych firm. Musisz użyć OAuth XOAUTH2 uwierzytelnianie za pomocą tokena dostępu uzyskanego od Google przy użyciu https://mail.google.com/ zakres. Zobacz nasz Przewodnik po zakresach Gmail API pełny zakres wyjaśnienia. Hasła aplikacji nadal działają dla kont osobistych z włączonym uwierzytelnianiem dwuskładnikowym, ale OAuth jest wymagany dla aplikacji.email\x01auth=Bearer {token}\x01\x01 w base64, a następnie przekazać go do imaplib.IMAP4_SSL.authenticate('XOAUTH2', callback). Rozwiązanie to zastępuje niezalecane logowanie Basic Auth dla Gmail i Microsoft 365. Pełne przykłady implementacji znajdują się w sekcji 5 tego przewodnika. Zobacz również nasz Przewodnik po OAuth dla interfejsu API poczty e-mail.base64(f'user={email}\x01auth=Bearer {token}\x01\x01'). 3) Zadzwoń mail.authenticate('XOAUTH2', lambda x: auth_string). Dla Gmaila użyj Google-Uwierzytelnianie biblioteka do zarządzania odświeżaniem tokenów. Dla Outlook/Microsoft 365, użyj msal Biblioteka Pythona. Obie wymagają zarejestrowania aplikacji OAuth w Google Cloud Console lub Azure AD. Pełny kod OAuth IMAP w Pythonie znajduje się w sekcji 5 powyżej.szukaj()/pobierz()/ruszaj() metody i obejmuje wbudowaną obsługę IDLE. Oba wymagają samodzielnego zarządzania tokenami OAuth. Żaden nie jest asynchroniczny – dla potoków opartych na asyncio, rozważ aioimaplib. Zainstaluj IMAPClient z pip zainstaluj imapclient.outlook.office365.com na porcie 993 używając imaplib.IMAP4_SSL. Od września 2024 r. uwierzytelnianie podstawowe jest wyłączone dla Microsoft 365 – musisz używać XOAUTH2. Zarejestruj aplikację Azure AD, zażądaj IMAP.AccessAsUser.All pozwolenie, uzyskaj token dostępu za pomocą msal Biblioteka Pythona, a następnie uwierzytelnij się za pomocą mail.authenticate('XOAUTH2', ...). Dla osobistych kont Outlook.com obowiązuje ten sam przepływ OAuth. Informacje o serwerze i konfiguracji TLS można znaleźć w naszej Przewodnik po połączeniu z serwerem IMAP.outlook.office365.com:993. Jednak od września 2024 r. firmy Microsoft w pełni wyłączyły podstawowe uwierzytelnianie dla protokołu IMAP w dzierżawach Microsoft 365. Należy używać protokołu OAuth 2.0 z mechanizmem SASL XOAUTH2. Administrator Azure AD może również potrzebować włączyć dostęp IMAP w centrum administracyjnym programu Exchange. Alternatywnym rozwiązaniem jest użycie Microsoft Graph API (REST) który całkowicie omija IMAP i zapewnia bogatsze metadane.server.bezczynne() aby wejść w tryb IDLE, a następnie server.idle_check(timeout=60) czekać na zdarzenia. Gmail rozłącza się po około 29 minutach, więc musisz odnowić: zadzwoń server.idle_done() co 25 minut, potem server.bezczynne() ponownie. Z surowym imaplib, IDLE wymaga ręcznego zarządzania na poziomie gniazda – znacznie bardziej złożonego. W przypadku produkcyjnych e-maili w czasie rzeczywistym, podejście oparte na webhookach (takie jak zapewnia Unipile) jest bardziej niezawodne niż utrzymywanie sesji IDLE.aioimaplib biblioteka zapewnia kompatybilny z asyncio klient IMAP4 dla Pythona. Obsługuje standardowe polecenia IMAP i IDLE w kontekście asynchronicznym, dzięki czemu nadaje się do potoków o wysokiej współbieżności, gdzie zarządzasz wieloma skrzynkami pocztowymi jednocześnie. Jednakże, aioimaplib ma mniejszą społeczność niż imaplib lub IMAPClient, a obsługa OAuth nadal wymaga ręcznej implementacji XOAUTH2. Dla zespołów, które przedkładają szybkość rozwoju nad szczegółową kontrolę, zunifikowany interfejs API oparty na REST zapewnia pocztę elektroniczną w czasie rzeczywistym za pośrednictwem webhooków, bez zarządzania asynchronicznymi gniazdami.