کار با پوشه‌ها در سرور Exchange

فهرست تمام پوشه‌ها از سرور

API Aspose.Email امکان اتصال به Exchange Server و فهرست‌کردن تمام پوشه‌ها و زیرپوشه‌ها را فراهم می‌کند. همچنین می‌توانید تمام زیرپوشه‌ها را به‌صورت بازگشتی از هر پوشه دریافت کنید. این API قابلیت فهرست‌گذاری پوشه‌ها با صفحه‌بندی از کلاینت Exchange با استفاده از Exchange Web Service (EWS) را نیز دارد. این مقاله نشان می‌دهد چگونه تمام زیرپوشه‌ها را از سرور Exchange دریافت کرده و پوشه‌ها را با صفحه‌بندی دریافت کنید.

قطعه کد زیر نشان می‌دهد چگونه پوشه‌ها را از سرور Exchange فهرست کنید.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
public static void run() {
    try {
        IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
        System.out.println("Downloading all messages from Inbox....");

        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
            listSubFolders(client, folderInfo);
        }

        System.out.println("All messages downloaded.");
    } catch (java.lang.RuntimeException ex) {
        System.out.println(ex.getMessage());
    }
}

private static void listSubFolders(IEWSClient client, ExchangeFolderInfo folderInfo) {
    // Create the folder in disk (same name as on IMAP server)
    System.out.println(folderInfo.getDisplayName());
    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) {
            listSubFolders(client, subfolderInfo);
        }
    } catch (java.lang.RuntimeException e) {
    }
}

دریافت اطلاعات نوع پوشه با استفاده از EWS

این FolderType خاصیتی که ارائه شده توسط ExchangeFolderInfo کلاسی که می‌تواند اطلاعاتی درباره نوع پوشه دریافت کند. همان‌طور که در نمونه کد زیر نشان داده شده است.

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

ExchangeFolderInfoCollection folderInfoCol = client.listSubFolders(client.getMailboxInfo().getRootUri());
for (ExchangeFolderInfo folderInfo : (Iterable<ExchangeFolderInfo>) folderInfoCol) {
    switch (folderInfo.getFolderType()) {
    case ExchangeFolderType.Appointment:
        // handle Appointment
        break;
    case ExchangeFolderType.Contact:
        // handle Contact
        break;
    case ExchangeFolderType.Task:
        // handle Task
        break;
    case ExchangeFolderType.Note:
        // handle email message
        break;
    case ExchangeFolderType.StickyNote:
        // handle StickyNote
        break;
    case ExchangeFolderType.Journal:
        // handle Journal
        break;
    default:
        break;
    }
}

فهرست‌گذاری پوشه‌ها با پشتیبانی از صفحه‌بندی با استفاده از EWS

قطعه کد زیر نشان می‌دهد چگونه از پشتیبانی از صفحه‌بندی با استفاده از 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());
int itemsPerPage = 5;
List<PageInfo> pages = new ArrayList<PageInfo>();
PageInfo pagedMessageInfoCol = client.listMessagesByPage(client.getMailboxInfo().getInboxUri(), itemsPerPage);
pages.add(pagedMessageInfoCol);
while (!pagedMessageInfoCol.getLastPage()) {
    pagedMessageInfoCol = client.listMessagesByPage(client.getMailboxInfo().getInboxUri(), itemsPerPage);
    pages.add(pagedMessageInfoCol);
}
pagedMessageInfoCol = client.listMessagesByPage(client.getMailboxInfo().getInboxUri(), itemsPerPage);
while (!pagedMessageInfoCol.getLastPage()) {
    client.listMessages(client.getMailboxInfo().getInboxUri());
}

دسترسی به پوشه‌ها یا زیرپوشه‌های سفارشی صندوق‌پستی

IEWSClient به توسعه‌دهندگان امکان می‌دهد به هر پوشه یا زیرپوشهٔ سفارشی از صندوق‌پستی دسترسی پیدا کنند. folderExists() عملکرد IEWSClient URI یک پوشه/زیرپوشهٔ سفارشی مشخص را برمی‌گرداند که سپس می‌توان برای دسترسی به پوشه هدف از آن استفاده کرد. در مثال زیر، پوشهٔ سفارشی به نام «TestInbox» که زیر INBOX ایجاد شده است، دسترسی پیدا می‌شود و تمام پیام‌های این پوشه نمایش داده می‌شوند. برای انجام این کار، مراحل زیر هستند:

  1. شیء IEWSClient را با ارائهٔ اعتبارهای معتبر مقداردهی اولیه کنید.
  2. به صندوق‌پستی پیش‌فرض دسترسی پیدا کنید.
  3. به پوشهٔ والد دسترسی پیدا کنید، که در این مثال INBOX است. این پوشهٔ والد می‌تواند خود یک پوشهٔ سفارشی نیز باشد.
  4. از folderExists() برای جستجوی زیرپوشهٔ سفارشی مشخص شده، به عنوان مثال «TestInbox» استفاده کنید. این متد URI «TestInbox» را بازمی‌گرداند.
  5. از این URI برای دسترسی به تمام پیام‌های آن پوشهٔ سفارشی استفاده کنید.

