Arbeiten mit Ordnern auf dem Exchange-Server

Alle Ordner vom Server auflisten

Aspose.Email API ermöglicht die Verbindung zum Exchange‑Server sowie das Auflisten aller Ordner und Unterordner. Sie können außerdem alle Unterordner jedes Ordners rekursiv abrufen. Zusätzlich bietet sie die Möglichkeit, Ordner mit Paging vom Exchange‑Client mittels Exchange Web Service (EWS) aufzulisten. Dieser Artikel zeigt, wie man alle Unterordner vom Exchange‑Server abruft und Ordner mit Paginierung listet.

Der folgende Codeausschnitt zeigt, wie man Ordner vom Exchange-Server auflistet.

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

Ordner‑Typ‑Informationen mit EWS abrufen

Die FolderType Eigenschaft bereitgestellt von ExchangeFolderInfo Klasse kann verwendet werden, um Informationen über den Typ des Ordners zu erhalten. Siehe das untenstehende Code‑Beispiel.

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

Auflisten von Ordnern mit Paging‑Unterstützung mittels EWS

Das folgende Code‑Snippet zeigt, wie Sie die Paging‑Unterstützung mit EWS verwenden.

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

Zugriff auf benutzerdefinierte Postfach‑Ordner oder Unterordner

IEWSClient ermöglicht Entwicklern den Zugriff auf beliebige benutzerdefinierte Ordner oder Unterordner im Postfach. Die folderExists() Funktion von IEWSClient gibt die URI eines angegebenen benutzerdefinierten Ordners/Unterordners zurück, die dann zum Zugriff auf den Zielordner verwendet werden kann. Im folgenden Beispiel wird ein benutzerdefinierter Ordner namens „TestInbox“, der unter INBOX erstellt wurde, aufgerufen und alle Nachrichten dieses Ordners angezeigt. Für diese Aufgabe folgen Sie den nachstehenden Schritten:

  1. Initialisieren Sie das IEWSClient‑Objekt, indem Sie gültige Anmeldeinformationen angeben.
  2. Greifen Sie auf das Standardpostfach zu.
  3. Greifen Sie auf den übergeordneten Ordner zu, der in diesem Beispiel INBOX ist. Dieser übergeordnete Ordner kann ebenfalls ein benutzerdefinierter Ordner sein.
  4. Verwenden Sie folderExists(), um den angegebenen benutzerdefinierten Unterordner, z. B. „TestInbox“, zu suchen. Sie liefert die URI von „TestInbox“ zurück.
  5. Verwenden Sie diese URI, um auf alle Nachrichten in diesem benutzerdefinierten Ordner zuzugreifen.

Das folgende Code‑Snippet zeigt, wie Sie benutzerdefinierte Postfach‑Ordner oder Unterordner mit EWS zugreifen.

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

Auflisten öffentlicher Ordner

Microsoft Exchange Server ermöglicht Benutzern das Erstellen öffentlicher Ordner und das Veröffentlichen von Nachrichten darin. Um dies über Ihre Anwendung zu tun, verwenden Sie Aspose.Email’s EWSClient Klasse zum Herstellen einer Verbindung mit dem Exchange‑Server sowie zum Lesen und Herunterladen von Nachrichten und Beiträgen aus öffentlichen Ordnern. Das folgende Code‑Snippet zeigt, wie Sie alle öffentlichen Ordner und Unterordner lesen sowie alle darin gefundenen Nachrichten auflisten und herunterladen. Dieses Beispiel funktioniert nur mit Microsoft Exchange Server 2007 oder höher, da nur diese EWS unterstützen.

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

Kopieren einer Nachricht in einen anderen Ordner

Aspose.Email API ermöglicht das Kopieren einer Nachricht von einem Ordner in einen anderen Ordner mittels copyItem Methode. Die überladene Version dieser Methode gibt die eindeutige URI der kopierten Nachricht zurück, wie in diesem Artikel gezeigt.

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

Synchronisieren von Ordner­elementen

Aspose.Email für Java APIs IEWSClient bietet die Möglichkeit, einen Exchange‑Ordner und dessen Inhalt zu synchronisieren. Die syncFolder Methode, die von IEWSClient Klasse kann verwendet werden, um Synchronisationsinformationen für einen angegebenen Ordner auszuführen. Das folgende Code‑Snippet zeigt, wie Sie Exchange‑Ordnerinformationen synchronisieren.

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

Abrufen von Berechtigungen für Exchange‑Ordner

Benutzern werden auf Exchange Server Berechtigungen für öffentliche Ordner zugewiesen, die das Zugriffslevel eines Benutzers auf diese Ordner einschränken/bestimmen. Das ExchangeFolderPermission Klasse bietet eine Reihe von Berechtigungseigenschaften für Exchange‑Ordner, wie zum Beispiel die PermissionLevel, ob sie canCreateItems, deleteItems, und führen weitere Aufgaben aus, die durch die Berechtigungseigenschaften angegeben sind. Berechtigungen können mit der getFolderPermissions() Methode von IEWSClient. Dieser Artikel zeigt, wie man die auf einen öffentlichen Ordner angewendeten Berechtigungen für alle Benutzer, die Zugriff auf die freigegebenen Ordner haben, abruft.

Um diese Aufgabe auszuführen:

  1. Initialisieren Sie den EWSClient.
  2. Verwenden Sie listPublicFolders, um eine Liste aller öffentlichen Ordner zu erhalten
  3. Rufen Sie die mit einem Ordner verbundenen Berechtigungen mithilfe der Methode getFolderPermissions() ab

Das folgende Code‑Snippet zeigt, wie Sie die EWSClient Klasse zum Abrufen von Berechtigungen, die auf einen Ordner angewendet wurden.

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
}

Erstellen von Ordnern und Unterordnern

Aspose.Email API bietet die Möglichkeit, Ordner in einem Exchange‑Postfach zu erstellen. Die CreateFolder Methode von IEWSClient kann für diesen Zweck verwendet werden. Um einen Ordner im Exchange‑Server‑Postfach zu erstellen, können die folgenden Schritte verwendet werden.

  1. Erstellen Sie eine Instanz von IEWSClient.
  2. Setzen Sie die Eigenschaft UseSlashAsFolderSeparator nach Bedarf. Wenn sie auf true gesetzt ist, betrachtet die Anwendung den "Slash" als Ordnertrennzeichen und der Unterordner wird nach dem Schrägstrich erstellt.
  3. Verwenden Sie die Methode createFolder, um den Ordner zu erstellen.

Das folgende Codebeispiel zeigt, wie man Ordner und Unterordner erstellt.

// 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‑Ordner in PST sichern

Es kommt häufig vor, dass Benutzer ein Backup aller oder einiger Postfachordner erstellen möchten. Aspose.Email bietet die Möglichkeit, alle oder bestimmte Exchange-Postfachordner in eine PST zu sichern. Dieser Artikel beschreibt das Sichern von Exchange‑Ordnern in einer PST mit Beispielcode. Um ein Backup der Exchange‑Server‑Ordner zu erstellen, können die folgenden Schritte befolgt werden.

  1. Initialisieren Sie den IEWSClient mit Benutzeranmeldeinformationen
  2. Fügen Sie die erforderlichen Ordnerinformationen zu ExchangeFolderInfoCollection hinzu
  3. Verwenden Sie die Backup‑Methode des Clients, um den Inhalt des Ordners in eine PST zu exportieren

Das folgende Codebeispiel zeigt, wie man Exchange‑Ordner in eine PST-Datei sichert.

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