使用 Exchange 邮箱和消息 - 在 Java 中从 Exchange 服务器读取电子邮件

使用 EWS 获取邮箱信息

EWSClient 类拥有成员,可通过调用以下内容从 Exchange Server 获取邮箱信息 IEWSClient.getMailboxInfo() 方法。它返回一种类型的实例 ExchangeMailboxInfo。从以下属性获取邮箱信息,例如 MailboxUri, InboxUriDraftsUri。本文展示了如何使用 Exchange Web Services 访问邮箱信息。

如果您想使用 Exchange Web Services(EWS)连接到 Exchange 服务器,请使用 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());

发送电子邮件

您可以借助 Aspose.Email.Exchange。IEWsClient.Send() 方法接受一个 MailMessage 实例作为参数并发送电子邮件。本文解释了如何使用 Exchange Web Services 发送电子邮件。

Aspose.Email 提供 IEWSClient 类,以使用 Exchange Web Services 连接到 Microsoft Exchange Server。以下代码片段展示了如何使用 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 for 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 代码片段展示了如何使用 EWS 连接到 Exchange 服务器并列出收件箱文件夹中的消息。

// 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 服务器邮箱获取消息并将其以 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 类。以下代码片段展示了如何使用 EWS 将 Exchange 服务器邮箱中的消息保存到内存流。

// 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() 返回实例的method MailMessage 类。然后调用 MailMessage.save() 方法将消息保存为 MSG。以下代码片段展示了如何使用 EWS 从 Exchange 服务器邮箱获取消息并将其保存为 MSG 格式。

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

从消息 URI 获取 ExchangeMessageInfo

电子邮件消息由其唯一标识符、URI 表示,是 … 的重要组成部分 ExchangeMessageInfo 对象。如果仅有消息 URI,则 ExchangeMessageInfo 也可以使用此可用信息检索对象。该方法的重载版本 listMessages 接受一个 Id 列表用于 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 服务器邮箱获取消息

在 Exchange 服务器上列出消息使用了 listMessages() 方法用于获取 Exchange 服务器邮箱中的消息列表。该 listMessages() 该方法获取消息的基本信息,例如主题、消息 ID、发件人和收件人。要获取完整的消息详情,Aspose.Email.Exchange 提供 IEWSClient.fetchMessage() 方法。此方法接受消息 URI 作为参数并返回该方法的实例 MailMessage 类。该 MailMessage 类随后提供消息详情,如正文、头部和附件。了解更多关于 MailMessage API,或了解如何使用该 API 管理电子邮件 MailMessage 类。获取 Exchange 服务器邮箱中的消息:

  1. 创建 IEWSClient 类型的实例。
  2. 指定服务器名称、用户名、密码和域。
  3. 调用 listMessages 获取 ExchangeMessageInfoCollection。
  4. 遍历 ExchangeMessageInfoCollection 集合以获取 ExchangeMessageInfo.UniqueURI 值。
  5. 调用 IEWSClient.fetchMessage() 并将 ExchangeMessageInfo.UniqueURI 作为参数传入。

以下代码片段展示了如何连接到 Exchange 服务器邮箱并使用 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 属性检索消息大小的相同功能。为了检索消息大小,使用对 IEWSClient 的 listMessages 的标准调用来获取集合 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("==================================");
}

递归下载消息

EWSClientlistSubFolders() 此方法可用于递归地从 Exchange 服务器邮箱的文件夹和子文件夹中获取消息。由于使用 EWS,需 Exchange Server 2007 或更高版本。以下代码片段展示了如何下载 Exchange 服务器的整个邮箱(包括文件夹和子文件夹)。文件夹结构将在本地创建并下载所有消息。

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移动 方法。它接受以下参数:

  • 待移动邮件的唯一 URI。
  • 目标文件夹的唯一 URI。

在文件夹之间移动消息

以下代码片段展示了如何将邮箱中的邮件从收件箱文件夹移动到名为 Processed 的文件夹。在此示例中,应用程序:

  1. 读取收件箱文件夹中的邮件。
  2. 根据某些条件处理部分邮件(在此示例中,我们在邮件主题中查找关键字)。
  3. 将满足给定条件的消息移动到已处理文件夹。
// 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
    }
}

删除消息

您可以借助 IEWSClientdeleteItem 方法。它以邮件的唯一 URI 作为参数。

以下代码片段展示了如何从收件箱文件夹删除消息。为了示例,代码:

  1. 读取收件箱文件夹中的邮件。
  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());
}