Lavorare con caselle di posta Exchange e messaggi - Leggere email da Exchange Server in Java

Ottenere le informazioni della casella di posta usando EWS

Il EWSClient la classe ha membri che possono essere usati per ottenere informazioni sulla casella di posta da un Exchange Server chiamando il IEWSClient.getMailboxInfo() metodo. Restituisce un’istanza del tipo ExchangeMailboxInfo. Ottieni informazioni sulla casella di posta da proprietà come MailboxUri, InboxUri e DraftsUri. Questo articolo mostra come accedere alle informazioni della casella di posta usando Exchange Web Services.

Se vuoi connetterti al server Exchange usando Exchange Web Services (EWS), utilizza il EWSClient classe. Questa classe usa EWS per connettersi e gestire gli elementi su un server Exchange. Il seguente frammento di codice Java mostra come ottenere informazioni sulla casella di posta usando i servizi web Exchange.

// Create instance of EWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

// Get mailbox size, exchange mailbox info, Mailbox and Inbox folder URI
System.out.println("Mailbox size: " + client.getMailboxSize() + " bytes");
ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();
System.out.println("Mailbox URI: " + mailboxInfo.getMailboxUri());
System.out.println("Inbox folder URI: " + mailboxInfo.getInboxUri());
System.out.println("Sent Items URI: " + mailboxInfo.getSentItemsUri());
System.out.println("Drafts folder URI: " + mailboxInfo.getDraftsUri());

Invio di messaggi email

Puoi inviare messaggi email usando un server Exchange con l’aiuto degli strumenti in Aspose.Email.Exchange. Il metodo IEWSClient.Send() accetta un MailMessage istanza come parametro e invia l’email. Questo articolo spiega come inviare messaggi email usando Exchange Web Services.

Aspose.Email fornisce la classe IEWSClient per connettersi a Microsoft Exchange Server usando Exchange Web Services. Il seguente frammento di codice mostra come utilizzare EWS per inviare email usando Microsoft Exchange Server. Il seguente frammento di codice Java mostra come inviare messaggi email usando EWS.

// Create instance of IEWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

// Create instance of type MailMessage
MailMessage msg = new MailMessage();
msg.setFrom(MailAddress.to_MailAddress("sender@domain.com"));
msg.setTo(MailAddressCollection.to_MailAddressCollection("recipient@ domain.com "));
msg.setSubject("Sending message from exchange server");
msg.setHtmlBody("<h3>sending message from exchange server</h3>");

// Send the message
client.send(msg);

Ottenere la classe del messaggio

Il getMessageClass() metodo del ExchangeMessageInfo classe restituisce una stringa che rappresenta la classe del messaggio. Il campione di codice sottostante mostra come ottenere la classe del messaggio:

try (IEWSClient client = EWSClient.getEWSClient(uri, credentials))
{
    ExchangeMessageInfoCollection messageInfoCollection = client.listMessagesFromPublicFolder(publicFolder);

    for (ExchangeMessageInfo messageInfo : messageInfoCollection)
    {
        System.out.println("Message Class: " + messageInfo.getMessageClass());
    }
}

Leggere email da altre caselle di posta degli utenti

Alcuni account su server Exchange hanno il permesso di accedere a più caselle di posta, e alcuni utenti hanno più account email sullo stesso server Exchange. In entrambi i casi, gli utenti possono accedere alle caselle di posta di altri utenti usando Aspose.Email per Java. Questa API fornisce un meccanismo per accedere a cartelle e email da altre caselle di posta utilizzando il IEWSClient classe. Questa funzionalità può essere ottenuta usando il metodo overload getMailboxInfo() metodo fornendo l’indirizzo email dell’utente come parametro.

Il seguente frammento di codice mostra come leggere le email usando IEWSClient classe.

// Create instance of EWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

// Get Exchange mailbox info of other email account
ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo("otherUser@domain.com");

Elencare i messaggi

Un elenco dei messaggi email in una casella di posta Exchange può essere recuperato chiamando il IEWSClient.listMessages metodo. Ottieni le informazioni di base sui messaggi, come l’oggetto, mittente, destinatario e ID del messaggio, utilizzando il listMessages metodo.

Elencare i messaggi semplici

