Làm việc với Hộp thư và Tin nhắn Exchange - Đọc Email từ máy chủ Exchange bằng Java

Lấy Thông tin Hộp thư bằng EWS

Cái EWSClient lớp có các thành viên có thể được sử dụng để lấy thông tin hộp thư từ Exchange Server bằng cách gọi IEWSClient.getMailboxInfo() phương thức. Nó trả về một instance của kiểu ExchangeMailboxInfo. Lấy thông tin hộp thư từ các thuộc tính như MailboxUri, InboxUriDraftsUri. Bài viết này cho biết cách truy cập thông tin hộp thư bằng Exchange Web Services.

Nếu bạn muốn kết nối tới máy chủ Exchange bằng Exchange Web Services (EWS), sử dụng EWSClient lớp. Lớp này sử dụng EWS để kết nối và quản lý các mục trên một máy chủ Exchange. Đoạn mã Java dưới đây cho thấy cách lấy thông tin hộp thư bằng dịch vụ 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());

Gửi Tin nhắn Email

Bạn có thể gửi tin nhắn email bằng một máy chủ Exchange với sự trợ giúp của các công cụ trong Aspose.Email.Exchange. Phương thức IEWSClient.Send() nhận một MailMessage thể hiện làm tham số và gửi email. Bài viết này giải thích cách gửi tin nhắn email bằng Exchange Web Services.

Aspose.Email cung cấp lớp IEWSClient để kết nối tới Microsoft Exchange Server bằng Exchange Web Services. Đoạn mã dưới đây cho thấy cách sử dụng EWS để gửi email bằng Microsoft Exchange Server. Đoạn mã Java dưới đây cho thấy cách gửi tin nhắn email bằng 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);

Lấy Lớp Tin nhắn

Cái getMessageClass() phương thức của ExchangeMessageInfo lớp nhận một chuỗi đại diện cho lớp của tin nhắn. Đoạn mã mẫu dưới đây cho thấy cách lấy lớp tin nhắn:

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

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

Đọc Email từ Hộp thư của Người dùng Khác

Một số tài khoản trên máy chủ Exchange có quyền truy cập vào nhiều hộp thư, và một số người dùng có nhiều tài khoản email trên cùng một máy chủ Exchange. Trong cả hai trường hợp, người dùng có thể truy cập hộp thư của người dùng khác bằng Aspose.Email cho Java. API này cung cấp cơ chế để truy cập thư mục và email từ các hộp thư khác bằng IEWSClient lớp. Chức năng này có thể đạt được bằng cách sử dụng phiên bản overload của getMailboxInfo() phương thức và cung cấp địa chỉ email người dùng làm tham số.

Đoạn mã dưới đây cho thấy cách đọc email bằng IEWSClient lớp.

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

Liệt kê Tin nhắn

Danh sách các email trong hộp thư Exchange có thể được lấy bằng cách gọi IEWSClient.listMessages phương thức. Lấy thông tin cơ bản về tin nhắn, như tiêu đề, người gửi, người nhận và ID tin nhắn, bằng cách sử dụng listMessages phương thức.

Liệt kê Tin nhắn Đơn giản

Để liệt kê các tin nhắn trong hộp thư Exchange:

  1. Tạo một đối tượng của IEWSClient lớp.
  2. Gọi phương thức listMessages và tạo một bộ sưu tập tin nhắn.
  3. Lặp qua bộ sưu tập và hiển thị thông tin tin nhắn.

Đoạn mã Java dưới đây cho thấy cách kết nối tới một máy chủ exchange bằng EWS và liệt kê tin nhắn từ thư mục 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());
}

Liệt kê Tin nhắn từ Các Thư mục Khác

Các đoạn mã trên, liệt kê tất cả các tin nhắn trong thư mục Hộp đến. Cũng có thể lấy danh sách tin nhắn từ các thư mục khác. The IEWSClient.listMessages() phương thức nhận một folder URI làm tham số. Miễn là folder URI hợp lệ, bạn có thể lấy danh sách tin nhắn từ thư mục đó. Sử dụng thuộc tính IEWSClient.getMailboxInfo().getXXXFolderUri để lấy URI của các thư mục khác nhau. Phần còn lại của mã giống như việc lấy danh sách tin nhắn. Đoạn mã dưới đây cho thấy cách liệt kê tin nhắn từ các thư mục khác nhau bằng 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);

Liệt kê Tin nhắn với Hỗ trợ Phân trang

Đoạn mã Java dưới đây cho thấy cách lấy danh sách tin nhắn có hỗ trợ phân trang.

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

Lấy Thông tin Loại Tin nhắn từ ExchangeMessageInfo

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

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

Lưu Tin nhắn

