Bekerja dengan Folder di Exchange Server

Menampilkan Semua Folder dari Server

API Aspose.Email menyediakan kemampuan untuk terhubung ke Exchange Server dan menampilkan semua folder serta sub-folder. Anda juga dapat mengambil semua sub-folder dari tiap folder secara rekursif. Selain itu, menyediakan kemampuan untuk menenumerasi folder dengan paging dari klien Exchange menggunakan Exchange Web Service (EWS). Artikel ini menunjukkan cara mengambil semua sub-folder dari server Exchange dan menampilkan folder dengan pagination.

Potongan kode berikut menunjukkan cara Menampilkan folder dari Exchange Server.

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

Dapatkan Informasi Tipe Folder menggunakan EWS

The FolderType properti yang disediakan oleh ExchangeFolderInfo kelas dapat digunakan untuk mendapatkan informasi tentang tipe folder. Ini ditunjukkan dalam contoh kode di bawah.

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

Potongan kode berikut menunjukkan cara menggunakan dukungan paging dengan 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());
}

Mengakses Folder Khusus atau Subfolder Mailbox

IEWSClient memungkinkan pengembang mengakses folder khusus atau subfolder apa pun dari mailbox. folderExists() fungsi dari IEWSClient mengembalikan URI dari folder/kustom sub-folder yang ditentukan, yang kemudian dapat digunakan untuk mengakses folder target. Dalam contoh berikut, folder khusus bernama "TestInbox", yang dibuat di bawah INBOX diakses dan semua pesan ditampilkan dari folder khusus ini. Untuk melakukan tugas ini, langkah-langkah berikut:

  1. Inisialisasi objek IEWSClient dengan memberikan kredensial yang valid.
  2. Akses mailbox default.
  3. Akses folder induk, yang merupakan INBOX dalam contoh ini. Folder induk ini juga dapat menjadi folder khusus.
  4. Gunakan folderExists() untuk mencari subfolder khusus yang ditentukan, misalnya "TestInbox". Ini akan mengembalikan URI dari "TestInbox".
  5. Gunakan Uri ini untuk mengakses semua pesan dalam folder khusus tersebut.

Potongan kode berikut menunjukkan cara mengakses folder khusus atau subfolder mailbox dengan 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.");
}

Mendaftarkan Folder Publik

Microsoft Exchange Server memungkinkan pengguna membuat folder publik dan memposting pesan di dalamnya. Untuk melakukan ini melalui aplikasi Anda, gunakan Aspose.Email’s EWSClient kelas untuk terhubung ke Exchange Server dan membaca serta mengunduh pesan dan posting dari folder publik. Potongan kode berikut menunjukkan cara membaca semua folder publik, subfolder, serta menampilkan dan mengunduh pesan apa pun yang ditemukan dalam folder tersebut. Contoh ini hanya bekerja dengan Microsoft Exchange Server 2007 atau yang lebih baru karena hanya versi tersebut yang mendukung 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);
        }
    }
}

Menyalin Pesan ke Folder Lain

API Aspose.Email memungkinkan menyalin pesan dari satu folder ke folder lain menggunakan copyItem metode. Versi overload dari metode ini mengembalikan URI Unik dari pesan yang disalin seperti yang ditunjukkan dalam artikel ini.

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

Menyinkronkan Item Folder

API Aspose.Email untuk Java IEWSClient menyediakan fitur sinkronisasi folder Exchange untuk isinya. syncFolder metode yang diekspos oleh IEWSClient kelas dapat digunakan untuk melakukan sinkronisasi informasi folder pada folder tertentu. Potongan kode berikut menunjukkan cara menyinkronkan informasi folder 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);

Mengambil Izin untuk Folder Exchange

Pengguna diberikan izin ke folder publik pada Exchange Server, yang membatasi/menentukan tingkat akses pengguna ke folder tersebut. ExchangeFolderPermission kelas menyediakan sekumpulan properti izin untuk folder Exchange seperti PermissionLevel, apakah mereka dapat canCreateItems, deleteItems, dan melakukan tugas lain sebagaimana ditentukan oleh properti izin. Izin dapat diambil menggunakan getFolderPermissions() metode dari IEWSClient. Artikel ini menunjukkan cara mengambil izin yang diterapkan pada folder publik untuk semua pengguna yang memiliki akses ke folder bersama.

Untuk melakukan tugas ini:

  1. Inisialisasi EWSClient.
  2. Gunakan listPublicFolders untuk mendapatkan daftar semua folder publik
  3. Mengambil izin yang terkait dengan folder menggunakan metode getFolderPermissions()

Potongan kode berikut menunjukkan cara menggunakan EWSClient kelas untuk mengambil izin yang diterapkan pada sebuah folder.

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
}

Membuat Folder dan Sub-Folder

API Aspose.Email menyediakan kemampuan untuk membuat folder di mailbox Exchange. The CreateFolder metode dari IEWSClient dapat digunakan untuk tujuan ini. Untuk membuat folder di mailbox server Exchange, langkah-langkah berikut dapat digunakan.

  1. Buat instansi IEWSClient.
  2. Atur properti UseSlashAsFolderSeparator sesuai kebutuhan. Jika diatur ke true, aplikasi akan menganggap "Slash" sebagai pemisah folder dan subfolder akan dibuat setelah slash.
  3. Gunakan metode createFolder untuk membuat folder.

Potongan kode berikut menunjukkan cara membuat folder dan sub‑Folder.

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

Cadangkan Folder Exchange ke PST

Seringkali pengguna ingin mencadangkan semua atau sebagian folder kotak surat. Aspose.Email menyediakan kemampuan untuk mencadangkan semua atau folder kotak surat Exchange tertentu ke PST. Artikel ini menjelaskan cara mencadangkan folder Exchange ke PST dengan contoh kode. Untuk mencadangkan folder server Exchange, langkah-langkah berikut dapat diikuti.

  1. Inisialisasi IEWSClient dengan kredensial pengguna
  2. Tambahkan info folder yang diperlukan ke ExchangeFolderInfoCollection
  3. Gunakan metode backup klien untuk mengekspor isi folder ke PST

Potongan kode berikut menunjukkan cara mencadangkan folder exchange ke 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);