Programowanie z Thunderbird

Odczytywanie wiadomości z MBOX

Mozilla Thunderbird jest otwarto‑źródłowym, wieloplatformowym klientem poczty elektronicznej, opracowanym przez Mozilla Foundation. Przechowuje e‑maile we własnej strukturze plików, zarządzając indeksami wiadomości i podfolderami przy użyciu własnych formatów plików. Aspose.Email może współpracować ze strukturami magazynu poczty Thunderbird. MboxrdStorageReader klasa umożliwia programistom odczyt wiadomości z pliku magazynu poczty Mozilla Thunderbird. Ten artykuł pokazuje, jak odczytać wiadomości z magazynu e‑mail Thunderbird:

  1. Open the Thunderbird’s storage file in FileStream.
  2. Utwórz instancję MboxrdStorageReader klasa i przekaż powyższy strumień do konstruktora.
  3. Wywołaj ReadNextMessage() aby uzyskać pierwszą wiadomość.
  4. Użyj tego samego ReadNextMessage() w pętli while, aby odczytać wszystkie wiadomości.
  5. Zamknij wszystkie strumienie.

Poniższy fragment kodu pokazuje, jak odczytać wszystkie wiadomości z magazynu poczty Thunderbird.

//Getting Marker information while reading messages from Mbox storage file
try (FileInputStream stream = new FileInputStream(dataDir + "Outlook.pst")) {
    MboxLoadOptions lo = new MboxLoadOptions();
    lo.setLeaveOpen(false);
    try (MboxrdStorageReader reader = new MboxrdStorageReader(stream, lo)) {
        MailMessage msg;
        String[] fromMarker = {null};
        while ((msg = reader.readNextMessage(/* out */fromMarker)) != null) {
            System.out.println(fromMarker[0]);
        }
    }
}

Skonfiguruj opcje ładowania przy odczycie wiadomości z MBOX

API Aspose.Email umożliwia następujące manipulacje wiadomościami przy ich odczycie z pliku MBOX:

Konwertowanie wiadomości z MBOX do PST zachowujące załączniki TNEF

EmlLoadOptions emlLoadOptions = new EmlLoadOptions();
emlLoadOptions.setPreserveTnefAttachments(true);
MailStorageConverter.setMboxMessageOptions(emlLoadOptions);
// Convert messages from mbox to pst preserving tnef attachments.
PersonalStorage storage = MailStorageConverter.mboxToPst("Input.mbox", "Output.pst");

MailStorageConverter.MboxMessageOptions() właściwość - Pobiera lub ustawia opcje ładowania e-mail przy analizie magazynu Mbox.

Odczytywanie wiadomości zachowujące załączniki TNEF

MboxrdStorageReader reader = new MboxrdStorageReader("Input.mbox", new MboxLoadOptions());
// Read messages preserving tnef attachments.
EmlLoadOptions emlLoadOptions = new EmlLoadOptions();
emlLoadOptions.setPreserveTnefAttachments(true);
MailMessage eml = reader.readNextMessage(emlLoadOptions);

MboxrdStorageReader.readNextMessage(EmlLoadOptions options) method - Parametr EmlLoadOptions określa opcje przy odczycie wiadomości z magazynu Mbox.

Wyliczanie wiadomości zachowujące załączniki TNEF

EmlLoadOptions emlLoadOptions = new EmlLoadOptions();
emlLoadOptions.setPreserveTnefAttachments(true);
// Enumerate messages preserving tnef attachments.
for (MailMessage message : reader.enumerateMessages(emlLoadOptions)) {
    // do something
}

MboxrdStorageReader.enumerateMessages(EmlLoadOptions options) method - Określa EmlLoadOptions podczas odczytu wiadomości z magazynu Mbox.

Wyodrębnianie wiadomości z MBOX po identyfikatorach

Czasami konieczne jest wyodrębnienie wybranych wiadomości po identyfikatorach. Na przykład, Twoja aplikacja przechowuje identyfikatory w bazie danych i wyodrębnia wiadomość na żądanie. Jest to efektywny sposób, aby uniknąć przeszukiwania całego magazynu przy każdym poszukiwaniu konkretnej wiadomości do wyodrębnienia. Aby wdrożyć tę funkcję dla plików MBOX, Aspose.Email udostępnia następujące metody i klasy:

Poniższy przykład kodu demonstruje, jak wyodrębnić wiadomości z MBOX po identyfikatorach:

MboxStorageReader reader = MboxStorageReader.createReader("my.mbox", new MboxLoadOptions());

for (MboxMessageInfo msgInfo : reader.enumerateMessageInfo()) {
    MailMessage eml = reader.extractMessage(msgInfo.getEntryId(), new EmlLoadOptions());
}

