Робота з поштовою скринькою Exchange та повідомленнями — читання електронної пошти з сервера Exchange на Java

Contents
[ ]

Отримання інформації про скриньку за допомогою EWS

The EWSClient клас має члени, які можна використовувати для отримання інформації про поштову скриньку з Exchange Server шляхом виклику IEWSClient.getMailboxInfo() метод. Повертає екземпляр типу ExchangeMailboxInfo. Отримати інформацію про поштову скриньку зі властивостей, таких як MailboxUri, InboxUri і DraftsUri. У цій статті показано, як отримати інформацію про скриньку за допомогою Exchange Web Services.

Якщо ви хочете підключитися до сервера Exchange за допомогою Exchange Web Services (EWS), використовуйте EWSClient клас. Цей клас використовуе EWS для підключення та управління елементами на сервері Exchange. Наступний фрагмент коду Java показує, як отримати інформацію про скриньку за допомогою Exchange Web Services.

// 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());

Надсилання електронних листів

Ви можете надсилати електронні листи за допомогою Exchange Server, використовуючи інструменти в Aspose.Email.Exchange. Метод IEWSClient.Send() приймає MailMessage екземпляр як параметр і надсилає лист. У цій статті пояснюється, як надсилати електронні листи за допомогою Exchange Web Services.

Aspose.Email надає клас IEWSClient для підключення до Microsoft Exchange Server за допомогою Exchange Web Services. Наступний фрагмент коду показує, як використати EWS для надсилання листів через Microsoft Exchange Server. Наступний фрагмент коду Java показує, як надсилати електронні листи за допомогою 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);

Отримання класу повідомлення

The getMessageClass() метод ExchangeMessageInfo клас отримує рядок, що представляє клас повідомлення. Нижче наведено приклад коду, який показує, як отримати клас повідомлення:

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

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

Читання листів з поштової скриньки іншого користувача

Деякі облікові записи на серверах Exchange мають право доступу до декількох скриньок, а деякі користувачі мають кілька електронних скриньок на одному сервері Exchange. У обох випадках користувачі можуть отримати доступ до скриньок інших користувачів за допомогою Aspose.Email для Java. Це API забезпечує механізм доступу до папок та листів з інших скриньок за допомогою IEWSClient клас. Цю функціональність можна реалізувати за допомогою перевантаженого getMailboxInfo() методу, передаючи адресу електронної пошти користувача як параметр.

Наступний фрагмент коду показує, як читати електронну пошту за допомогою IEWSClient клас.

// 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");

Перелічення повідомлень

Список електронних повідомлень у поштовій скриньці Exchange можна отримати, викликавши IEWSClient.listMessages метод. Отримайте базову інформацію про повідомлення, таку як тема, від, до та ідентифікатор повідомлення, використовуючи listMessages метод.

Просте перелічення повідомлень

Щоб перелічити повідомлення у поштовій скриньці Exchange:

  1. Створіть екземпляр IEWSClient клас.
  2. Викличте метод listMessages і створіть колекцію повідомлень.
  3. Пройдіться по колекції та відобразьте інформацію про повідомлення.

Наступний фрагмент коду Java показує, як підключитися до сервера Exchange за допомогою EWS та перелічити повідомлення з папки Inbox.

// 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());
}

Перелік повідомлень з різних папок

Вищенаведені фрагменти коду, перелічити всі повідомлення у папці Inbox. Також можна отримати список повідомлень з інших папок. IEWSClient.listMessages() метод приймає URI папки як параметр. Якщо URI папки дійсний, можна отримати список повідомлень з цієї папки. Використовуйте властивість IEWSClient.getMailboxInfo().getXXXFolderUri, щоб отримати URI різних папок. Решта коду така ж, як для отримання списку повідомлень. Наступний фрагмент коду показує, як перелічувати повідомлення з різних папок за допомогою 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);

Перелік повідомлень з підтримкою посторінкового перегляду

Наступний фрагмент коду Java показує, як отримати список повідомлень з підтримкою посторінкового перегляду.