قطعه کد زیر نشان می‌دهد چگونه با EWS به پوشه‌ها یا زیرپوشه‌های سفارشی صندوق‌پستی دسترسی پیدا کنید.

// Create instance of EWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

// Create ExchangeMailboxInfo, ExchangeMessageInfoCollection instance
ExchangeMailboxInfo mailbox = client.getMailboxInfo();
ExchangeMessageInfoCollection messages = null;
ExchangeFolderInfo subfolderInfo = new ExchangeFolderInfo();

// Check if specified custom folder exisits and Get all the messages info from the target Uri
ExchangeFolderInfo[] referenceToSubfolderInfo = { subfolderInfo };
client.folderExists(mailbox.getInboxUri(), "TestInbox", /* out */ referenceToSubfolderInfo);
subfolderInfo = referenceToSubfolderInfo[0];

// if custom folder exists
if (subfolderInfo != null) {
    messages = client.listMessages(subfolderInfo.getUri());

    // Parse all the messages info collection
    for (ExchangeMessageInfo info : (Iterable<ExchangeMessageInfo>) messages) {
        String strMessageURI = info.getUniqueUri();
        // now get the message details using FetchMessage()
        MailMessage msg = client.fetchMessage(strMessageURI);
        System.out.println("Subject: " + msg.getSubject());
    }
} else {
    System.out.println("No folder with this name found.");
}

فهرست‌بندی پوشه‌های عمومی

Microsoft Exchange Server به کاربران اجازه می‌دهد پوشه‌های عمومی ایجاد کنند و پیام‌ها را در آن‌ها ارسال کنند. برای انجام این کار از طریق برنامهٔ خود، از Aspose.Email استفاده کنید. EWSClient کلاسی برای اتصال به Exchange Server و خواندن و دانلود پیام‌ها و پست‌ها از پوشه‌های عمومی. قطعه کد زیر نشان می‌دهد چگونه تمام پوشه‌های عمومی و زیرپوشه‌ها را بخوانید و هر پیامی که در این پوشه‌ها یافت شد را فهرست و دانلود کنید. این مثال تنها با Microsoft Exchange Server 2007 یا بالاتر کار می‌کند، زیرا تنها این نسخه‌ها از EWS پشتیبانی می‌کنند.

public static void run() {
    try {
        readPublicFolders();
    } catch (java.lang.RuntimeException ex) {
        System.out.println(ex.getMessage());
    }
}

private static void readPublicFolders() {
    NetworkCredential credential = new NetworkCredential(username, password, domain);
    IEWSClient client = EWSClient.getEWSClient(mailboxUri, credential);

    ExchangeFolderInfoCollection folders = client.listPublicFolders();
    for (ExchangeFolderInfo publicFolder : (Iterable<ExchangeFolderInfo>) folders) {
        System.out.println("Name: " + publicFolder.getDisplayName());
        System.out.println("Subfolders count: " + publicFolder.getChildFolderCount());
        listMessagesFromSubFolder(publicFolder, client);

    }
}

private static void listMessagesFromSubFolder(ExchangeFolderInfo publicFolder, IEWSClient client) {
    System.out.println("Folder Name: " + publicFolder.getDisplayName());
    ExchangeMessageInfoCollection msgInfoCollection = client.listMessagesFromPublicFolder(publicFolder);
    for (ExchangeMessageInfo messageInfo : (Iterable<ExchangeMessageInfo>) msgInfoCollection) {
        MailMessage msg = client.fetchMessage(messageInfo.getUniqueUri());
        System.out.println(msg.getSubject());
        msg.save(dataDir + msg.getSubject() + ".msg", SaveOptions.getDefaultMsgUnicode());
    }

    // Call this method recursively for any subfolders
    if (publicFolder.getChildFolderCount() > 0) {
        ExchangeFolderInfoCollection subfolders = client.listSubFolders(publicFolder);
        for (ExchangeFolderInfo subfolder : (Iterable<ExchangeFolderInfo>) subfolders) {
            listMessagesFromSubFolder(subfolder, client);
        }
    }
}