Uwaga: Identyfikator wiadomości jest unikalny w obrębie pliku magazynu. Identyfikatory są tworzone przez Aspose.Email i nie mogą być używane w innych bibliotekach lub aplikacjach przetwarzających MBOX.

Filtrowanie i wyszukiwanie wiadomości w plikach MBOX

Aspose.Email for Java zapewnia możliwość filtrowania lub wyszukiwania wiadomości w plikach MBOX przy użyciu zapytania. Pozwala to pobrać jedynie wiadomości spełniające określone kryteria. Dzięki temu możesz poprawić wydajność i użyteczność aplikacji pracującej z dużymi plikami MBOX.

Poniższy przykład kodu demonstruje, jak zaimplementować tę funkcję, realizując następujące metody:

  • enumerateMessages(MailQuery query) - zwraca kolekcję wyliczalną obiektów MailMessage, które spełniają określone zapytanie.

  • enumerateMessageInfo(MailQuery query) - zwraca kolekcję wyliczalną obiektów MboxMessageInfo, które spełniają określone zapytanie.

MboxStorageReader reader = MboxStorageReader.createReader("input.mbox", new MboxLoadOptions());
MailQueryBuilder mqb = new MailQueryBuilder();
mqb.getSubject().contains("Project Update");
mqb.getSentDate().before(new Date());

for (MailMessage message : reader.enumerateMessages(mqb.getQuery())) {
    System.out.println("Subject: " + message.getSubject());
}

Stronicowane pobieranie wiadomości z plików MBOX

Aspose.Email for Java obsługuje stronicowane pobieranie wiadomości z plików MBOX. Ta funkcja umożliwia wydajne przetwarzanie dużych plików MBOX poprzez pobieranie wiadomości w mniejszych partiach, zmniejszając zużycie pamięci i zwiększając wydajność.

Poniższy przykład kodu demonstruje, jak zaimplementować tę funkcję, realizując następujące metody:

  • enumerateMessages(int startIndex, int count) - pobiera określoną liczbę obiektów MailMessage zaczynając od podanego indeksu.

  • enumerateMessageInfo(int startIndex, int count) - pobiera określoną liczbę obiektów MboxMessageInfo zaczynając od podanego indeksu.

MboxStorageReader reader = MboxStorageReader.createReader("input.mbox", new MboxLoadOptions());
int startIndex = 0;
int count = 10; // Retrieve messages in batches of 10

for (MailMessage message : reader.enumerateMessages(startIndex, count)) {
    System.out.println("Subject: " + message.getSubject());
}

Zapisywanie wiadomości

Ten MboxrdStorageWriter klasa zapewnia możliwość zapisu nowych wiadomości do pliku magazynu poczty Thunderbird. Aby zapisać wiadomości:

  1. Otwórz plik magazynu Thunderbird w FileStream.
  2. Utwórz instancję MboxrdStorageWriter klasa i przekaż powyższy strumień do konstruktora.
  3. Przygotuj nową wiadomość przy użyciu MailMessage klasa.
  4. Wywołaj WriteMessage() metoda i przekazać powyższe MailMessage instancja służąca do dodania wiadomości do magazynu Thunderbird.
  5. Zamknij wszystkie strumienie.

Poniższy fragment kodu pokazuje, jak zapisywać wiadomości w magazynie poczty Thunderbird.

//Getting marker information while writing messages to Mbox storage file
try (FileOutputStream writeStream = new FileOutputStream(dataDir + "inbox")) {
    try (MboxrdStorageWriter writer = new MboxrdStorageWriter(writeStream, false)) {
        MailMessage msg = MailMessage.load(dataDir + "Message.msg");
        String[] fromMarker = {null};
        writer.writeMessage(msg, fromMarker);
        System.out.println(fromMarker[0]);
    }
}

Uzyskanie całkowitej liczby wiadomości z pliku MBox

Ten MboxrdStorageReader klasa zapewnia możliwość odczytania liczby elementów dostępnych w pliku MBox. Może to być użyte do tworzenia aplikacji wyświetlających postęp działania podczas przetwarzania takiego pliku.

MboxLoadOptions lo = new MboxLoadOptions();
try (MboxrdStorageReader reader = new MboxrdStorageReader("inbox.dat", lo)) {
    System.out.println("Total number of messages in Mbox file: " + reader.getTotalItemsCount());
}

Pobierz bieżący rozmiar wiadomości

FileInputStream stream = new FileInputStream(dataDir + "ExampleMbox.mbox");
MboxLoadOptions lo = new MboxLoadOptions();
try (MboxrdStorageReader reader = new MboxrdStorageReader(stream, lo)) {
    MailMessage msg = null;
    while ((msg = reader.readNextMessage()) != null) {
        //returns the number of bytes read
        long currentDataSize = reader.getCurrentDataSize();
        System.out.println("Bytes read: " + currentDataSize);
    }
}