// 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();
}

Отримання інформації про тип повідомлення з ExchangeMessageInfo

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

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

Збереження повідомлень

У цій статті показано, як отримати повідомлення з поштової скриньки Exchange Server та зберегти їх на диск у форматах EML і MSG:

  • Зберегти у форматі EML на диск.
  • Зберегти у пам’ять‑потік.
  • Зберегти у форматі MSG.

Збереження повідомлень у EML

Щоб отримати повідомлення і зберегти у форматі EML:

  1. Створіть екземпляр класу IEWSClient.
  2. Вкажіть mailboxUri, ім’я користувача, пароль і домен.
  3. Викличте метод IEWSClient.listMessages(), щоб отримати екземпляр колекції ExchangeMessagesInfoCollection.
  4. Пройдіться у циклі по колекції ExchangeMessagesInfoCollection, щоб отримати унікальний URI для кожного повідомлення.
  5. Викличте метод IEWSClient.saveMessage() і передайте унікальний URI як параметр.
  6. Надайте методу saveMessage() шлях, куди ви хочете зберегти файл.

Наступний фрагмент коду показує, як використати EWS для підключення до сервера Exchange та зберегти повідомлення у вигляді файлів 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");
}

Збереження повідомлень у пам’ять‑потік

Замість збереження файлів EML на диск їх можна зберегти у пам’ять‑потік. Це корисно, коли потрібно зберегти потік у сховище, наприклад, базу даних. Після збереження потоку у базу даних, ви можете завантажити файл EML у MailMessage клас. Наступний фрагмент коду показує, як зберегти повідомлення з поштової скриньки Exchange Server у пам’ять‑потік за допомогою 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);
}

Збереження повідомлень у форматі MSG

The IEWSClient.saveMessage() метод може безпосередньо зберегти повідомлення у форматі EML. Щоб зберегти повідомлення у форматі MSG, спершу викличте IEWSClient.fetchMessage() метод, який повертає екземпляр MailMessage клас. Потім викличте MailMessage.save() метод для збереження повідомлення у форматі MSG. Наступний фрагмент коду показує, як отримати повідомлення з поштової скриньки Exchange Server та зберегти їх у форматі MSG за допомогою 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());
}

Отримання ExchangeMessageInfo з URI повідомлення

Електронне повідомлення представлено його унікальним ідентифікатором, URI і є невід’ємною частиною ExchangeMessageInfo об’єкт. Якщо доступний лише URI повідомлення, тоді ExchangeMessageInfo об’єкт також можна отримати, використовуючи цю доступну інформацію. Перевантажена версія listMessages приймає список ідентифікаторів для використання ExchangeMessageInfoCollection. Наступний фрагмент коду показує, як отримати ExchangeMessageInfo з URI повідомлення.

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());
}

Отримання повідомлень з поштової скриньки Exchange Server

Перелік повідомлень на сервері Exchange використав listMessages() метод для отримання списку повідомлень з поштової скриньки Exchange Server. The listMessages() метод отримує базову інформацію про повідомлення, наприклад, тему, ідентифікатор повідомлення, від і до. Щоб отримати повні деталі повідомлення, Aspose.Email.Exchange надає метод IEWSClient.fetchMessage(). Цей метод приймає URI повідомлення як параметр і повертає екземпляр MailMessage клас. The MailMessage клас потім надає деталі повідомлення, такі як тіло, заголовки та вкладення. Дізнайтеся більше про MailMessage API, або дізнайтеся, як керувати електронною поштою за допомогою MailMessage клас. Щоб отримати повідомлення з поштової скриньки Exchange Server:

  1. Створіть екземпляр типу IEWSClient.
  2. Вкажіть назву сервера, ім’я користувача, пароль та домен.
  3. Викличте listMessages, щоб отримати ExchangeMessageInfoCollection.
  4. Пройдіться у циклі по колекції ExchangeMessageInfoCollection, щоб отримати значення ExchangeMessageInfo.UniqueURI.
  5. Викличте IEWSClient.fetchMessage() і передайте ExchangeMessageInfo.UniqueURI як параметр.

