Praca z folderami na serwerze Exchange
Wyświetlanie wszystkich folderów z serwera
API Aspose.Email zapewnia możliwość połączenia się z serwerem Exchange i wylistowania wszystkich folderów oraz podfolderów. Można również rekurencyjnie pobrać wszystkie podfoldery z każdego folderu. Zapewnia także możliwość wymieniania folderów z obsługą stronicowania z klienta Exchange przy użyciu Exchange Web Service (EWS). Ten artykuł pokazuje, jak pobrać wszystkie podfoldery z serwera Exchange oraz jak pobierać foldery przy użyciu paginacji.
Poniższy fragment kodu pokazuje, jak wyświetlić listę folderów z serwera 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) {
}
}
Uzyskiwanie informacji o typie folderu przy użyciu EWS
Ten FolderType właściwość dostarczana przez ExchangeFolderInfo klasa może być użyta do uzyskania informacji o typie folderu. Pokazano to w przykładzie kodu poniżej.
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;
}
}
Wymienianie folderów z obsługą stronicowania przy użyciu EWS
Poniższy fragment kodu pokazuje, jak używać obsługi stronicowania przy użyciu 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());
}
Dostęp do niestandardowych folderów lub podfolderów skrzynki pocztowej
IEWSClient pozwala programistom uzyskać dostęp do dowolnego niestandardowego folderu lub podfolderu ze skrzynki pocztowej. folderExists() funkcja IEWSClient zwraca URI określonego niestandardowego folderu/podfolderu, które może być później użyte do uzyskania dostępu do docelowego folderu. W poniższym przykładzie dostęp uzyskuje się do niestandardowego folderu o nazwie "TestInbox", utworzonego pod INBOX, a następnie wyświetlane są wszystkie wiadomości z tego folderu. Aby wykonać to zadanie, postępuj zgodnie z następującymi krokami:
- Zainicjalizuj obiekt IEWSClient, podając prawidłowe poświadczenia.
- Uzyskaj dostęp do domyślnej skrzynki pocztowej.
- Uzyskaj dostęp do folderu nadrzędnego, którym w tym przykładzie jest INBOX. Ten folder nadrzędny może być także niestandardowym folderem.
- Użyj folderExists(), aby wyszukać określony niestandardowy podfolder, na przykład "TestInbox". Zwróci URI "TestInbox".
- Użyj tego URI, aby uzyskać dostęp do wszystkich wiadomości w tym niestandardowym folderze.
Poniższy fragment kodu pokazuje, jak uzyskać dostęp do niestandardowych folderów skrzynki pocztowej lub podfolderów przy użyciu 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.");
}
Wymienianie folderów publicznych
Microsoft Exchange Server umożliwia użytkownikom tworzenie folderów publicznych i zamieszczanie w nich wiadomości. Aby zrobić to w swojej aplikacji, użyj Aspose.Email’s EWSClient klasa do łączenia się z serwerem Exchange oraz odczytywania i pobierania wiadomości i postów z folderów publicznych. Poniższy fragment kodu pokazuje, jak odczytać wszystkie foldery publiczne i podfoldery oraz wyświetlić i pobrać wszystkie wiadomości znalezione w tych folderach. Ten przykład działa tylko z Microsoft Exchange Server 2007 lub nowszym, ponieważ tylko one obsługują 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);
}
}
}
Kopiowanie wiadomości do innego folderu
API Aspose.Email umożliwia kopiowanie wiadomości z jednego folderu do drugiego przy użyciu copyItem metoda. Przeciążona wersja tej metody zwraca unikalny URI skopiowanej wiadomości, jak pokazano w tym artykule.
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());
}
Synchronizacja elementów folderu
API Aspose.Email dla Javy IEWSClient udostępnia funkcję synchronizacji folderu Exchange wraz z jego zawartością. syncFolder metoda udostępniona przez IEWSClient klasa może być użyta do wykonywania synchronizacji informacji o folderze na określonym folderze. Poniższy fragment kodu pokazuje, jak synchronizować informacje o folderze 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);
Pobieranie uprawnień dla folderów Exchange
Użytkownikom przydzielane są uprawnienia do folderów publicznych na serwerze Exchange, co ogranicza/określa poziom dostępu użytkownika do tych folderów. ExchangeFolderPermission klasa zapewnia zestaw właściwości uprawnień dla folderów Exchange, takich jak PermissionLevel, czy mogą canCreateItems, deleteItems, oraz wykonywać inne zadania określone przez właściwości uprawnień. Uprawnienia można pobrać używając getFolderPermissions() metoda IEWSClient. Ten artykuł pokazuje, jak pobrać uprawnienia zastosowane do folderu publicznego dla wszystkich użytkowników, którzy mają dostęp do udostępnionych folderów.
Aby wykonać to zadanie:
- Zainicjalizuj EWSClient.
- Użyj listPublicFolders, aby uzyskać listę wszystkich folderów publicznych
- Pobierz uprawnienia powiązane z folderem, używając metody getFolderPermissions()
Poniższy fragment kodu pokazuje, jak używać EWSClient klasa do pobierania uprawnień zastosowanych do folderu.
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
}
Tworzenie folderów i podfolderów
API Aspose.Email zapewnia możliwość tworzenia folderów w skrzynce Exchange. CreateFolder metoda IEWSClient może być użyte w tym celu. Aby utworzyć folder w skrzynce pocztowej serwera Exchange, można użyć następujących kroków.
- Utwórz instancję IEWSClient.
- Ustaw właściwość UseSlashAsFolderSeparator zgodnie z potrzebą. Jeśli ustawisz na true, aplikacja będzie traktować „Slash” jako separator folderów i podfolder zostanie utworzony po ukośniku.
- Użyj metody createFolder, aby utworzyć folder.
Poniższy fragment kodu pokazuje, jak utworzyć foldery i podfoldery.
// 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);
}
}
Kopia zapasowa folderów Exchange do PST
Często zdarza się, że użytkownicy chcą wykonać kopię zapasową wszystkich lub niektórych folderów skrzynki pocztowej. Aspose.Email umożliwia wykonanie kopii zapasowej wszystkich lub wybranych folderów skrzynki Exchange do pliku PST. Ten artykuł opisuje tworzenie kopii zapasowej folderów Exchange do PST z przykładowym kodem. Aby wykonać backup folderów serwera Exchange, można wykonać następujące kroki.
- Zainicjuj IEWSClient przy użyciu poświadczeń użytkownika
- Dodaj wymagane informacje o folderze do ExchangeFolderInfoCollection
- Użyj metody backupu klienta, aby wyeksportować zawartość folderu do PST
Poniższy fragment kodu pokazuje, jak wykonać kopię zapasową folderów Exchange do pliku 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);