IMAP API w Pythonie: imaplib, IMAPClient, XOAUTH2 OAuth Przewodnik (2026)

IMAP API Python Przewodnik

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.

imap_client.py
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])
Pobieranie e-maili z Gmail, Outlook, IMAP...
Definicja

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.

Szybka definicja

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.

Synchronizacja poczty e-mail dla SaaS

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.

Automatyzacja i potoki AI

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.

Narzędzia deweloperskie

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.

Porównanie bibliotek

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ę
imaplib — Stdlib
OAuth:Ustawienia ręczne
Asynchronicznie:Nie
Parsowanie:Minimalny
Najlepsze dla:Proste skrypty, zerowe zależności
IMAPClient — Opakowanie
OAuth:Ustawienia ręczne
Asynchronicznie:Nie
Parsowanie:Dobre pomocniki
Najlepsze dla:Produkcja IMAP, bez asynchroniczności
aioimaplib — Asynchronicznie
OAuth:Ustawienia ręczne
Asynchronicznie:Tak (asyncio)
Parsowanie:Ograniczony
Najlepsze dla:potoki asyncio, stan bezczynności na dużą skalę
Unipile APINajlepszy
OAuth:Wbudowany
Asynchronicznie:Tak
Parsowanie:Pełny strukturalny JSON
Najlepsze dla: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 darmo
Samouczek kodu

Szybki 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.

1
Połącz i uwierzytelnij

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

connect.py
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()
2
Wybierz folder i wyszukaj wiadomości

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ć.

search.py
# 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')
3
Pobierz nagłówki i przeanalizuj treść

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

fetch_body.py
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.

Biblioteka Produkcyjna

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.

Dlaczego imaplib psuje się na produkcji
Odpowiedzi to surowe krotki bajtów — kruche indeksowanie krotek dane[0][1]
Domyślnie nie pobieraj na podstawie UID (użyj uid() opakowanie ręcznie
Brak wbudowanych pomocników do parsowania MIME lub wyodrębniania treści
IDLE wymaga ręcznego zarządzania gniazdami
Twoim problemem jest dekodowanie nagłówków RFC 2047
Co daje IMAPClient
Strukturalne odpowiedzi słownikowe – nie jest wymagane rozpakowywanie krotek
Tryb UID domyślnie (use_uid=Prawda)
Sprzątaczka szukaj(), pobierz(), ruszaj(), kopiuj() API
Wbudowane wsparcie dla IDLE z bezczynność() / idle_check()
Działa z każdym serwerem IMAP – Gmail, Outlook, niestandardowy serwer IMAP
imapclient_przykład.py
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 Unipile
OAuth XOAUTH2

OAuth 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.

Jak działa XOAUTH2

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.

Gmail Gmail
Perspektywy Microsoft 365
gmail_xoauth2.py
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())}')
Zakres Gmail Token dostępu musi być uzyskany z 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.
outlook_xoauth2.py
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')
Microsoft 365 IMAP uwaga: Od września 2024 r. firma Microsoft wyłączyła uwierzytelnianie podstawowe dla IMAP we wszystkich dzierżawach Microsoft 365. Należy użyć XOAUTH2. Zarejestruj aplikację Azure AD, włącz uprawnienie "IMAP.AccessAsUser.All" i użyj MSAL do uzyskania tokenu. Alternatywne rozwiązanie do IMAP, jakim jest Microsoft Graph, można znaleźć w naszej Przewodnik po poczcie e-mail OAuth w Microsoft Graph.

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 OAuth
Dostawca Macierzy

Weryfikacja 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.

Logo Gmail
Gmail
imap.gmail.com:993
Autoryzacja:XOAUTH2 wymagane
Zakreshttps://mail.google.com/
BEZ CZYNNOŚCI:Obsługiwane (29 minut max)
Dziwactwa:Etykiety Gmail odpowiadają folderom IMAP. Włącz IMAP w ustawieniach.
Wymaga projektu Google Cloud z klientem OAuth 2.0. Zobacz Przewodnik po zakresach Gmail szczegóły zakresu.
Logo Outlook
Outlook / Microsoft 365
outlook.office365.com:993
Autoryzacja:XOAUTH2 wymagane
ZakresIMAP.AccessAsUser.All
BEZ CZYNNOŚCI:Obsługiwane
Dziwactwa:Podstawowe uwierzytelnianie wyłączone we wrześniu 2024. Wymagane uwierzytelnianie Azure AD dla aplikacji + zgoda administratora dla M365.
Dla alternatywy dla IMAP opartej na REST, zobacz Przewodnik po poczcie e-mail OAuth w Microsoft Graph.
Logo IMAP
Ogólny IMAP
twój-serwer:993
Autoryzacja:Login/hasło OK
BEZ CZYNNOŚCI:Zależy od serwera
Dziwactwa:Nazewnictwo folderów specyficzne dla serwera, MOŻLIWOŚCI się różnią, niektórym brakuje IDLE.
Przykłady:Fastmail, ProtonMail Bridge, Postfix/Dovecot self-hosted
Obsługuje praktycznie każdy serwer IMAP4rev1. Zobacz Przewodnik po interfejsie API IMAP Po pełną listę.
Yahoo Mail
imap.mail.yahoo.com:993
Autoryzacja:Wymagane hasło aplikacji (brak XOAUTH2 dla stron trzecich)
BEZ CZYNNOŚCI:Obsługiwane
Yahoo wycofało wsparcie dla XOAUTH2 w aplikacjach zewnętrznych. Wygeneruj hasło specyficzne dla aplikacji w ustawieniach bezpieczeństwa konta Yahoo.
Poczta iCloud
imap.mail.me.com:993
Autoryzacja:Wymagane hasło aplikacji
BEZ CZYNNOŚCI:Obsługiwane
Dla Apple ID musi być włączone uwierzytelnianie dwuetapowe. Wygeneruj hasło specyficzne dla aplikacji na stronie appleid.apple.com.

