Práce se složkami na serveru Exchange
Výpis všech složek ze serveru
Aspose.Email API poskytuje možnost připojit se k Exchange Serveru a vypsat všechny složky a podsložky. Můžete také rekurzivně získat všechny podsložky z každé složky. Poskytuje také možnost výčtu složek s stránkováním z Exchange klienta pomocí Exchange Web Services (EWS). Tento článek ukazuje, jak získat všechny podsložky z Exchange serveru a jak získat složky s stránkováním.
Níže uvedený úryvek kódu ukazuje, jak vypsat složky ze serveru 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) {
}
}
Získání informací o typu složky pomocí EWS
The FolderType vlastnost poskytovaná ExchangeFolderInfo třída může být použita k získání informací o typu složky. Jak je znázorněno v níže uvedeném příkladu kódu.
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;
}
}
Výčet složek s podporou stránkování pomocí EWS
Níže uvedený úryvek kódu ukazuje, jak použít podporu stránkování pomocí 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());
}
Přístup k vlastním složkám nebo podsložkám poštovní schránky
IEWSClient umožňuje vývojářům přístup k libovolné vlastní složce nebo podsložce v poštovní schránce. folderExists() funkce IEWSClient vrací URI specifikované vlastní složky/podsložky, která může být následně použita pro přístup k cílové složce. V následujícím příkladu je přístup k vlastní složce nazvané "TestInbox", vytvořené pod INBOX, a jsou zobrazeny všechny zprávy z této složky. Pro provedení tohoto úkolu jsou následující kroky:
- Inicializujte objekt IEWSClient zadáním platných přihlašovacích údajů.
- Přístup k výchozí poštovní schránce.
- Přístup k nadřazené složce, která je v tomto příkladu INBOX. Tato nadřazená složka může být také vlastní složkou.
- Použijte folderExists() pro vyhledání zadané vlastní podsložky, například "TestInbox". Vrátí URI složky "TestInbox".
- Použijte toto Uri pro přístup ke všem zprávám v této vlastní složce.
Níže uvedený úryvek kódu ukazuje, jak přistupovat k vlastním složkám poštovní schránky nebo jejich podsložkám pomocí 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.");
}
Výpis veřejných složek
Microsoft Exchange Server umožňuje uživatelům vytvářet veřejné složky a zveřejňovat v nich zprávy. Pro provedení tohoto úkolu z vaší aplikace použijte Aspose.Email EWSClient třída pro připojení k Exchange Serveru a čtení a stahování zpráv a příspěvků z veřejných složek. Níže uvedený úryvek kódu ukazuje, jak číst všechny veřejné složky a podsložky, a jak zobrazit a stáhnout všechny zprávy nalezené v těchto složkách. Tento příklad funguje jen s Microsoft Exchange Server 2007 a novějšími, protože pouze ty podporují 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);
}
}
}
Zkopírovat zprávu do jiné složky
Aspose.Email API umožňuje kopírovat zprávu z jedné složky do jiné pomocí copyItem metoda. Přetížená verze této metody vrací unikátní URI zkopírované zprávy, jak je ukázáno v tomto článku.
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());
}
Synchronizace položek složky
Aspose.Email pro Java API IEWSClient poskytuje funkci synchronizace obsahu Exchange složky. syncFolder metoda vystavená IEWSClient třída může být použita k provedení synchronizace informací o složce na zadané složce. Níže uvedený úryvek kódu ukazuje, jak synchronizovat informace o Exchange složce.
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);
Získávání oprávnění pro Exchange složky
Uživatelům jsou přiřazena oprávnění k veřejným složkám na Exchange Serveru, což omezuje/určuje úroveň přístupu uživatele k těmto složkám. ExchangeFolderPermission třída poskytuje sadu vlastností oprávnění pro Exchange složky, jako je PermissionLevel, zda mohou canCreateItems, deleteItems, a provádějte další úkoly podle vlastností oprávnění. Oprávnění lze získat pomocí getFolderPermissions() metoda IEWSClient. Tento článek ukazuje, jak získat oprávnění aplikovaná na veřejnou složku pro všechny uživatele, kteří mají přístup ke sdíleným složkám.
Pro provedení tohoto úkolu:
- Inicializujte EWSClient.
- Použijte listPublicFolders k získání seznamu všech veřejných složek
- Získat oprávnění spojená se složkou pomocí metody getFolderPermissions()
Níže uvedený úryvek kódu ukazuje, jak použít EWSClient třída pro získání oprávnění aplikovaných na složku.
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
}
Vytváření složek a podsložek
Aspose.Email API poskytuje možnost vytvářet složky v poštovní schránce Exchange. CreateFolder metoda IEWSClient lze použít pro tento účel. Pro vytvoření složky v poštovní schránce serveru Exchange lze použít následující kroky.
- Vytvořte instanci IEWSClient.
- Nastavte vlastnost UseSlashAsFolderSeparator podle potřeby. Pokud je nastavena na true, aplikace bude považovat "lomeno" za oddělovač složek a podsložka bude vytvořena za lomítkem.
- Použijte metodu createFolder pro vytvoření složky.
Následující úryvek kódu ukazuje, jak vytvořit složky a podsložky.
// 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);
}
}
Zálohování složek Exchange do PST
Často se stává, že uživatelé chtějí zálohovat všechny nebo některé složky poštovní schránky. Aspose.Email poskytuje možnost zálohovat všechny nebo vybrané složky poštovní schránky Exchange do PST. Tento článek popisuje zálohování složek Exchange do PST s ukázkovým kódem. Pro zálohování složek serveru Exchange lze postupovat podle následujících kroků.
- Inicializujte IEWSClient s uživatelskými přihlašovacími údaji
- Přidejte informace o požadované složce do ExchangeFolderInfoCollection
- Použijte metodu zálohování klienta k exportu obsahu složky do PST
Následující úryvek kódu ukazuje, jak zálohovat složky Exchange do 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);