Bài viết này cho biết cách lấy tin nhắn từ hộp thư máy chủ Exchange và lưu chúng vào đĩa ở định dạng EML và MSG:

  • Lưu dưới dạng EML trên đĩa.
  • Lưu vào luồng bộ nhớ.
  • Lưu dưới dạng MSG.

Lưu Tin nhắn dưới dạng EML

Để lấy tin nhắn và lưu ở định dạng EML:

  1. Tạo một thể hiện của lớp IEWSClient.
  2. Cung cấp mailboxUri, tên người dùng, mật khẩu và miền.
  3. Gọi phương thức IEWSClient.listMessages() để nhận một thể hiện của tập hợp ExchangeMessagesInfoCollection.
  4. Duyệt qua tập hợp ExchangeMessagesInfoCollection để lấy URI duy nhất cho mỗi tin nhắn.
  5. Gọi phương thức IEWSClient.saveMessage() và truyền URI duy nhất làm tham số.
  6. Cung cấp cho phương thức saveMessage() một đường dẫn tới nơi bạn muốn lưu tệp.

Đoạn mã dưới đây cho thấy cách sử dụng EWS để kết nối tới máy chủ Exchange và lưu tin nhắn dưới dạng tệp 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");
}

Lưu Tin nhắn vào Luồng Bộ nhớ

Thay vì lưu các tệp EML vào đĩa, bạn có thể lưu chúng vào một luồng bộ nhớ. Điều này hữu ích khi bạn muốn lưu luồng vào một vị trí lưu trữ như cơ sở dữ liệu. Khi luồng đã được lưu vào cơ sở dữ liệu, bạn có thể tải lại tệp EML vào MailMessage lớp. Đoạn mã dưới đây cho thấy cách lưu tin nhắn từ hộp thư máy chủ Exchange vào một luồng bộ nhớ bằng 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);
}

Lưu Tin nhắn ở Định dạng MSG

Cái IEWSClient.saveMessage() phương thức có thể trực tiếp lưu tin nhắn dưới dạng EML. Để lưu tin nhắn dưới dạng MSG, trước tiên gọi IEWSClient.fetchMessage() phương thức trả về một thể hiện của MailMessage lớp. Sau đó gọi MailMessage.save() phương thức để lưu tin nhắn dưới dạng MSG. Đoạn mã dưới đây cho thấy cách lấy tin nhắn từ hộp thư máy chủ Exchange và lưu chúng ở định dạng MSG bằng 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());
}

Lấy ExchangeMessageInfo từ URI của Tin nhắn

Một tin nhắn email được đại diện bằng định danh duy nhất, URI, và là phần không thể thiếu của ExchangeMessageInfo đối tượng. Trong trường hợp chỉ có URI của tin nhắn, thì ExchangeMessageInfo đối tượng cũng có thể được truy xuất bằng thông tin có sẵn này. Phiên bản overload của listMessages lấy một danh sách các Id để sử dụng ExchangeMessageInfoCollection. Đoạn mã dưới đây cho thấy cách lấy ExchangeMessageInfo từ URI của tin nhắn.

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

Lấy Tin Nhắn từ Hộp Thư Exchange Server

Liệt kê Tin Nhắn trên Exchange Server đã sử dụng listMessages() phương thức để lấy danh sách tin nhắn từ hộp thư Exchange Server. listMessages() phương thức nhận thông tin cơ bản về tin nhắn, ví dụ: tiêu đề, ID tin nhắn, người gửi và người nhận. Để nhận chi tiết đầy đủ của tin nhắn, Aspose.Email.Exchange cung cấp phương thức IEWSClient.fetchMessage(). Phương thức này nhận URI của tin nhắn làm tham số và trả về một thể hiện của MailMessage lớp. MailMessage lớp sau đó cung cấp chi tiết tin nhắn như nội dung, tiêu đề và tệp đính kèm. Tìm hiểu thêm về MailMessage API, hoặc tìm hiểu cách quản lý email với MailMessage lớp. Để lấy tin nhắn từ Hộp thư máy chủ Exchange:

  1. Tạo một thể hiện của kiểu IEWSClient.
  2. Chỉ định tên máy chủ, tên người dùng, mật khẩu và miền.
  3. Gọi listMessages để lấy ExchangeMessageInfoCollection.
  4. Duyệt qua tập hợp ExchangeMessageInfoCollection để lấy các giá trị ExchangeMessageInfo.UniqueURI.
  5. Gọi IEWSClient.fetchMessage() và truyền ExchangeMessageInfo.UniqueURI làm tham số.

Đoạn mã dưới đây cho thấy bạn kết nối tới hộp thư máy chủ Exchange và lấy tất cả các tin nhắn bằng cách sử dụng 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());
    }
}