کپی یک پیام به پوشهٔ دیگر

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

همگام‌سازی موارد پوشه

APIهای Aspose.Email برای Java IEWSClient ویژگی همگام‌سازی یک پوشه Exchange برای محتویات آن را فراهم می‌کند. syncFolder متدی که توسط IEWSClient کلاسی که می‌تواند برای انجام اطلاعات همگام‌سازی پوشه روی یک پوشه مشخص استفاده شود. قطعه کد زیر نشان می‌دهد چگونه اطلاعات پوشه Exchange را همگام‌سازی کنید.

IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
MailMessage message1 = new MailMessage("user@domain.com", "user@domain.com", "EMAILNET-34738 - " + UUID.randomUUID().toString(), "EMAILNET-34738 Sync Folder Items");
client.send(message1);

MailMessage message2 = new MailMessage("user@domain.com", "user@domain.com", "EMAILNET-34738 - " + UUID.randomUUID().toString(), "EMAILNET-34738 Sync Folder Items");
client.send(message2);

ExchangeMessageInfoCollection messageInfoCol = client.listMessages(client.getMailboxInfo().getInboxUri());
SyncFolderResult result = client.syncFolder(client.getMailboxInfo().getInboxUri(), null);
System.out.println(result.getNewItems().size());
System.out.println(result.getChangedItems().size());
System.out.println(result.getReadFlagChanged().size());
System.out.println(result.getDeletedItems().length);

دریافت مجوزها برای پوشه‌های Exchange

کاربران مجوزهایی برای پوشه‌های عمومی در Exchange Server دریافت می‌کنند که سطح دسترسی کاربر به این پوشه‌ها را محدود/تعیین می‌کند. ExchangeFolderPermission کلاسی که مجموعه‌ای از خواص مجوز برای پوشه‌های Exchange مانند PermissionLevel، آیا می‌توانند canCreateItems, deleteItems, و انجام وظایف دیگر بر حسب خواص مجوز. می‌توان مجوزها را با استفاده از getFolderPermissions() متد IEWSClient. این مقاله نشان می‌دهد چگونه مجوزهای اعمال‌شده به یک پوشه عمومی را برای تمام کاربرانی که به پوشه‌های به‌اشتراک‌گذاری شده دسترسی دارند، بازیابی کنید.

برای انجام این کار:

  1. EWSClient را مقداردهی اولیه کنید.
  2. از listPublicFolders برای دریافت فهرست تمام پوشه‌های عمومی استفاده کنید
  3. دریافت مجوزهای مرتبط با یک پوشه با استفاده از متد getFolderPermissions()

قطعه کد زیر نشان می‌دهد چگونه از EWSClient کلاسی برای بازیابی مجوزهای اعمال‌شده به یک پوشه.

String folderName = "DesiredFolderName";

// Create instance of EWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

ExchangeFolderInfoCollection folders = client.listPublicFolders();
ExchangeFolderPermissionCollection permissions = new ExchangeFolderPermissionCollection();

ExchangeFolderInfo publicFolder = null;
try {
    for (ExchangeFolderInfo folderInfo : (Iterable<ExchangeFolderInfo>) folders)
        if (folderInfo.getDisplayName().equals(folderName))
            publicFolder = folderInfo;

    if (publicFolder == null)
        System.out.println("public folder was not created in the root public folder");

    ExchangePermissionCollection folderPermissionCol = client.getFolderPermissions(publicFolder.getUri());
    for (ExchangeBasePermission perm : (Iterable<ExchangeBasePermission>) folderPermissionCol) {
        if (perm instanceof ExchangeFolderPermission)
            System.out.println("Permission is null.");
        else {
            ExchangeFolderPermission permission = (ExchangeFolderPermission) perm;

            System.out.println("User's primary smtp address: " + permission.getUserInfo().getPrimarySmtpAddress());
            System.out.println("User can create Items: " + permission.canCreateItems());
            System.out.println("User can delete Items: " + permission.getDeleteItems());
            System.out.println("Is Folder Visible: " + permission.isFolderVisible());
            System.out.println("Is User owner of this folder: " + permission.isFolderOwner());
            System.out.println("User can read items: " + permission.getReadItems());
        }
    }
    ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();
    // Get the Permissions for the Contacts and Calendar Folder
    ExchangePermissionCollection contactsPermissionCol = client.getFolderPermissions(mailboxInfo.getContactsUri());
    ExchangePermissionCollection calendarPermissionCol = client.getFolderPermissions(mailboxInfo.getCalendarUri());
} finally {
    // Do the needfull
}