Ustaw preferowane kodowanie tekstu przy ładowaniu plików Mbox

Ten setPreferredTextEncoding(Charset value) metoda MboxLoadOptions klasa umożliwia pobieranie lub ustawianie preferowanego kodowania dla wiadomości. Utwórz czytnik pliku Mbox z określonymi opcjami ładowania, a Twoje wiadomości z zakodowaną zawartością zostaną prawidłowo odczytane i przetworzone. Poniższy przykład kodu pokazuje, jak wprowadzić tę funkcję do projektu:

MboxLoadOptions lo = new MboxLoadOptions();
lo.setPreferredTextEncoding(Charset.forName("utf-8"));
MboxrdStorageReader reader = new MboxrdStorageReader("sample.mbox", lo);
MailMessage message = reader.readNextMessage();

Podziel przechowywanie Mbox na mniejsze części

Aspose.Email udostępnia następujące komponenty zaprojektowane w celu uzyskania większej kontroli nad przetwarzaniem przechowywania Mbox, umożliwiając podział dużych plików na części łatwiejsze do obsługi oraz implementację własnych działań w trakcie procesu:

MboxStorageReader.SplitInto(long chunkSize, String outputPath, String partFileNamePrefix) - wariant poprzedniej metody, który dodatkowo pozwala określić własny prefiks dla nazw podzielonych plików Mbox.

MboxStorageReader.setEmlCopyingEventHandler Event - To zdarzenie występuje przed skopiowaniem wiadomości do nowego pliku Mbox. Możesz dostosować działania przed przetwarzaniem wiadomości.

MboxStorageReader.setEmlCopiedEventHandler Event - To zdarzenie występuje po skopiowaniu wiadomości do nowego pliku Mbox. Możesz wykonać działania po przetworzeniu wiadomości.

MboxStorageReader.setMboxFileCreatedEventHandler Event - To zdarzenie występuje, gdy zostanie utworzony nowy plik Mbox. Możesz obsłużyć to zdarzenie, aby zareagować na utworzenie pliku.

MboxStorageReader.setMboxFileFilledEventHandler Event – to zdarzenie występuje, gdy nowy plik Mbox zostaje wypełniony e‑mailami. Możesz zareagować na wypełnienie pliku wiadomościami.

NewStorageEventHandler(Object sender, NewStorageEventArgs e) reprezentuje delegata obsługującego zdarzenia, które występują po utworzeniu nowego pliku magazynu lub po jego przetworzeniu.

MimeItemCopyEventHandler(Object sender, MimeItemCopyEventArgs e) reprezentuje delegata obsługującego zdarzenia związane z kopiowaniem elementów Mime, zazwyczaj używanego w scenariuszach, w których obiekt MailMessage jest kopiowany z jednego magazynu do drugiego.

NewStorageEventArgs reprezentuje argumenty używane w zdarzeniach wywoływanych po utworzeniu nowego pliku magazynu lub po jego przetworzeniu.

MimeItemCopyEventArgs reprezentuje argumenty zdarzenia związane z kopiowaniem obiektu MailMessage z jednego magazynu do drugiego, zarówno przed rozpoczęciem kopiowania, jak i po jego zakończeniu.

Poniższy przykład kodu demonstruje, jak współdziałać z plikami Mbox, obsługiwać zdarzenia związane z tymi plikami oraz wykonywać operacje takie jak podział magazynu Mbox na mniejsze części przy jednoczesnym śledzeniu liczby wiadomości i liczby części:

messageCount = 0;
partCount = 0;

// Create an instance of MboxrdStorageReader
MboxLoadOptions lo = new MboxLoadOptions();
lo.setLeaveOpen(false);
MboxrdStorageReader mbox = new MboxrdStorageReader("my.mbox", lo);

// Subscribe to events
mbox.setMboxFileCreatedEventHandler(new NewStorageEventHandler() {
    public void invoke(Object sender, NewStorageEventArgs e) {
        System.out.println("New Mbox file created: " + e.getFileName());
        partCount++;
    }
});

mbox.setMboxFileFilledEventHandler(new NewStorageEventHandler() {
    public void invoke(Object sender, NewStorageEventArgs e) {
        System.out.println("Mbox file filled with messages: " + e.getFileName());
    }
});

mbox.setEmlCopiedEventHandler(new MimeItemCopyEventHandler() {
    public void invoke(Object sender, MimeItemCopyEventArgs e) {
        System.out.println("Message added to new Mbox file. Subject: " + e.getItem().getSubject());
        messageCount++;
    }
});

// Split the Mbox storage into smaller parts
mbox.splitInto(10000000, testOutPath, "Prefix");

// Output the final messageCount and partCount
System.out.println("Total messages added: " + messageCount);
System.out.println("Total parts created: " + partCount);