Per elencare i messaggi in una casella di posta Exchange:

  1. Crea un’istanza di IEWSClient classe.
  2. Chiama il metodo listMessages e crea una collezione di messaggi.
  3. Itera attraverso la collezione e visualizza le informazioni del messaggio.

Il seguente frammento di codice Java mostra come connettersi a un server Exchange usando EWS e elencare i messaggi dalla cartella Posta in arrivo.

// Create instance of ExchangeWebServiceClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "UserName", "Password");

// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());

// Loop through the collection to display the basic information
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgCollection) {
    System.out.println("Subject: " + msgInfo.getSubject());
    System.out.println("From: " + msgInfo.getFrom().toString());
    System.out.println("To: " + msgInfo.getTo().toString());
    System.out.println("Message ID: " + msgInfo.getMessageId());
    System.out.println("Unique URI: " + msgInfo.getUniqueUri());
}

Elencare i messaggi da cartelle diverse

I frammenti di codice sopra, elenca tutti i messaggi nella cartella Posta in arrivo. È possibile ottenere l’elenco dei messaggi anche da altre cartelle. Il IEWSClient.listMessages() il metodo accetta un URI di cartella come parametro. Finché l’URI della cartella è valido, è possibile ottenere l’elenco dei messaggi da quella cartella. Usa la proprietà IEWSClient.getMailboxInfo().getXXXFolderUri per ottenere l’URI di diverse cartelle. Il resto del codice è lo stesso per ottenere un elenco di messaggi. Il seguente frammento di codice mostra come elencare i messaggi da diverse cartelle usando EWS.

// Create instance of EWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

// Get folder URI
String strFolderURI = "";
strFolderURI = client.getMailboxInfo().getInboxUri();
strFolderURI = client.getMailboxInfo().getDeletedItemsUri();
strFolderURI = client.getMailboxInfo().getDraftsUri();
strFolderURI = client.getMailboxInfo().getSentItemsUri();

// Get list of messages from the specified folder
ExchangeMessageInfoCollection msgCollection = client.listMessages(strFolderURI);

Elencare i messaggi con supporto alla paginazione

Il seguente frammento di codice Java mostra come ottenere un elenco di messaggi con supporto alla paginazione.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
final IEWSClient client = EWSClient.getEWSClient("exchange.domain.com", "username", "password");
try {
    try {
        // Create some test messages to be added to server for retrieval later
        int messagesNum = 12;
        int itemsPerPage = 5;
        MailMessage message = null;
        for (int i = 0; i < messagesNum; i++) {
            message = new MailMessage("from@domain.com", "to@domain.com", "EMAILNET-35157_1 - " + UUID.randomUUID().toString(),
                    "EMAILNET-35157 Move paging parameters to separate class");
            client.appendMessage(client.getMailboxInfo().getInboxUri(), message);
        }
        // Verfiy that the messages have been added to the server
        ExchangeMessageInfoCollection totalMessageInfoCol = client.listMessages(client.getMailboxInfo().getInboxUri());
        System.out.println(totalMessageInfoCol.size());

        ////////////////// RETREIVING THE MESSAGES USING PAGING SUPPORT ////////////////////////////////////

        List<ExchangeMessagePageInfo> pages = new ArrayList<ExchangeMessagePageInfo>();
        ExchangeMessagePageInfo pageInfo = client.listMessagesByPage(client.getMailboxInfo().getInboxUri(), itemsPerPage);
        // Total Pages Count
        System.out.println(pageInfo.getTotalCount());

        pages.add(pageInfo);
        while (!pageInfo.getLastPage()) {
            pageInfo = client.listMessagesByPage(client.getMailboxInfo().getInboxUri(), itemsPerPage, pageInfo.getPageOffset() + 1);
            pages.add(pageInfo);
        }
        int retrievedItems = 0;
        // foreach to while statements conversion
        for (ExchangeMessagePageInfo pageCol : pages) {
            retrievedItems += pageCol.getItems().size();
        }
        // Verify total message count using paging
        System.out.println(retrievedItems);
    } finally {
    }
} finally {
    client.dispose();
}

Ottenere informazioni sul tipo di messaggio da ExchangeMessageInfo

IEWSClient client = EWSClient.getEWSClient(mailboxUri, credentials);

ExchangeMessageInfoCollection list = client.listMessages(client.getMailboxInfo().getDeletedItemsUri());
System.out.println(list.get_Item(0).getMessageInfoType()); // MessageInfoType

