Lavorare con le cartelle su Exchange Server
Elencare tutte le cartelle dal server
L’API Aspose.Email fornisce la possibilità di connettersi a Exchange Server e elencare tutte le cartelle e le sottocartelle. È inoltre possibile recuperare tutte le sottocartelle di ogni cartella in modo ricorsivo. Fornisce anche la capacità di enumerare le cartelle con paging dal client Exchange usando Exchange Web Services (EWS). Questo articolo mostra come recuperare tutte le sottocartelle dal server Exchange e recuperare le cartelle con paginazione.
Il seguente frammento di codice mostra come elencare le cartelle da 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) {
}
}
Ottenere informazioni sul tipo di cartella utilizzando EWS
Il FolderType proprietà fornita da ExchangeFolderInfo la classe può essere usata per ottenere informazioni sul tipo della cartella. Come mostrato nell’esempio di codice qui sotto.
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;
}
}
Enumerazione delle cartelle con supporto paging usando EWS
Il seguente frammento di codice mostra come utilizzare il supporto al paging con 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());
}
Accesso a cartelle personalizzate o sottocartelle della casella di posta
IEWSClient consente agli sviluppatori di accedere a qualsiasi cartella o sottocartella personalizzata dalla casella di posta. Il folderExists() funzione di IEWSClient restituisce l’URI di una cartella/sottocartella personalizzata specificata, che può poi essere usato per accedere alla cartella di destinazione. Nell’esempio seguente, viene acceduta una cartella personalizzata denominata "TestInbox", creata sotto INBOX, e tutti i messaggi vengono visualizzati da questa cartella. Per eseguire questa operazione, i passaggi sono i seguenti:
- Inizializza l’oggetto IEWSClient fornendo credenziali valide.
- Accedi alla casella di posta predefinita.
- Accedi alla cartella genitore, che è INBOX in questo esempio. Questa cartella genitore può anche essere una cartella personalizzata.
- Usa folderExists() per cercare la sottocartella personalizzata specificata, ad esempio "TestInbox". Restituirà l’URI di "TestInbox".
- Usa questo URI per accedere a tutti i messaggi di quella cartella personalizzata.
Il seguente frammento di codice mostra come accedere a cartelle personalizzate della casella di posta o sottocartelle con 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.");
}
Elenco delle cartelle pubbliche
Microsoft Exchange Server consente agli utenti di creare cartelle pubbliche e pubblicare messaggi in esse. Per farlo tramite la tua applicazione, utilizza le EWSClient classe per connettersi a Exchange Server e leggere e scaricare messaggi e post dalle cartelle pubbliche. Il seguente frammento di codice mostra come leggere tutte le cartelle pubbliche, le sottocartelle, e elencare e scaricare tutti i messaggi trovati in queste cartelle. Questo esempio funziona solo con Microsoft Exchange Server 2007 o versioni successive, poiché solo queste supportano 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);
}
}
}
Copiare un messaggio in un’altra cartella
L’API Aspose.Email consente di copiare un messaggio da una cartella a un’altra utilizzando il copyItem metodo. La versione sovraccaricata di questo metodo restituisce l’URI Unico del messaggio copiato, come mostrato in questo articolo.
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());
}
Sincronizzazione degli elementi della cartella
API di Aspose.Email per Java IEWSClient fornisce la funzionalità di sincronizzare una cartella Exchange per i suoi contenuti. Il syncFolder metodo esposto da IEWSClient la classe può essere utilizzata per eseguire la sincronizzazione delle informazioni di una cartella specificata. Il seguente frammento di codice mostra come sincronizzare le informazioni della cartella 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);
Recupero delle autorizzazioni per le cartelle Exchange
Agli utenti vengono assegnate autorizzazioni alle cartelle pubbliche su Exchange Server, che limitano/determinano il livello di accesso che un utente ha a queste cartelle. Il ExchangeFolderPermission la classe fornisce un set di proprietà di autorizzazione per le cartelle Exchange, come il PermissionLevel, se possono canCreateItems, deleteItems, e eseguire altre attività specificate dalle proprietà di autorizzazione. Le autorizzazioni possono essere recuperate utilizzando il getFolderPermissions() metodo di IEWSClient. Questo articolo mostra come recuperare le autorizzazioni applicate a una cartella pubblica per tutti gli utenti che hanno accesso alle cartelle condivise.
Per eseguire questa operazione:
- Inizializza l’EWSClient.
- Usa listPublicFolders per ottenere un elenco di tutte le cartelle pubbliche
- Recupera le autorizzazioni associate a una cartella utilizzando il metodo getFolderPermissions()
Il seguente frammento di codice mostra come utilizzare il EWSClient classe per recuperare le autorizzazioni applicate a una cartella.
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
}
Creare Cartelle e Sottocartelle
L’API Aspose.Email offre la possibilità di creare cartelle in una casella Exchange. Il CreateFolder metodo di IEWSClient può essere usato a questo scopo. Per creare una cartella nella casella di posta del server Exchange, è possibile seguire i seguenti passaggi.
- Crea un’istanza di IEWSClient.
- Imposta la proprietà UseSlashAsFolderSeparator secondo necessità. Se impostata a true, l’applicazione considererà lo "Slash" come separatore di cartelle e la sotto-cartella sarà creata dopo lo slash.
- Usa il metodo createFolder per creare la cartella.
Il seguente frammento di codice mostra come creare cartelle e sotto-cartelle.
// 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);
}
}
Backup delle cartelle Exchange in PST
Spesso gli utenti desiderano eseguire il backup di tutte o di alcune cartelle della casella di posta. Aspose.Email offre la possibilità di fare il backup di tutte o di specifiche cartelle della casella Exchange in un PST. Questo articolo descrive come eseguire il backup delle cartelle Exchange in un PST con codice di esempio. Per eseguire il backup delle cartelle del server Exchange, è possibile seguire i seguenti passaggi.
- Inizializza l’IEWSClient con le credenziali dell’utente
- Aggiungi le informazioni richieste della cartella a ExchangeFolderInfoCollection
- Usa il metodo di backup del client per esportare il contenuto della cartella in PST
Il seguente frammento di codice mostra come eseguire il backup delle cartelle Exchange in 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);