Наступний фрагмент коду показує, як підключитися до поштової скриньки Exchange Server та отримати всі повідомлення за допомогою 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());
    }
}

Використання методу FetchItem для отримання повідомлення

The FetchItem метод більше підходить, якщо ви хочете отримати MapiMessage і працювати з властивостями MAPI. Ви також можете використовувати цей метод для отримання будь‑якого елементу Outlook, такого як контакт, зустріч, завдання тощо.

// 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();
}

Попереднє отримання розміру повідомлення

Microsoft Outlook InterOp забезпечує можливість отримання розміру повідомлення до фактичного завантаження повного повідомлення з сервера. У випадку Aspose.Email API, інформація підсумку, отримана з сервера Exchange, представлена ExchangeMessageInfo клас. Він забезпечує таку ж функцію отримання розміру повідомлення за допомогою властивості Size. Для отримання розміру повідомлення використовується стандартний виклик listMessages IEWSClient, який повертає колекцію ExchangeMessageInfo. У наведеному фрагменті коду показано, як відобразити розмір повідомлення за допомогою ExchangeMessageInfo клас.

// 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("==================================");
}

Рекурсивне завантаження повідомлень

The EWSClient’s listSubFolders() метод можна використовувати для отримання повідомлень з папок і підпапок поштової скриньки Exchange Server рекурсивно. Це вимагає Exchange Server 2007 або новіший, оскільки використовується EWS. У наведеному фрагменті коду показано, як завантажити всю поштову скриньку (папки та підпапки) Exchange Server. Структура папок створюється локально, і всі повідомлення завантажуються.

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) {
    }
}

Завантаження повідомлень з публічних папок

Microsoft Exchange Server дозволяє користувачам створювати публічні папки та розміщувати в них повідомлення. Щоб зробити це через ваш додаток, використовуйте Aspose.Email EWSClient клас для підключення до Exchange Server та читання і завантаження повідомлень і дописів з публічних папок. У наведеному фрагменті коду показано, як читати всі публічні папки та підпапки, а також перераховувати і завантажувати будь‑які повідомлення, знайдені в цих папках. Цей приклад працює лише з Microsoft Exchange Server 2007 або новішим, оскільки лише вони підтримують 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);
        }
    }
}

Переміщення повідомлень

Ви можете переміщати електронні повідомлення з однієї папки в іншу за допомогою IEWSClient клас перемістити метод. Приймає параметри:

  • Унікальний URI повідомлення, яке потрібно перемістити.
  • Унікальний URI папки призначення.

Переміщення повідомлень між папками

У наведеному фрагменті коду показано, як перемістити повідомлення в поштовій скриньці з папки Inbox у папку під назвою Processed. У цьому прикладі застосунок:

  1. Читає повідомлення з папки Inbox.
  2. Обробляє частину повідомлень за певним критерієм (у цьому прикладі — шукає ключове слово у темі повідомлення).
  3. Переміщує повідомлення, які відповідають заданій умові, у папку processed.
// 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
    }
}

Видалення повідомлень

Ви можете видаляти електронні листи з папки за допомогою IEWSClient клас deleteItem метод. Він приймає унікальний URI повідомлення як параметр.

Наступний фрагмент коду показує, як видалити повідомлення з папки Inbox. Для прикладу, код:

  1. Читає повідомлення з папки Inbox.
  2. Обробка листів за певними критеріями (у цьому прикладі ми шукаємо ключове слово в темі листа).
  3. Видаляє повідомлення.
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
    }
}

Копіювання повідомлень

Aspose.Email API дозволяє копіювати повідомлення з однієї папки в іншу за допомогою copyItem метод. Перевантажена версія цього методу повертає унікальний URI скопійованого повідомлення, як показано в цій статті.

Копіювання повідомлення в іншу папку

Наступний фрагмент коду показує, як скопіювати повідомлення в іншу папку.

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());
}