Więc chcesz wykonać kopie zapasowe wiadomości e-mail przez IMAP. Dostępne są profesjonalne narzędzia programowe.
Zacznijmy od czegoś prostego: pobieranie wiadomości e-mail dla jednego konkretnego użytkownika z folderu skrzynki odbiorczej. Wymaga to (a) zalogowania się przy użyciu poświadczeń użytkownika, (b) wybrania folderu INBOX i (c) pobrania wiadomości (załóżmy, że znasz już jego UID, czyli 55). Można to zrobić w następujący sposób IMAP (tylko żądania - Odpowiedzi nie pokazano):
01 LOGIN username password
02 SELECT INBOX
03 UID FETCH 55 BODY[]
Każda wiadomość w określonym folderze jest podana UID. Jest to unikalny identyfikator dla wiadomości, która nigdy się nie zmienia - nie może być używana przez żadną inną wiadomość w tym folderze. Nowe wiadomości muszą mieć wyższy identyfikator UID niż poprzednie. Dzięki temu jest to przydatne narzędzie do ustalenia, czy poprzednio pobrano już wiadomość.
Następny krok: spójrzmy teraz na pobieranie wszystkich nowych wiadomości w folderze INBOX. Załóżmy, że jesteś pobierania wiadomości po raz pierwszy, a SKRZYNKA obecnie ma wiadomości z UID 54, 55 i 57. Można pobrać te wiadomości naraz używając polecenia takie jak:
03 UID FETCH 54,55,57 BODY[]
(You może to zepsuć partiami (np. 30 na raz), jeśli jest dużo do pobrania.) Po wykonaniu tej czynności przechowuje się najwyższy UID pobrany do tej pory.Następnym razem, można sprawdzić UID wyższe niż w następujący sposób:
04 UID FETCH 58:* UID
To będzie pobierać UID (tylko) dla komunikatów z UID od 58 roku. Jeśli uzyskasz wyniki, pobierz je i ponownie zapisz UID. I tak dalej.
Jest jeden haczyk. Identyfikatory UID komunikatu są poprawne, o ile atrybut UIDVALIDITY folderu (zawarty w odpowiedzi na polecenie SELECT) nie zmienia się. Jeśli to się zmieni z jakiegoś powodu, folder zostanie unieważniony i musisz pobrać wszystkie wiadomości z tego folderu od nowa.
Wreszcie, chcesz rozszerzyć to działanie dla wszystkich folderów dla wszystkich użytkowników. W celu uzyskania wszystkich folderów dla danego użytkownika, należy użyć komendy LIST IMAP:
05 LIST "" "*"
będzie trzeba wiedzieć poświadczenia dla użytkowników wcześniej i pętli nad nimi.
To jest teoria IMAP stojąca za tym, co musisz zrobić. Wdrożenie go w PHP jest pozostawione jako ćwiczenie.
Musi mieć możliwość połączenia kilku różnych serwerów, więc lokalnie nie jest to opcja niefortunnie. Chodzi o to, aby jednorazowo otrzymać wszystkie "nowe" wiadomości e-mail. Ale jak mogę się upewnić, że bez pętli (i sprawdzenia, czy istnieją w bazie danych) znowu je wszystkie? – Floris
ah, czyli łatwy IMAP ma "widzialną" flagę, prawda? Powinna również istnieć sekwencja ... 'msgno'? Ewentualnie przesyłaj wiadomości e-mail do archiwum, które można przetworzyć i zniszczyć po przetworzeniu. Opisujesz powszechny przypadek użycia dla protokołu IMAP. – ficuscr
Skrzynki pocztowe zostaną "zarchiwizowane" w bazie danych, więc niewidoczne/widoczne flagi nie będą działać. – Floris