Werken met mappen op Exchange Server

Alle mappen van de server weergeven

Aspose.Email API biedt de mogelijkheid om verbinding te maken met de Exchange Server en alle mappen en submappen weer te geven. Je kunt ook alle submappen van elke map recursief ophalen. Het biedt bovendien de mogelijkheid om mappen met paginering op te sommen vanuit de Exchange-client met Exchange Web Service (EWS). Dit artikel laat zien hoe je alle submappen van de Exchange-server ophaalt en mappen met paginering opvraagt.

De volgende codefragment toont hoe je mappen van Exchange Server kunt weergeven.

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

Maptype-informatie ophalen met EWS

De FolderType eigenschap geleverd door ExchangeFolderInfo klasse kan worden gebruikt om informatie over het type van de map te verkrijgen. Dit is zoals weergegeven in het onderstaande voorbeeld.

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

Mappen opsommen met paginering via EWS

De volgende codefragment laat zien hoe je paginering ondersteunt met 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());
}

Toegang tot aangepaste mailboxmappen of submappen

IEWSClient maakt het voor ontwikkelaars mogelijk om elke aangepaste map of submap uit de mailbox te benaderen. De folderExists() functie van IEWSClient retourneert de URI van een opgegeven aangepaste map/submap, die vervolgens kan worden gebruikt om de doelmap te benaderen. In het volgende voorbeeld wordt een aangepaste map met de naam "TestInbox", aangemaakt onder INBOX, benaderd en worden alle berichten uit deze aangepaste map weergegeven. Om deze taak uit te voeren, zijn de volgende stappen:

  1. Initialiseer het IEWSClient-object door geldige inloggegevens te verstrekken.
  2. Benader de standaard mailbox.
  3. Benader de bovenliggende map, die in dit voorbeeld INBOX is. Deze bovenliggende map kan ook zelf een aangepaste map zijn.
  4. Gebruik folderExists() om de opgegeven aangepaste submap te zoeken, bijvoorbeeld "TestInbox". Het zal de URI van "TestInbox" retourneren.
  5. Gebruik deze Uri om alle berichten in die aangepaste map te benaderen.

De volgende codefragment laat zien hoe je aangepaste mailboxmappen of submappen benadert met 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.");
}

Openbare mappen weergeven

Microsoft Exchange Server laat gebruikers openbare mappen aanmaken en berichten posten. Om dit via je applicatie te doen, gebruik Aspose.Email’s EWSClient klasse om verbinding te maken met de Exchange Server en berichten en posts uit openbare mappen te lezen en te downloaden. De volgende codefragment laat zien hoe je alle openbare mappen en submappen leest, en lijst en downloadt alle berichten die in deze mappen worden gevonden. Dit voorbeeld werkt alleen met Microsoft Exchange Server 2007 of hoger, aangezien alleen deze EWS ondersteunen.

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

Kopieer een bericht naar een andere map

Aspose.Email API maakt het kopiëren van een bericht van de ene map naar een andere map mogelijk met behulp van de copyItem methode. De overladen versie van deze methode retourneert de unieke URI van het gekopieerde bericht zoals getoond in dit artikel.

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

Mappenitems synchroniseren

Aspose.Email voor Java API’s IEWSClient biedt de mogelijkheid om de inhoud van een Exchange-map te synchroniseren. De syncFolder methode blootgesteld door de IEWSClient klasse kan worden gebruikt om synchronisatie-informatie van een map uit te voeren op een opgegeven map. De volgende codefragment laat zien hoe je Exchange-mapinformatie synchroniseert.

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

Rechten ophalen voor Exchange-mappen

Gebruikers krijgen rechten toegewezen voor openbare mappen op Exchange Server, wat het toegangsniveau van een gebruiker tot deze mappen beperkt/bepaalt. De ExchangeFolderPermission klasse biedt een set rechten-eigenschappen voor Exchange-mappen zoals de PermissionLevel, of ze kunnen canCreateItems, deleteItems, en voer andere taken uit zoals gespecificeerd door de rechten-eigenschappen. Rechten kunnen worden opgehaald met de getFolderPermissions() methode van IEWSClient. Dit artikel laat zien hoe je de rechten die op een openbare map zijn toegepast kunt ophalen voor alle gebruikers die toegang hebben tot de gedeelde mappen.

Om deze taak uit te voeren:

  1. Initialiseer de EWSClient.
  2. Gebruik de listPublicFolders om een lijst van alle openbare mappen op te halen
  3. Haal de rechten op die aan een map zijn gekoppeld met de getFolderPermissions() methode

De volgende codefragment laat zien hoe je de EWSClient klasse om rechten die op een map zijn toegepast op te halen.

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
}

Mappen en Submappen maken

Aspose.Email API biedt de mogelijkheid om mappen aan te maken in een Exchange‑mailbox. De CreateFolder methode van IEWSClient kan voor dit doel gebruikt worden. Om een map aan te maken in de Exchange‑server mailbox, kunnen de volgende stappen gevolgd worden.

  1. Maak een instantie van IEWSClient aan.
  2. Stel de UseSlashAsFolderSeparator‑eigenschap in zoals nodig. Indien ingesteld op true, zal de applicatie de "Slash" beschouwen als mappen‑scheidingsteken en wordt de submap aangemaakt na de slash.
  3. Gebruik de createFolder‑methode om de map aan te maken.

Het volgende code‑fragment laat zien hoe je mappen en sub‑mappen maakt.

// 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‑mappen back‑uppen naar PST

Het komt vaak voor dat gebruikers een back‑up willen maken van alle of enkele mailbox‑mappen. Aspose.Email biedt de mogelijkheid om alle of opgegeven Exchange‑mailbox‑mappen naar een PST te back‑uppen. Dit artikel beschrijft het maken van een back‑up van Exchange‑mappen naar een PST met voorbeeldcode. Om de back‑up van Exchange‑servermappen te maken, kunnen de volgende stappen gevolgd worden.

  1. Start de IEWSClient met gebruikersreferenties
  2. Voeg de vereiste map‑informatie toe aan ExchangeFolderInfoCollection
  3. Gebruik de backup‑methode van de client om de inhoud van de map naar PST te exporteren

Het volgende code‑fragment laat zien hoe je Exchange‑mappen naar PST back‑up maakt.

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