ایجاد پوشه‌ها و زیرپوشه‌ها

API Aspose.Email قابلیت ایجاد پوشه‌ها در یک صندوق‌نامه Exchange را فراهم می‌کند. The CreateFolder متد IEWSClient می‌تواند برای این منظور استفاده شود. برای ایجاد یک پوشه در صندوق‌نامه سرور Exchange، می‌توان از مراحل زیر استفاده کرد.

  1. یک نمونه از IEWSClient ایجاد کنید.
  2. ویژگی UseSlashAsFolderSeparator را طبق نیاز تنظیم کنید. اگر به true تنظیم شود، برنامه «اسلش» را به‌ عنوان جداکننده پوشه در نظر می‌گیرد و زیرپوشه پس از اسلش ایجاد می‌شود.
  3. از متد createFolder برای ایجاد پوشه استفاده کنید.

قطعه کد زیر نشان می‌دهد چگونه پوشه‌ها و زیرپوشه‌ها ایجاد کنید.

// Create instance of EWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

String inbox = client.getMailboxInfo().getInboxUri();
String folderName1 = "EMAILNET-35054";
String subFolderName0 = "2015";
String folderName2 = folderName1 + "/" + subFolderName0;
String folderName3 = folderName1 + " / 2015";
ExchangeFolderInfo rootFolderInfo = null;
ExchangeFolderInfo folderInfo = null;

try {
    client.setUseSlashAsFolderSeparator(true);
    client.createFolder(client.getMailboxInfo().getInboxUri(), folderName1);
    client.createFolder(client.getMailboxInfo().getInboxUri(), folderName2);
} finally {
    ExchangeFolderInfo[] referenceToRootFolderInfo = { rootFolderInfo };
    boolean outRefCondition0 = client.folderExists(inbox, folderName1, /* out */ referenceToRootFolderInfo);
    rootFolderInfo = referenceToRootFolderInfo[0];
    if (outRefCondition0) {
        ExchangeFolderInfo[] referenceToFolderInfo = { folderInfo };
        boolean outRefCondition1 = client.folderExists(inbox, folderName2, /* out */ referenceToFolderInfo);
        folderInfo = referenceToFolderInfo[0];
        if (outRefCondition1)
            client.deleteFolder(folderInfo.getUri(), true);
        client.deleteFolder(rootFolderInfo.getUri(), true);
    }
}

پشتیبان‌گیری از پوشه‌های Exchange به PST

اغلب کاربران ممکن است بخواهند از تمام یا برخی از پوشه‌های صندوق نامه یک نسخه پشتیبان بگیرند. Aspose.Email امکان پشتیبان‌گیری از تمام یا پوشه‌های صندوق‌نامه Exchange مشخص‌شده به یک فایل PST را فراهم می‌کند. این مقاله توضیح می‌دهد چگونه پوشه‌های Exchange را به PST با کد نمونه پشتیبان‌گیری کنید. برای پشتیبان‌گیری از پوشه‌های سرور Exchange، می‌توان مراحل زیر را دنبال کرد.

  1. IEWSClient را با اعتبار کاربر مقداردهی اولیه کنید
  2. اطلاعات پوشه مورد نیاز را به ExchangeFolderInfoCollection اضافه کنید
  3. از روش پشتیبان‌گیری کلاینت برای استخراج محتویات پوشه به PST استفاده کنید

قطعه کد زیر نشان می‌دهد چگونه پوشه‌های Exchange را به PST پشتیبان‌گیری کنید.

String dataDir = "data/";
// Create instance of IEWSClient class by providing credentials
final String mailboxUri = "https://ews.domain.com/ews/Exchange.asmx";
final String domain = "";
final String username = "username";
final String password = "password";
NetworkCredential credential = new NetworkCredential(username, password, domain);
IEWSClient client = EWSClient.getEWSClient(mailboxUri, credential);

// Get Exchange mailbox info of other email account
ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();
ExchangeFolderInfo info = client.getFolderInfo(mailboxInfo.getInboxUri());
ExchangeFolderInfoCollection fc = new ExchangeFolderInfoCollection();
fc.addItem(info);
client.backup(fc, dataDir + "Backup_out.pst", BackupOptions.None);