Работа с почтовым ящиком Exchange и сообщениями — чтение электронной почты с сервера Exchange на Java

Contents
[ ]

Получение информации о почтовом ящике с помощью EWS

Этот 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 с помощью инструментов в 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);

Получение класса сообщения

Этот 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 метод. Получите базовую информацию о сообщениях, такую как тема, от кого, кому и ID сообщения, используя listMessages метод.

Простой вывод сообщений

Чтобы вывести сообщения в почтовом ящике Exchange:

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

Следующий фрагмент кода Java показывает, как подключиться к серверу Exchange с использованием EWS и вывести сообщения из папки входящих.

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

Список сообщений из разных папок

Вышеприведённые фрагменты кода, вывести все сообщения во входящей папке. Также можно получить список сообщений из других папок. 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

Этот 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 для получения сообщения

Этот 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("==================================");
}

Рекурсивная загрузка сообщений

Этот 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 и чтения и загрузки сообщений и постов из публичных папок. Следующий фрагмент кода показывает, как читать все публичные папки и подпапки, а также перечислять и загружать любые найденные в этих папках сообщения. Этот пример работает только с 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 класс move метод. Принимает параметры:

  • Уникальный 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 сообщения в качестве параметра.

Следующий фрагмент кода показывает, как удалить сообщение из папки «Входящие». Для целей примера код:

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

Копирование сообщений

API Aspose.Email позволяет копировать сообщение из одной папки в другую с помощью 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());
}