Exchange Server のフォルダー操作

サーバーからすべてのフォルダーを一覧表示

Aspose.Email API は、Exchange Server に接続し、すべてのフォルダーとサブフォルダーを一覧表示する機能を提供します。また、各フォルダーからサブフォルダーを再帰的に取得することもできます。さらに、Exchange Web Service (EWS) を使用したページングによるフォルダー列挙機能も提供します。この記事では、Exchange サーバーからすべてのサブフォルダーを取得し、ページングでフォルダーを取得する方法を示します。

以下のコードスニペットは、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) {
    }
}

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 を返し、これを使用してターゲットフォルダーにアクセスできます。以下の例では、INBOX の下に作成された "TestInbox" というカスタムフォルダーにアクセスし、そのフォルダー内のすべてのメッセージを表示します。このタスクを実行する手順は次のとおりです:

  1. 有効な資格情報を提供して IEWSClient オブジェクトを初期化します。
  2. デフォルトのメールボックスにアクセスします。
  3. この例では親フォルダーは INBOX です。親フォルダーはカスタムフォルダーになる場合もあります。
  4. folderExists() を使用して、指定されたカスタムサブフォルダー(例: "TestInbox")を検索します。これにより "TestInbox" の URI が返されます。
  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 に接続し、パブリックフォルダーからメッセージや投稿を読み取り、ダウンロードします。以下のコードスニペットは、すべてのパブリックフォルダーとサブフォルダーを読み取り、これらのフォルダー内にあるメッセージを一覧表示およびダウンロードする方法を示しています。この例は、EWS をサポートする Microsoft Exchange Server 2007 以降でのみ動作します。

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

メッセージを別のフォルダーへコピー

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

フォルダー項目の同期

Aspose.Email for Java API の 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
}

フォルダーとサブフォルダーの作成

Aspose.Email API は、Exchange メールボックスにフォルダーを作成する機能を提供します。 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);