کار با صندوق ایمیل Exchange و پیام‌ها - خواندن ایمیل از سرور Exchange در Java

دریافت اطلاعات صندوق ایمیل با استفاده از EWS

این EWSClient کلاس دارای اعضایی است که می‌توان با فراخوانی آن، اطلاعات صندوق پستی را از یک سرور Exchange دریافت کرد IEWSClient.getMailboxInfo() متد. یک نمونه از نوع را برمی‌گرداند ExchangeMailboxInfo. اطلاعات صندوق پستی را از ویژگی‌هایی مانند MailboxUri, InboxUri و DraftsUri. این مقاله نشان می‌دهد چگونه اطلاعات صندوق ایمیل را با استفاده از Exchange Web Services دسترسی پیدا کنید.

اگر می‌خواهید با استفاده از Exchange Web Services (EWS) به سرور Exchange متصل شوید، از EWSClient کلاس. این کلاس از EWS برای اتصال و مدیریت موارد بر روی یک سرور Exchange استفاده می‌کند. قطعه کد Java زیر نشان می‌دهد که چگونه اطلاعات صندوق ایمیل را با استفاده از خدمات وب 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());

ارسال پیام‌های ایمیل

می‌توانید پیام‌های ایمیل را با استفاده از سرور 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 متد. با استفاده از آن اطلاعات پایهٔ پیام‌ها مانند موضوع، فرستنده، گیرنده و شناسهٔ پیام (Message ID) را دریافت کنید، با استفاده از 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 را فهرست کنید. امکان دریافت فهرست پیام‌ها از سایر پوشه‌ها نیز وجود دارد. The 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 کلاس. قطعه کد زیر نشان می‌دهد که چگونه پیام‌ها را از یک صندوق ایمیل سرور Exchange به یک استریم حافظه با استفاده از 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 دریافت کنید و با استفاده از EWS در قالب 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());
}

دریافت 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

لیست کردن پیام‌ها در سرور Exchange از listMessages() متد برای دریافت فهرست پیام‌ها از صندوق‌پستی سرور Exchange. listMessages() متد اطلاعات پایه‌ای دربارهٔ پیام‌ها را به‌دست می‌آورد، برای مثال موضوع، شناسهٔ پیام، فرستنده و گیرنده. برای دریافت جزئیات کامل پیام، Aspose.Email.Exchange متد IEWSClient.fetchMessage() را فراهم می‌کند. این متد URI پیام را به‌عنوان پارامتر می‌پذیرد و یک نمونه از MailMessage کلاس. MailMessage کلاس سپس جزئیات پیام مانند بدنه، هدرها و پیوست‌ها را فراهم می‌کند. برای اطلاعات بیشتر دربارهٔ MailMessage 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 را فراهم می‌کند. برای دریافت اندازه پیام، فراخوانی استاندارد به متد 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 به صورت بازگشتی استفاده شود. این به Exchange Server 2007 یا بالاتر نیاز دارد، زیرا از EWS استفاده می‌کند. قطعه کد زیر نشان می‌دهد چگونه تمام صندوق‌نامه (پوشه‌ها و زیردرخت‌ها) یک سرور 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 منحصر به‌فرد پوشه مقصد.

انتقال پیام‌ها بین پوشه‌ها

قطعه کد زیر نحوه انتقال یک پیام در صندوق‌صندوق ایمیل از پوشه Inbox به پوشه‌ای به نام Processed را نشان می‌دهد. در این مثال، برنامه:

  1. پیام‌ها را از پوشهٔ Inbox می‌خواند.
  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
    }
}

حذف پیام‌ها

می‌توانید پیام‌های ایمیل را از یک پوشه با کمک 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
    }
}

کپی کردن پیام‌ها

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