Salvataggio dei messaggi

Questo articolo mostra come recuperare i messaggi da una casella di posta Exchange Server e salvarli su disco nei formati EML e MSG:

  • Salva come EML su disco.
  • Salva in un flusso di memoria.
  • Salva come MSG.

Salvataggio dei messaggi in EML

Per ottenere i messaggi e salvarli in formato EML:

  1. Crea un’istanza della classe IEWSClient.
  2. Fornisci mailboxUri, nome utente, password e dominio.
  3. Chiama il metodo IEWSClient.listMessages() per ottenere un’istanza della collezione ExchangeMessagesInfoCollection.
  4. Itera la collezione ExchangeMessagesInfoCollection per ottenere l’URI unico di ciascun messaggio.
  5. Chiama il metodo IEWSClient.saveMessage() e passa l’URI unico come parametro.
  6. Fornisci al metodo saveMessage() il percorso dove salvare il file.

Il seguente frammento di codice mostra come usare EWS per connettersi al server Exchange e salvare i messaggi come file EML.

// Create instance of IEWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());

// Loop through the collection to get Message URI
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgCollection) {
    String strMessageURI = msgInfo.getUniqueUri();

    // Now save the message in disk
    client.saveMessage(strMessageURI, dataDir + msgInfo.getMessageId() + "out.eml");
}

Salvataggio dei messaggi in un flusso di memoria

Invece di salvare i file EML su disco, è possibile salvarli in un flusso di memoria. Questo è utile quando si desidera salvare il flusso in una posizione di archiviazione come un database. Una volta salvato il flusso nel database, è possibile ricaricare il file EML nel MailMessage classe. Il seguente frammento di codice mostra come salvare i messaggi da una casella di posta Exchange Server in un flusso di memoria usando EWS.

// Create instance of EWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());

// Loop through the collection to get Message URI
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgCollection) {
    String strMessageURI = msgInfo.getUniqueUri();

    // Now save the message in memory stream
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    client.saveMessage(strMessageURI, stream);
}

Salvataggio dei messaggi in formato MSG

Il IEWSClient.saveMessage() il metodo può salvare direttamente il messaggio in formato EML. Per salvare i messaggi in formato MSG, prima chiama il IEWSClient.fetchMessage() metodo che restituisce un’istanza di MailMessage classe. Poi chiama il MailMessage.save() metodo per salvare il messaggio in MSG. Il seguente frammento di codice mostra come recuperare i messaggi da una casella di posta Exchange Server e salvarli in formato MSG usando EWS.

// Create instance of EWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());

int count = 0;
// Loop through the collection to get Message URI
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgCollection) {
    String strMessageURI = msgInfo.getUniqueUri();

    // Now get the message details using FetchMessage() and Save message as Msg
    MailMessage message = client.fetchMessage(strMessageURI);
    message.save(dataDir + (count++) + "_out.msg", SaveOptions.getDefaultMsgUnicode());
}

Ottenere ExchangeMessageInfo dall’URI del messaggio

Un messaggio email è rappresentato dal suo identificatore unico, URI, ed è parte integrante del ExchangeMessageInfo oggetto. Nel caso in cui sia disponibile solo l’URI del messaggio, allora ExchangeMessageInfo oggetto può anche essere recuperato usando queste informazioni disponibili. La versione overload di listMessages prende un elenco di ID da utilizzare ExchangeMessageInfoCollection. Il seguente frammento di codice mostra come ottenere ExchangeMessageInfo dall’URI del messaggio.

IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "user@domain.com", "pwd", "domain");

List<String> ids = new ArrayList<String>();
List<MailMessage> messages = new ArrayList<MailMessage>();

for (int i = 0; i < 5; i++) {
    MailMessage message = new MailMessage("user@domain.com", "receiver@domain.com", "EMAILNET-35033 - " + UUID.randomUUID().toString(),
            "EMAILNET-35033 Messages saved from Sent Items folder doesn't contain 'To' field");
    messages.add(message);
    String uri = client.appendMessage(message);
    ids.add(uri);
}

ExchangeMessageInfoCollection messageInfoCol = client.listMessages(ids);

for (ExchangeMessageInfo messageInfo : (Iterable<ExchangeMessageInfo>) messageInfoCol) {
    // Do something ...
    System.out.println(messageInfo.getUniqueUri());
}

