Exchange Server에서 폴더 작업

서버에서 모든 폴더 나열

Aspose.Email API는 Exchange Server에 연결하고 모든 폴더 및 하위 폴더를 나열할 수 있는 기능을 제공합니다. 또한 각 폴더에서 하위 폴더를 재귀적으로 가져올 수 있습니다. Exchange Web Service(EWS)를 사용하여 Exchange 클라이언트에서 페이징을 사용해 폴더를 나열하는 기능도 제공합니다. 이 문서는 Exchange 서버에서 모든 하위 폴더를 검색하고 페이징으로 폴더를 검색하는 방법을 보여줍니다.

다음 코드 스니펫은 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) {
    }
}

EWS를 사용한 폴더 유형 정보 가져오기

다음은 FolderType 에 의해 제공되는 속성 ExchangeFolderInfo 클래스를 사용하여 폴더 유형에 대한 정보를 가져올 수 있습니다. 아래 코드 샘플에 나와 있습니다.

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

EWS를 사용한 페이징 지원 폴더 나열

다음 코드 조각은 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());
}

메일함 사용자 정의 폴더 또는 하위 폴더 접근

IEWSClient 개발자가 메일함에서 모든 사용자 정의 폴더 또는 하위 폴더에 액세스할 수 있도록 합니다. folderExists() 함수 IEWSClient 지정된 사용자 정의 폴더/하위 폴더의 URI를 반환하며, 이를 사용하여 대상 폴더에 액세스할 수 있습니다. 다음 예에서는 INBOX 아래에 생성된 "TestInbox"라는 사용자 정의 폴더에 액세스하고 해당 폴더의 모든 메시지를 표시합니다. 이 작업을 수행하려면 다음 단계가 필요합니다:

  1. 유효한 자격 증명을 제공하여 IEWSClient 객체를 초기화합니다.
  2. 기본 메일함에 액세스합니다.
  3. 예제에서는 상위 폴더인 INBOX에 액세스합니다. 이 상위 폴더는 자체적으로 사용자 정의 폴더가 될 수도 있습니다.
  4. folderExists()를 사용하여 지정된 사용자 정의 하위 폴더를 검색합니다(예: "TestInbox"). 이는 "TestInbox"의 URI를 반환합니다.
  5. 이 URI를 사용하여 해당 사용자 정의 폴더의 모든 메시지에 액세스합니다.

다음 코드 조각은 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.");
}

공개 폴더 나열

Microsoft Exchange Server는 사용자가 공개 폴더를 만들고 그 안에 메시지를 게시하도록 허용합니다. 애플리케이션을 통해 이를 수행하려면 Aspose.Email을 사용하십시오. EWSClient Exchange Server에 연결하고 공개 폴더에서 메시지와 게시물을 읽고 다운로드하는 클래스입니다. 다음 코드 조각은 모든 공개 폴더와 하위 폴더를 읽고, 해당 폴더에서 찾은 모든 메시지를 나열하고 다운로드하는 방법을 보여줍니다. 이 예제는 EWS를 지원하는 Microsoft Exchange Server 2007 이상에서만 작동합니다.

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

메시지를 다른 폴더로 복사

Aspose.Email API는 다음을 사용하여 메시지를 한 폴더에서 다른 폴더로 복사할 수 있습니다. copyItem 메서드. 이 메서드의 오버로드된 버전은 이 문서에 표시된 복사된 메시지의 고유 URI를 반환합니다.

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

폴더 항목 동기화

Aspose.Email for Java API IEWSClient Exchange 폴더의 내용을 동기화하는 기능을 제공합니다. syncFolder 에 의해 노출된 메서드 IEWSClient 클래스를 사용하여 지정된 폴더에서 폴더 동기화 정보를 수행할 수 있습니다. 다음 코드 조각은 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);

Exchange 폴더의 권한 검색

사용자는 Exchange Server의 공개 폴더에 대한 권한이 할당되며, 이는 사용자가 해당 폴더에 액세스할 수 있는 수준을 제한/결정합니다. ExchangeFolderPermission 클래스는 다음과 같은 Exchange 폴더에 대한 일련의 권한 속성을 제공합니다. PermissionLevel, 그들이 할 수 있는지 여부 canCreateItems, deleteItems, 그리고 권한 속성에 지정된 다른 작업을 수행합니다. 권한은 다음을 사용하여 검색할 수 있습니다. getFolderPermissions() 메서드 IEWSClient. 이 문서에서는 공유 폴더에 액세스할 수 있는 모든 사용자를 위해 공개 폴더에 적용된 권한을 검색하는 방법을 보여줍니다.

이 작업을 수행하려면:

  1. EWSClient를 초기화합니다.
  2. listPublicFolders를 사용하여 모든 공개 폴더 목록을 가져옵니다.
  3. getFolderPermissions() 메서드를 사용하여 폴더와 연결된 권한을 검색합니다.

다음 코드 스니펫은 사용 방법을 보여줍니다. EWSClient 폴더에 적용된 권한을 검색하는 클래스.

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
}

폴더 및 하위 폴더 만들기

Aspose.Email API는 Exchange 메일함에 폴더를 생성하는 기능을 제공합니다. CreateFolder 메서드 IEWSClient 이 목적에 사용할 수 있습니다. Exchange 서버 메일함에 폴더를 생성하려면 다음 단계를 사용할 수 있습니다.

  1. IEWSClient 인스턴스를 생성합니다.
  2. UseSlashAsFolderSeparator 속성을 필요에 따라 설정하십시오. true로 설정하면 애플리케이션은 "슬래시"를 폴더 구분자로 간주하고 슬래시 뒤에 하위 폴더를 생성합니다.
  3. createFolder 메서드를 사용하여 폴더를 생성합니다.

다음 코드 스니펫은 폴더와 하위 폴더를 생성하는 방법을 보여줍니다.

// 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 폴더를 PST로 백업

사용자는 종종 모든 메일함 폴더 또는 일부 폴더를 백업하고 싶어합니다. Aspose.Email은 모든 또는 지정된 Exchange 메일함 폴더를 PST로 백업할 수 있는 기능을 제공합니다. 이 문서는 샘플 코드를 통해 Exchange 폴더를 PST로 백업하는 방법을 설명합니다. Exchange 서버 폴더를 백업하려면 다음 단계를 따르세요.

  1. 사용자 자격 증명으로 IEWSClient를 초기화합니다
  2. 필요한 폴더 정보를 ExchangeFolderInfoCollection에 추가합니다
  3. 클라이언트의 백업 메서드를 사용하여 폴더 내용을 PST로 내보냅니다

다음 코드 스니펫은 Exchange 폴더를 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);