Sử dụng phương thức FetchItem để lấy một tin nhắn

Cái FetchItem phương pháp này được ưu tiên hơn nếu bạn muốn lấy một MapiMessage và thao tác với các thuộc tính MAPI. Bạn cũng có thể sử dụng phương pháp này để lấy bất kỳ mục Outlook nào, chẳng hạn như liên hệ, cuộc hẹn, công việc, v.v.

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

Lấy trước kích thước tin nhắn

Microsoft Outlook InterOp cung cấp tính năng lấy kích thước tin nhắn trước khi thực tế tải toàn bộ tin nhắn từ máy chủ. Trong trường hợp Aspose.Email API, thông tin tóm tắt được lấy từ máy chủ Exchange được biểu diễn bằng ExchangeMessageInfo lớp. Nó cung cấp cùng tính năng lấy kích thước tin nhắn bằng thuộc tính Size. Để lấy kích thước tin nhắn, cuộc gọi tiêu chuẩn tới listMessages của IEWSClient được sử dụng để lấy bộ sưu tập của ExchangeMessageInfo. Đoạn mã dưới đây cho bạn thấy cách hiển thị kích thước tin nhắn bằng cách sử dụng ExchangeMessageInfo lớp.

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

Tải tin nhắn đệ quy

Cái EWSClientcủa listSubFolders() phương pháp có thể được sử dụng để lấy tin nhắn từ các thư mục và thư mục con trong hộp thư của Exchange Server một cách đệ quy. Điều này yêu cầu Exchange Server 2007 trở lên, vì nó sử dụng EWS. Đoạn mã dưới đây cho bạn thấy cách tải xuống toàn bộ hộp thư (các thư mục và thư mục con) của một Exchange Server. Cấu trúc thư mục được tạo cục bộ và tất cả các tin nhắn được tải xuống.

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

Tải xuống tin nhắn từ các thư mục công cộng

Microsoft Exchange Server cho phép người dùng tạo các thư mục công cộng và đăng tin nhắn vào chúng. Để thực hiện điều này qua ứng dụng của bạn, sử dụng Aspose.Email’s EWSClient lớp để kết nối tới Exchange Server và đọc và tải xuống các tin nhắn và bài đăng từ các thư mục công cộng. Đoạn mã dưới đây cho bạn thấy cách đọc tất cả các thư mục công cộng và các thư mục con, và liệt kê và tải xuống bất kỳ tin nhắn nào được tìm thấy trong các thư mục này. Ví dụ này chỉ hoạt động với Microsoft Exchange Server 2007 trở lên vì chỉ các phiên bản này hỗ trợ 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);
        }
    }
}

Di chuyển tin nhắn

Bạn có thể di chuyển email từ thư mục này sang thư mục khác bằng cách sử dụng IEWSClient lớp di chuyển phương thức. Nó nhận các tham số:

  • URI duy nhất của tin nhắn cần di chuyển.
  • URI duy nhất của thư mục đích.

Di chuyển tin nhắn giữa các thư mục

Đoạn mã dưới đây cho bạn thấy cách di chuyển một tin nhắn trong hộp thư từ thư mục Inbox sang thư mục có tên Processed. Trong ví dụ này, ứng dụng:

  1. Đọc tin nhắn từ thư mục Inbox.
  2. Xử lý một số tin nhắn dựa trên tiêu chí (trong ví dụ này, chúng tôi tìm một từ khóa trong tiêu đề tin nhắn).
  3. Di chuyển các tin nhắn đáp ứng điều kiện đã cho vào thư mục đã xử lý.
// 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
    }
}

Xóa tin nhắn

Bạn có thể xóa các tin email từ một thư mục bằng sự trợ giúp của IEWSClient lớp deleteItem phương thức. Nó nhận URI duy nhất của tin nhắn làm tham số.

Đoạn mã dưới đây cho thấy cách xóa một tin nhắn khỏi thư mục Inbox. Đối với ví dụ này, mã:

  1. Đọc tin nhắn từ thư mục Inbox.
  2. Xử lý tin nhắn dựa trên một số tiêu chí (trong ví dụ này, chúng tôi tìm một từ khóa trong tiêu đề tin nhắn).
  3. Xóa tin nhắn.
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
    }
}

Sao chép Tin nhắn

API Aspose.Email cho phép sao chép một tin nhắn từ thư mục này sang thư mục khác bằng cách sử dụng copyItem phương thức. Phiên bản overload của phương thức này trả về URI duy nhất của tin nhắn đã sao chép như được mô tả trong bài viết này.

Sao chép Tin nhắn tới Thư mục Khác

Đoạn mã dưới đây cho thấy cách sao chép một tin nhắn tới thư mục khác.

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