Travailler avec les dossiers sur le serveur Exchange
Répertorier tous les dossiers du serveur
L’API Aspose.Email offre la capacité de se connecter au serveur Exchange et de répertorier tous les dossiers et sous‑dossiers. Vous pouvez également récupérer tous les sous‑dossiers de chaque dossier de façon récursive. Elle permet également d’énumérer les dossiers avec pagination depuis le client Exchange en utilisant Exchange Web Service (EWS). Cet article montre comment récupérer tous les sous‑dossiers du serveur Exchange et récupérer les dossiers avec pagination.
L’extrait de code suivant vous montre comment répertorier les dossiers d’un serveur 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) {
}
}
Obtenir les informations du type de dossier via EWS
Le FolderType propriété fournie par ExchangeFolderInfo classe pouvant être utilisée pour obtenir des informations sur le type du dossier. Cela est illustré dans l’exemple de code ci‑dessous.
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;
}
}
Énumération des dossiers avec prise en charge de la pagination via EWS
L’extrait de code suivant montre comment utiliser la prise en charge de la pagination avec 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());
}
Accès aux dossiers personnalisés ou sous‑dossiers de la boîte aux lettres
IEWSClient permet aux développeurs d’accéder à n’importe quel dossier ou sous‑dossier personnalisé de la boîte aux lettres. Le folderExists() fonction de IEWSClient renvoie l’URI d’un dossier/sous‑dossier personnalisé spécifié, qui peut ensuite être utilisé pour accéder au dossier cible. Dans l’exemple suivant, un dossier personnalisé nommé "TestInbox", créé sous INBOX, est accédé et tous les messages de ce dossier sont affichés. Pour réaliser cette tâche, voici les étapes :
- Initialisez l’objet IEWSClient en fournissant des informations d’identification valides.
- Accédez à la boîte aux lettres par défaut.
- Accédez au dossier parent, qui est INBOX dans cet exemple. Ce dossier parent peut également être un dossier personnalisé.
- Utilisez folderExists() pour rechercher le sous‑dossier personnalisé spécifié, par exemple "TestInbox". Cela renverra l’URI de "TestInbox".
- Utilisez cet URI pour accéder à tous les messages de ce dossier personnalisé.
L’extrait de code suivant montre comment accéder aux dossiers personnalisés ou sous‑dossiers de la boîte aux lettres avec 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.");
}
Liste des dossiers publics
Microsoft Exchange Server permet aux utilisateurs de créer des dossiers publics et d’y publier des messages. Pour le faire via votre application, utilisez les fonctionnalités d’Aspose.Email EWSClient classe permettant de se connecter au serveur Exchange et de lire et télécharger les messages et publications depuis les dossiers publics. L’extrait de code suivant montre comment lire tous les dossiers publics et leurs sous‑dossiers, et répertorier et télécharger les messages trouvés dans ces dossiers. Cet exemple ne fonctionne qu’avec Microsoft Exchange Server 2007 ou supérieur, car seuls ces serveurs prennent en charge 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);
}
}
}
Copier un message vers un autre dossier
L’API Aspose.Email permet de copier un message d’un dossier à un autre en utilisant le copyItem méthode. La version surchargée de cette méthode renvoie l’URI unique du message copié comme indiqué dans cet article.
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());
}
Synchronisation des éléments de dossier
API Aspose.Email pour Java IEWSClient offre la fonctionnalité de synchronisation du contenu d’un dossier Exchange. Le syncFolder méthode exposée par le IEWSClient classe pouvant être utilisée pour effectuer la synchronisation d’un dossier spécifié. L’extrait de code suivant montre comment synchroniser les informations du dossier 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);
Récupération des autorisations pour les dossiers Exchange
Des utilisateurs se voient attribuer des autorisations aux dossiers publics sur Exchange Server, ce qui limite/détermine le niveau d’accès d’un utilisateur à ces dossiers. Le ExchangeFolderPermission classe fournit un ensemble de propriétés d’autorisation pour les dossiers Exchange tels que le PermissionLevel, qu’ils peuvent canCreateItems, deleteItems, et effectuez d’autres tâches spécifiées par les propriétés d’autorisation. Les autorisations peuvent être récupérées en utilisant le getFolderPermissions() méthode de IEWSClient. Cet article montre comment récupérer les autorisations appliquées à un dossier public pour tous les utilisateurs qui ont accès aux dossiers partagés.
Pour effectuer cette tâche :
- Initialisez le EWSClient.
- Utilisez listPublicFolders pour obtenir la liste de tous les dossiers publics
- Récupérer les autorisations associées à un dossier en utilisant la méthode getFolderPermissions()
L’extrait de code suivant montre comment utiliser le EWSClient classe pour récupérer les autorisations appliquées à un dossier.
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
}
Création de dossiers et sous-dossiers
L’API Aspose.Email offre la capacité de créer des dossiers dans une boîte aux lettres Exchange. Le CreateFolder méthode de IEWSClient peut être utilisé à cette fin. Pour créer un dossier dans la boîte aux lettres du serveur Exchange, les étapes suivantes peuvent être suivies.
- Créez une instance de IEWSClient.
- Définissez la propriété UseSlashAsFolderSeparator selon les besoins. Si elle est définie sur true, l’application considérera le "Slash" comme séparateur de dossier et le sous‑dossier sera créé après le slash.
- Utilisez la méthode createFolder pour créer le dossier.
L’extrait de code suivant montre comment créer des dossiers et des sous‑dossiers.
// 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);
}
}
Sauvegarder les dossiers Exchange vers PST
Il arrive souvent que les utilisateurs souhaitent sauvegarder tout ou partie des dossiers de boîte aux lettres. Aspose.Email offre la capacité de sauvegarder tous les dossiers ou des dossiers spécifiques de la boîte aux lettres Exchange vers un PST. Cet article décrit la sauvegarde des dossiers Exchange vers un PST avec du code d’exemple. Pour sauvegarder les dossiers du serveur Exchange, les étapes suivantes peuvent être suivies.
- Initialisez l’IEWClient avec les informations d’identification de l’utilisateur
- Ajoutez les informations du dossier requis à ExchangeFolderInfoCollection
- Utilisez la méthode de sauvegarde du client pour exporter le contenu du dossier vers un PST
L’extrait de code suivant montre comment sauvegarder les dossiers Exchange vers un 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);