Obsł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-mail
Alternatywa dla ujednoliconego API

Kiedy 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.

Z surowym imaplib (ponad 50 linii na dostawcę)
raw_imap.py
# 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...
Z interfejsem REST API Unipile (5 linii)
unipile_email.py
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 IMAP
OAuth jest obsługiwane za Ciebie

Unipile 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.

Znormalizowane odpowiedzi JSON

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.

Webhooki działające w czasie rzeczywistym

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.

Wielu dostawców domyślnie

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.

Wysyłaj też e-maile

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.

Konta powiązane per użytkownik

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.

Wpadki produkcyjne

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.

2026 Zmiana łamiąca: koniec życia protokołu IMAP z podstawowym uwierzytelnianiem firmy Microsoft

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.

01
IMAP IDLE limit czasu (29 minut w Gmailu)

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.

Napraw Ustaw stoper na 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.
02
Błędy dekodowania zestawu znaków RFC 2047

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.

Napraw Zawsze używaj 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.
03
Parsowanie załączników z wiadomości wieloczęściowych

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.

Napraw Przejść przez wszystkie części z msg.przejdź(), sprawdź pobierz_nagłówek dla załącznik, i zadzwoń pobierz_ładunek(dekoduj=Prawda) załączonych części do pobrania zdekodowanych bajtów.
04
Pula połączeń i bezpieczeństwo wątkowe

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.

Napraw Użyj puli połączeń (jedno połączenie na wątek roboczy) lub biblioteki asynchronicznej, takiej jak aioimaplib. Zawsze implementuj wykładnicze wycofywanie się przy próbach ponownego połączenia po IMAP4.przerwij wyjątki.
05
Limity żądań i wyczerpanie limitów

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.

Napraw Pobierz najpierw nagłówki (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.
06
Wygasające pośrodku sesji token OAuth

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.

Napraw Śledź 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łapek
FAQ

Czę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.

01
Jaka jest najlepsza biblioteka IMAP w Pythonie?
Dla prostych skryptów, imaplib ze standardowej biblioteki jest wystarczające bez żadnych zależności. Do użytku produkcyjnego, IMAPClient zapewnia czystsze API ze strukturalnymi odpowiedziami i wbudowaną obsługą IDLE. W przypadku obciążeń asynchronicznych na dużą skalę, aioimaplib integruje się z asyncio. Jeśli potrzebujesz obsługi wielu dostawców (Gmail, Outlook i niestandardowe serwery IMAP) z automatycznie obsługiwanym OAuth, zunifikowany INTERFEJS API IMAP jak Unipile usuwa większość złożoności.
02
Czy imaplib może odczytywać maile Gmail w Pythonie?
Tak. Połącz z 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.
03
Czym jest XOAUTH2 w Pythonie?
XOAUTH2 to mechanizm SASL (Simple Authentication and Security Layer) używany do uwierzytelniania połączeń IMAP za pomocą tokena Bearer OAuth 2.0 zamiast hasła. W Pythonie ciągu znaków koduje się 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.
04
Jak używać OAuth z imaplib?
Aby użyć OAuth z imaplib: 1) Uzyskaj token dostępu od dostawcy (Google OAuth 2.0 lub Microsoft MSAL). 2) Zbuduj ciąg XOAUTH2: 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.
05
imaplib vs IMAPClient – którego powinienem użyć?
Użycie imaplib kiedy potrzebujesz zerowych zależności zewnętrznych lub tylko prostego, jednorazowego skryptu. Użyj IMAPClient do kodu produkcyjnego: zwraca strukturalne słowniki zamiast surowych krotek bajtowych, używa domyślnie identyfikatorów UID, zapewnia czystsze 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.
06
Jak odczytać wiadomości e-mail z Outlook za pomocą Pythona z użyciem IMAP?
Połączenie z 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.
07
Czy IMAP działa z Microsoft 365?
Tak, Microsoft 365 obsługuje IMAP pod adresem 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.
08
Jak obsługiwać IMAP IDLE w Pythonie?
IMAP IDLE pozwala serwerowi wysyłać powiadomienia, gdy przychodzą nowe wiadomości. Z IMAPClient: wywołaj 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.
09
Czy mogę używać asynchronicznego IMAP w Pythonie?
Tak. Ten 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.
10
Jak Unipile porównuje się do imaplib w zakresie integracji poczty e-mail?
imaplib jest niskopoziomową standardową biblioteką Pythona wymagającą 50-200 linii na dostawcę: zarządzanie tokenami OAuth, tworzenie XOAUTH2, parsowanie surowych bajtów, dekodowanie nagłówków RFC 2047, przeglądanie treści MIME, pętle ponownego łączenia IDLE. Unipile jest ujednoliconym interfejsem REST API, który abstrahuje wszystko to w jedno wywołanie HTTP z znormalizowanymi odpowiedziami JSON, wbudowanym OAuth dla Gmaila i Outlooka, dostarczaniem webhooków dla nowych e-maili oraz obsługą wielu dostawców. Kompromis: Unipile to usługa zarządzana z własnym cennikiem, podczas gdy imaplib jest darmowy, ale wymaga znacznych inwestycji w infrastrukturę. Zobacz nasze pełne Przewodnik po interfejsie API IMAP oraz porównanie dostawców.

Nadal masz pytania dotyczące API IMAP w Pythonie? Nasz zespół pomoże Ci wybrać odpowiednie podejście dla Twojego przypadku użycia - surowe IMAP czy zunifikowane API.

Porozmawiaj z ekspertem
pl_PLPL