Recupera Messaggi da una Casella Exchange Server

Elencare Messaggi su un Exchange Server ha usato il listMessages() metodo per ottenere un elenco di messaggi da una casella Exchange Server. Il listMessages() il metodo ottiene informazioni di base sui messaggi, ad esempio l’oggetto, l’ID del messaggio, mittente e destinatario. Per ottenere i dettagli completi del messaggio, Aspose.Email.Exchange fornisce il metodo IEWSClient.fetchMessage(). Questo metodo accetta l’URI del messaggio come parametro e restituisce un’istanza del MailMessage classe. Il MailMessage classe fornisce poi i dettagli del messaggio come corpo, intestazioni e allegati. Scopri di più sul MailMessage API, o scopri come gestire le email con il MailMessage classe. Per recuperare messaggi dalla casella di posta Exchange Server:

  1. Crea un’istanza del tipo IEWSClient.
  2. Specifica il nome del server, il nome utente, la password e il dominio.
  3. Chiama listMessages per ottenere l’ExchangeMessageInfoCollection.
  4. Itera la collezione ExchangeMessageInfoCollection per ottenere i valori ExchangeMessageInfo.UniqueURI.
  5. Chiama IEWSClient.fetchMessage() e passa ExchangeMessageInfo.UniqueURI come parametro.

Il seguente frammento di codice mostra come connettersi alla casella di posta del server Exchange e recuperare tutti i messaggi utilizzando EWS.

// Create instance of ExchangeWebServiceClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());

// Loop through the collection to get Message URI
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgCollection) {
    String strMessageURI = msgInfo.getUniqueUri();

    // Now get the message details using FetchMessage()
    MailMessage msg = client.fetchMessage(strMessageURI);

    for (Attachment att : (Iterable<Attachment>) msg.getAttachments()) {
        System.out.println("Attachment Name: " + att.getName());
    }
}

Utilizzare il metodo FetchItem per recuperare un messaggio

Il FetchItem Il metodo è più consigliato se vuoi recuperare un MapiMessage e operare con le proprietà MAPI. Puoi anche usare questo metodo per recuperare qualsiasi elemento di Outlook, come un contatto, un appuntamento, un’attività, ecc.

// Create instance of ExchangeWebServiceClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());

// Loop through the collection to get Message URI
for (ExchangeMessageInfo msgInfo : msgCollection)
{
    // Now get the message using FetchItem()
    MapiMessage msg = client.fetchItem(msgInfo.getUniqueUri());

    // If necessary, you can cast the MapiMessage to the proper item type to simplify working with its properties.
    MapiContact contact = (MapiContact) msg.toMapiMessageItem();
}

Prelievo anticipato della dimensione del messaggio

Microsoft Outlook InterOp fornisce la funzionalità di recuperare la dimensione del messaggio prima di scaricare effettivamente il messaggio completo dal server. Nel caso dell’API Aspose.Email, le informazioni di riepilogo ottenute dal server Exchange sono rappresentate da ExchangeMessageInfo classe. Fornisce la stessa funzionalità di recuperare la dimensione del messaggio usando la proprietà Size. Per ottenere la dimensione del messaggio, viene usata la chiamata standard a listMessages di IEWSClient che recupera una collezione di ExchangeMessageInfo. Il seguente frammento di codice mostra come visualizzare la dimensione del messaggio usando la ExchangeMessageInfo classe.

// Create instance of ExchangeWebServiceClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());

// Loop through the collection to display the basic information
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgCollection) {
    System.out.println("Subject: " + msgInfo.getSubject());
    System.out.println("From: " + msgInfo.getFrom().toString());
    System.out.println("To: " + msgInfo.getTo().toString());
    System.out.println("Message Size: " + msgInfo.getSize());
    System.out.println("==================================");
}

Scaricare i messaggi ricorsivamente

Il EWSClient’s listSubFolders() il metodo può essere usato per ottenere messaggi da cartelle e sottocartelle di una casella di posta Exchange Server in modo ricorsivo. Richiede Exchange Server 2007 o superiore, perché utilizza EWS. Il seguente frammento di codice mostra come scaricare l’intera casella di posta (cartelle e sottocartelle) di un Exchange Server. La struttura delle cartelle viene creata localmente e tutti i messaggi vengono scaricati.

public static void run() {
    try {
        downloadAllMessages();
    } catch (java.lang.RuntimeException ex) {
        System.out.println(ex.getMessage());
    }
}

private static void downloadAllMessages() {
    try {
        String rootFolder = domain + "-" + username;
        new File(rootFolder).mkdirs();
        String inboxFolder = rootFolder + "\\Inbox";
        new File(inboxFolder).mkdirs();

        System.out.println("Downloading all messages from Inbox....");
        // Create instance of IEWSClient class by giving credentials
        IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", username, password, domain);

        ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();
        System.out.println("Mailbox URI: " + mailboxInfo.getMailboxUri());
        String rootUri = client.getMailboxInfo().getRootUri();
        // List all the folders from Exchange server
        ExchangeFolderInfoCollection folderInfoCollection = client.listSubFolders(rootUri);
        for (ExchangeFolderInfo folderInfo : (Iterable<ExchangeFolderInfo>) folderInfoCollection) {
            // Call the recursive method to read messages and get sub-folders
            listMessagesInFolder(client, folderInfo, rootFolder);
        }

        System.out.println("All messages downloaded.");
    } catch (java.lang.RuntimeException ex) {
        System.out.println(ex.getMessage());
    }
}

// Recursive method to get messages from folders and sub-folders
private static void listMessagesInFolder(IEWSClient client, ExchangeFolderInfo folderInfo, String rootFolder) {
    // Create the folder in disk (same name as on IMAP server)
    String currentFolder = rootFolder + "\\" + folderInfo.getDisplayName();
    new File(currentFolder).mkdirs();

    // List messages
    ExchangeMessageInfoCollection msgInfoColl = client.listMessages(folderInfo.getUri());
    System.out.println("Listing messages....");
    int i = 0;
    for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgInfoColl) {
        // Get subject and other properties of the message
        System.out.println("Subject: " + msgInfo.getSubject());

        // Get rid of characters like ? and :, which should not be included in a file name
        String fileName = msgInfo.getSubject().replace("?", " ").replace(":", " ");

        MailMessage msg = client.fetchMessage(msgInfo.getUniqueUri());
        msg.save(dataDir + "\\" + fileName + "-" + i + ".msg");

        i++;
    }
    System.out.println("============================\n");
    try {
        // If this folder has sub-folders, call this method recursively to get messages
        ExchangeFolderInfoCollection folderInfoCollection = client.listSubFolders(folderInfo.getUri());
        for (ExchangeFolderInfo subfolderInfo : (Iterable<ExchangeFolderInfo>) folderInfoCollection) {
            listMessagesInFolder(client, subfolderInfo, currentFolder);
        }
    } catch (java.lang.RuntimeException e) {
    }
}

Scaricare i messaggi dalle cartelle pubbliche

Microsoft Exchange Server consente agli utenti di creare cartelle pubbliche e pubblicare messaggi in esse. Per farlo tramite la tua applicazione, utilizza le EWSClient classe per connettersi a Exchange Server e leggere e scaricare messaggi e post dalle cartelle pubbliche. Il seguente frammento di codice mostra come leggere tutte le cartelle pubbliche e le sottocartelle, elencare e scaricare i messaggi trovati in queste cartelle. Questo esempio funziona solo con Microsoft Exchange Server 2007 o versioni successive, poiché solo queste supportano EWS.

public static void run() {
    try {
        readPublicFolders();
    } catch (java.lang.RuntimeException ex) {
        System.out.println(ex.getMessage());
    }
}

private static void readPublicFolders() {
    NetworkCredential credential = new NetworkCredential(username, password, domain);
    IEWSClient client = EWSClient.getEWSClient(mailboxUri, credential);

    ExchangeFolderInfoCollection folders = client.listPublicFolders();
    for (ExchangeFolderInfo publicFolder : (Iterable<ExchangeFolderInfo>) folders) {
        System.out.println("Name: " + publicFolder.getDisplayName());
        System.out.println("Subfolders count: " + publicFolder.getChildFolderCount());
        listMessagesFromSubFolder(publicFolder, client);

    }
}

private static void listMessagesFromSubFolder(ExchangeFolderInfo publicFolder, IEWSClient client) {
    System.out.println("Folder Name: " + publicFolder.getDisplayName());
    ExchangeMessageInfoCollection msgInfoCollection = client.listMessagesFromPublicFolder(publicFolder);
    for (ExchangeMessageInfo messageInfo : (Iterable<ExchangeMessageInfo>) msgInfoCollection) {
        MailMessage msg = client.fetchMessage(messageInfo.getUniqueUri());
        System.out.println(msg.getSubject());
        msg.save(dataDir + msg.getSubject() + ".msg", SaveOptions.getDefaultMsgUnicode());
    }

    // Call this method recursively for any subfolders
    if (publicFolder.getChildFolderCount() > 0) {
        ExchangeFolderInfoCollection subfolders = client.listSubFolders(publicFolder);
        for (ExchangeFolderInfo subfolder : (Iterable<ExchangeFolderInfo>) subfolders) {
            listMessagesFromSubFolder(subfolder, client);
        }
    }
}

Spostamento dei messaggi

Puoi spostare i messaggi email da una cartella all’altra con l’aiuto del IEWSClient classe sposta metodo. Accetta i parametri:

  • L’URI unico del messaggio da spostare.
  • L’URI unico della cartella di destinazione.

Spostare i messaggi tra cartelle

Il seguente frammento di codice mostra come spostare un messaggio in una casella di posta dalla cartella Posta in arrivo a una cartella chiamata Processed. In questo esempio, l’applicazione:

  1. Legge i messaggi dalla cartella Posta in arrivo.
  2. Elabora alcuni dei messaggi basandosi su criteri (in questo esempio, troviamo una parola chiave nell’oggetto del messaggio).
  3. Sposta i messaggi che soddisfano la condizione data nella cartella elaborata.
// Create instance of IEWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();

// List all messages from Inbox folder
System.out.println("Listing all messages from Inbox....");
ExchangeMessageInfoCollection msgInfoColl = client.listMessages(mailboxInfo.getInboxUri());
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgInfoColl) {
    // Move message to "Processed" folder, after processing certain messages based on some criteria
    if (msgInfo.getSubject() != null && msgInfo.getSubject().toLowerCase().contains("process this message")) {
        client.moveItem(mailboxInfo.getDeletedItemsUri(), msgInfo.getUniqueUri()); // EWS
        System.out.println("Message moved...." + msgInfo.getSubject());
    } else {
        // Do something else
    }
}

Eliminazione dei messaggi

Puoi eliminare i messaggi email da una cartella con l’aiuto del IEWSClient classe deleteItem metodo. Accetta l’URI unico del messaggio come parametro.

Il seguente frammento di codice mostra come eliminare un messaggio dalla cartella Posta in arrivo. Per questo esempio, il codice:

  1. Legge i messaggi dalla cartella Posta in arrivo.
  2. Elabora i messaggi in base a determinati criteri (in questo esempio, troviamo una parola chiave nell’oggetto del messaggio).
  3. Elimina il messaggio.
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();

// List all messages from Inbox folder
System.out.println("Listing all messages from Inbox....");
ExchangeMessageInfoCollection msgInfoColl = client.listMessages(mailboxInfo.getInboxUri());
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgInfoColl) {
    // Delete message based on some criteria
    if (msgInfo.getSubject() != null && msgInfo.getSubject().toLowerCase().contains("delete") == true) {
        client.deleteItem(msgInfo.getUniqueUri(), DeletionOptions.getDeletePermanently()); // EWS
        System.out.println("Message deleted...." + msgInfo.getSubject());
    } else {
        // Do something else
    }
}

Copiare i messaggi

L’API Aspose.Email consente di copiare un messaggio da una cartella a un’altra usando il copyItem metodo. La versione sovraccaricata di questo metodo restituisce l’URI Unico del messaggio copiato, come mostrato in questo articolo.

Copiare un messaggio in un’altra cartella

Il seguente frammento di codice mostra come copiare un messaggio in un’altra cartella.

try {
    // Create instance of EWSClient class by giving credentials
    IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
    MailMessage message = new MailMessage("from@domain.com", "to@domain.com", "EMAILNET-34997 - " + UUID.randomUUID().toString(),
            "EMAILNET-34997 Exchange: Copy a message and get reference to the new Copy item");
    String messageUri = client.appendMessage(message);
    String newMessageUri = client.copyItem(messageUri, client.getMailboxInfo().getDeletedItemsUri());
} catch (java.lang.RuntimeException ex) {
    System.out.println(ex.getMessage());
}