Exchange 사서함 및 메시지 작업 - Java에서 Exchange 서버에서 이메일 읽기

EWS를 사용해 사서함 정보 얻기

다음은 EWSClient 클래스는 Exchange Server에서 메일함 정보를 가져오기 위해 다음을 호출하여 사용할 수 있는 멤버를 가지고 있습니다: IEWSClient.getMailboxInfo() 메서드. 해당 타입의 인스턴스를 반환합니다. ExchangeMailboxInfo. 다음과 같은 속성에서 메일함 정보를 가져옵니다: MailboxUri, InboxUriDraftsUri. 이 문서는 Exchange Web Services를 사용해 사서함 정보를 접근하는 방법을 보여줍니다.

Exchange Web Services(EWS)를 사용해 Exchange Server에 연결하려면, 다음을 사용하세요. EWSClient 클래스. 이 클래스는 EWS를 사용해 Exchange Server에 연결하고 항목을 관리합니다. 다음 Java 코드 스니펫은 Exchange Web Services를 사용해 사서함 정보를 가져오는 방법을 보여줍니다.

// Create instance of EWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

// Get mailbox size, exchange mailbox info, Mailbox and Inbox folder URI
System.out.println("Mailbox size: " + client.getMailboxSize() + " bytes");
ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();
System.out.println("Mailbox URI: " + mailboxInfo.getMailboxUri());
System.out.println("Inbox folder URI: " + mailboxInfo.getInboxUri());
System.out.println("Sent Items URI: " + mailboxInfo.getSentItemsUri());
System.out.println("Drafts folder URI: " + mailboxInfo.getDraftsUri());

이메일 메시지 보내기

다음 도구를 사용해 Exchange Server로 이메일 메시지를 보낼 수 있습니다. Aspose.Email.Exchange. IEWSClient.Send() 메서드는 MailMessage 인스턴스를 매개변수로 받아 이메일을 보냅니다. 이 문서는 Exchange Web Services를 사용해 이메일 메시지를 보내는 방법을 설명합니다.

Aspose.Email는 Exchange Web Services를 사용해 Microsoft Exchange Server에 연결하는 IEWSClient 클래스를 제공합니다. 다음 코드 스니펫은 EWS를 사용해 Microsoft Exchange Server로 이메일을 보내는 방법을 보여줍니다. 아래 Java 코드 스니펫은 EWS를 사용해 이메일 메시지를 보내는 방법을 보여줍니다.

// Create instance of IEWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

// Create instance of type MailMessage
MailMessage msg = new MailMessage();
msg.setFrom(MailAddress.to_MailAddress("sender@domain.com"));
msg.setTo(MailAddressCollection.to_MailAddressCollection("recipient@ domain.com "));
msg.setSubject("Sending message from exchange server");
msg.setHtmlBody("<h3>sending message from exchange server</h3>");

// Send the message
client.send(msg);

메시지 클래스 가져오기

다음은 getMessageClass() 메서드 ExchangeMessageInfo 클래스는 메시지의 클래스를 나타내는 문자열을 반환합니다. 아래 코드는 메시지 클래스를 얻는 방법을 보여줍니다.

try (IEWSClient client = EWSClient.getEWSClient(uri, credentials))
{
    ExchangeMessageInfoCollection messageInfoCollection = client.listMessagesFromPublicFolder(publicFolder);

    for (ExchangeMessageInfo messageInfo : messageInfoCollection)
    {
        System.out.println("Message Class: " + messageInfo.getMessageClass());
    }
}

다른 사용자의 사서함에서 이메일 읽기

Exchange 서버의 일부 계정은 여러 사서함에 접근 권한이 있으며, 일부 사용자는 동일한 Exchange 서버에서 여러 이메일 계정을 가집니다. 두 경우 모두 Aspose.Email for Java를 사용해 다른 사용자의 사서함에 접근할 수 있습니다. 이 API는 다른 사서함의 폴더와 이메일에 접근하는 메커니즘을 제공합니다. IEWSClient 클래스. 이 기능은 오버로드된 getMailboxInfo() 메서드와 사용자 이메일 주소를 매개변수로 제공하여.

다음 코드 스니펫은 이메일을 읽는 방법을 보여줍니다. IEWSClient 클래스.

// Create instance of EWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

// Get Exchange mailbox info of other email account
ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo("otherUser@domain.com");

메시지 나열

Exchange 메일함의 이메일 메시지 목록은 다음을 호출하여 가져올 수 있습니다: IEWSClient.listMessages 메서드. 제목, 발신자, 수신자 및 메시지 ID와 같은 기본 정보를 가져오려면 다음을 사용하십시오: listMessages 메서드.

간단한 메시지 목록

Exchange 사서함의 메시지를 나열하려면:

  1. 다음의 인스턴스를 생성합니다. IEWSClient 클래스.
  2. listMessages 메서드를 호출하고 메시지 컬렉션을 생성합니다.
  3. 컬렉션을 반복하며 메시지 정보를 표시합니다.

다음 Java 코드 스니펫은 EWS를 사용해 Exchange 서버에 연결하고 Inbox 폴더에서 메시지를 나열하는 방법을 보여줍니다.

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

// Loop through the collection to display the basic information
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgCollection) {
    System.out.println("Subject: " + msgInfo.getSubject());
    System.out.println("From: " + msgInfo.getFrom().toString());
    System.out.println("To: " + msgInfo.getTo().toString());
    System.out.println("Message ID: " + msgInfo.getMessageId());
    System.out.println("Unique URI: " + msgInfo.getUniqueUri());
}

다양한 폴더에서 메시지 나열

위의 코드 스니펫들, Inbox 폴더의 모든 메시지를 나열합니다. 다른 폴더의 메시지 목록도 가져올 수 있습니다. IEWSClient.listMessages() 메서드는 폴더 URI를 매개변수로 받습니다. 폴더 URI가 유효하면 해당 폴더의 메시지 목록을 가져올 수 있습니다. IEWSClient.getMailboxInfo().getXXXFolderUri 속성을 사용해 다양한 폴더의 URI를 얻으세요. 나머지 코드는 메시지 목록을 얻는 것과 동일합니다. 다음 코드 스니펫은 EWS를 사용해 다양한 폴더에서 메시지를 나열하는 방법을 보여줍니다.

// Create instance of EWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

// Get folder URI
String strFolderURI = "";
strFolderURI = client.getMailboxInfo().getInboxUri();
strFolderURI = client.getMailboxInfo().getDeletedItemsUri();
strFolderURI = client.getMailboxInfo().getDraftsUri();
strFolderURI = client.getMailboxInfo().getSentItemsUri();

// Get list of messages from the specified folder
ExchangeMessageInfoCollection msgCollection = client.listMessages(strFolderURI);

페이지 지원 메시지 목록

다음 Java 코드 스니펫은 페이지 지원이 있는 메시지 목록을 가져오는 방법을 보여줍니다.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
final IEWSClient client = EWSClient.getEWSClient("exchange.domain.com", "username", "password");
try {
    try {
        // Create some test messages to be added to server for retrieval later
        int messagesNum = 12;
        int itemsPerPage = 5;
        MailMessage message = null;
        for (int i = 0; i < messagesNum; i++) {
            message = new MailMessage("from@domain.com", "to@domain.com", "EMAILNET-35157_1 - " + UUID.randomUUID().toString(),
                    "EMAILNET-35157 Move paging parameters to separate class");
            client.appendMessage(client.getMailboxInfo().getInboxUri(), message);
        }
        // Verfiy that the messages have been added to the server
        ExchangeMessageInfoCollection totalMessageInfoCol = client.listMessages(client.getMailboxInfo().getInboxUri());
        System.out.println(totalMessageInfoCol.size());

        ////////////////// RETREIVING THE MESSAGES USING PAGING SUPPORT ////////////////////////////////////

        List<ExchangeMessagePageInfo> pages = new ArrayList<ExchangeMessagePageInfo>();
        ExchangeMessagePageInfo pageInfo = client.listMessagesByPage(client.getMailboxInfo().getInboxUri(), itemsPerPage);
        // Total Pages Count
        System.out.println(pageInfo.getTotalCount());

        pages.add(pageInfo);
        while (!pageInfo.getLastPage()) {
            pageInfo = client.listMessagesByPage(client.getMailboxInfo().getInboxUri(), itemsPerPage, pageInfo.getPageOffset() + 1);
            pages.add(pageInfo);
        }
        int retrievedItems = 0;
        // foreach to while statements conversion
        for (ExchangeMessagePageInfo pageCol : pages) {
            retrievedItems += pageCol.getItems().size();
        }
        // Verify total message count using paging
        System.out.println(retrievedItems);
    } finally {
    }
} finally {
    client.dispose();
}

ExchangeMessageInfo에서 메시지 유형 정보 가져오기

IEWSClient client = EWSClient.getEWSClient(mailboxUri, credentials);

ExchangeMessageInfoCollection list = client.listMessages(client.getMailboxInfo().getDeletedItemsUri());
System.out.println(list.get_Item(0).getMessageInfoType()); // MessageInfoType

메시지 저장

이 문서는 Exchange Server 사서함에서 메시지를 가져와 디스크에 EML 및 MSG 형식으로 저장하는 방법을 보여줍니다.

  • 디스크에 EML로 저장.
  • 메모리 스트림에 저장.
  • MSG로 저장.

EML로 메시지 저장

메시지를 가져와 EML 형식으로 저장하려면:

  1. IEWSC lient 클래스의 인스턴스를 생성합니다.
  2. mailboxUri, 사용자명, 비밀번호 및 도메인을 제공합니다.
  3. IEWSC lient.listMessages() 메서드를 호출해 ExchangeMessagesInfoCollection 컬렉션 인스턴스를 가져옵니다.
  4. ExchangeMessagesInfoCollection 컬렉션을 반복하여 각 메시지의 고유 URI를 가져옵니다.
  5. IEWSC lient.saveMessage() 메서드를 호출하고 고유 URI를 매개변수로 전달합니다.
  6. saveMessage() 메서드에 파일을 저장할 경로를 제공합니다.

다음 코드 스니펫은 EWS를 사용해 Exchange Server에 연결하고 메시지를 EML 파일로 저장하는 방법을 보여줍니다.

// Create instance of IEWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());

// Loop through the collection to get Message URI
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgCollection) {
    String strMessageURI = msgInfo.getUniqueUri();

    // Now save the message in disk
    client.saveMessage(strMessageURI, dataDir + msgInfo.getMessageId() + "out.eml");
}

메시지를 메모리 스트림에 저장

EML 파일을 디스크에 저장하는 대신 메모리 스트림에 저장할 수 있습니다. 이는 스트림을 데이터베이스와 같은 저장소에 저장하려는 경우에 유용합니다. 스트림이 데이터베이스에 저장되면 EML 파일을 다시 로드할 수 있습니다. MailMessage 클래스. 다음 코드 스니펫은 EWS를 사용해 Exchange Server 사서함에서 메시지를 메모리 스트림에 저장하는 방법을 보여줍니다.

// Create instance of EWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());

// Loop through the collection to get Message URI
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgCollection) {
    String strMessageURI = msgInfo.getUniqueUri();

    // Now save the message in memory stream
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    client.saveMessage(strMessageURI, stream);
}

MSG 형식으로 메시지 저장

다음은 IEWSClient.saveMessage() 메서드는 메시지를 직접 EML 형식으로 저장할 수 있습니다. MSG 형식으로 저장하려면 먼저 IEWSClient.fetchMessage() 인스턴스를 반환하는 메서드 MailMessage 클래스. 그런 다음 호출합니다 MailMessage.save() 메시지를 MSG로 저장하는 메서드. 다음 코드 스니펫은 Exchange Server 사서함에서 메시지를 가져와 EWS를 사용해 MSG 형식으로 저장하는 방법을 보여줍니다.

// Create instance of EWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());

int count = 0;
// Loop through the collection to get Message URI
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgCollection) {
    String strMessageURI = msgInfo.getUniqueUri();

    // Now get the message details using FetchMessage() and Save message as Msg
    MailMessage message = client.fetchMessage(strMessageURI);
    message.save(dataDir + (count++) + "_out.msg", SaveOptions.getDefaultMsgUnicode());
}

Message URI에서 ExchangeMessageInfo 가져오기

이메일 메시지는 고유 식별자와 URI로 표현되며, 다음의 필수 부분입니다. ExchangeMessageInfo 객체. 메시지 URI만 가능한 경우, 다음과 같이 ExchangeMessageInfo 객체는 이 정보로도 검색할 수 있습니다. 오버로드 버전은 listMessages 사용할 Id 목록을 받습니다. ExchangeMessageInfoCollection. 다음 코드 스니펫은 가져오는 방법을 보여줍니다. ExchangeMessageInfo 메시지 URI에서.

IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "user@domain.com", "pwd", "domain");

List<String> ids = new ArrayList<String>();
List<MailMessage> messages = new ArrayList<MailMessage>();

for (int i = 0; i < 5; i++) {
    MailMessage message = new MailMessage("user@domain.com", "receiver@domain.com", "EMAILNET-35033 - " + UUID.randomUUID().toString(),
            "EMAILNET-35033 Messages saved from Sent Items folder doesn't contain 'To' field");
    messages.add(message);
    String uri = client.appendMessage(message);
    ids.add(uri);
}

ExchangeMessageInfoCollection messageInfoCol = client.listMessages(ids);

for (ExchangeMessageInfo messageInfo : (Iterable<ExchangeMessageInfo>) messageInfoCol) {
    // Do something ...
    System.out.println(messageInfo.getUniqueUri());
}

Exchange Server 사서함에서 메시지 가져오기

Exchange Server에서 메시지 나열은 listMessages() Exchange Server 사서함에서 메시지 목록을 가져오는 메서드입니다. listMessages() 메서드는 메시지의 기본 정보를 가져옵니다(예: 제목, 메시지 ID, 발신자 및 수신자). 전체 메시지 세부 정보를 얻으려면 Aspose.Email.Exchange가 IEWSClient.fetchMessage() 메서드를 제공합니다. 이 메서드는 메시지 URI를 매개변수로 받아 해당 인스턴스를 반환합니다. MailMessage 클래스. MailMessage 클래스는 본문, 헤더 및 첨부 파일과 같은 메시지 세부 정보를 제공합니다. 자세히 알아보세요. MailMessage API, 또는 이메일 관리 방법을 확인하십시오. MailMessage 클래스. Exchange Server 사서함에서 메시지를 가져오려면:

  1. IEWSC lient 타입의 인스턴스를 생성합니다.
  2. 서버 이름, 사용자 이름, 비밀번호 및 도메인을 지정합니다.
  3. listMessages를 호출하여 ExchangeMessageInfoCollection을 가져옵니다.
  4. ExchangeMessageInfoCollection 컬렉션을 반복하여 ExchangeMessageInfo.UniqueURI 값을 가져옵니다.
  5. IEWSC lient.fetchMessage()를 호출하고 ExchangeMessageInfo.UniqueURI를 매개변수로 전달합니다.

다음 코드 스니펫은 Exchange Server 사서함에 연결하고 EWS를 사용하여 모든 메시지를 가져오는 방법을 보여줍니다.

// Create instance of ExchangeWebServiceClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());

// Loop through the collection to get Message URI
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgCollection) {
    String strMessageURI = msgInfo.getUniqueUri();

    // Now get the message details using FetchMessage()
    MailMessage msg = client.fetchMessage(strMessageURI);

    for (Attachment att : (Iterable<Attachment>) msg.getAttachments()) {
        System.out.println("Attachment Name: " + att.getName());
    }
}

FetchItem 메서드를 사용하여 메시지 가져오기

다음은 FetchItem 메시지를 가져오려면 이 메서드가 더 선호됩니다. MapiMessage 그리고 MAPI 속성과 함께 작동합니다. 이 메서드를 사용하여 연락처, 약속, 작업 등 Outlook 항목을 가져올 수도 있습니다.

// Create instance of ExchangeWebServiceClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());

// Loop through the collection to get Message URI
for (ExchangeMessageInfo msgInfo : msgCollection)
{
    // Now get the message using FetchItem()
    MapiMessage msg = client.fetchItem(msgInfo.getUniqueUri());

    // If necessary, you can cast the MapiMessage to the proper item type to simplify working with its properties.
    MapiContact contact = (MapiContact) msg.toMapiMessageItem();
}

메시지 크기 사전 가져오기

Microsoft Outlook InterOp은 서버에서 전체 메시지를 실제로 가져오기 전에 메시지 크기를 가져오는 기능을 제공합니다. Aspose.Email API의 경우, Exchange 서버에서 가져온 요약 정보는 다음과 같이 나타냅니다. ExchangeMessageInfo 클래스. Size 속성을 사용하여 메시지 크기를 가져오는 동일한 기능을 제공합니다. 메시지 크기를 가져오기 위해 표준 호출인 IEWSClient의 listMessages가 컬렉션을 검색하는 데 사용됩니다. ExchangeMessageInfo. 다음 코드 스니펫은 메시지 크기를 표시하는 방법을 보여줍니다. ExchangeMessageInfo 클래스.

// Create instance of ExchangeWebServiceClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());

// Loop through the collection to display the basic information
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgCollection) {
    System.out.println("Subject: " + msgInfo.getSubject());
    System.out.println("From: " + msgInfo.getFrom().toString());
    System.out.println("To: " + msgInfo.getTo().toString());
    System.out.println("Message Size: " + msgInfo.getSize());
    System.out.println("==================================");
}

메시지 재귀 다운로드

다음은 EWSClient’s listSubFolders() 이 메서드는 Exchange Server 메일함의 폴더와 하위 폴더에서 메시지를 재귀적으로 가져오는 데 사용할 수 있습니다. EWS를 사용하므로 Exchange Server 2007 이상이 필요합니다. 다음 코드 스니펫은 Exchange Server의 전체 메일함(폴더 및 하위 폴더)을 다운로드하는 방법을 보여줍니다. 폴더 구조가 로컬에 생성되고 모든 메시지가 다운로드됩니다.

public static void run() {
    try {
        downloadAllMessages();
    } catch (java.lang.RuntimeException ex) {
        System.out.println(ex.getMessage());
    }
}

private static void downloadAllMessages() {
    try {
        String rootFolder = domain + "-" + username;
        new File(rootFolder).mkdirs();
        String inboxFolder = rootFolder + "\\Inbox";
        new File(inboxFolder).mkdirs();

        System.out.println("Downloading all messages from Inbox....");
        // Create instance of IEWSClient class by giving credentials
        IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", username, password, domain);

        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
            listMessagesInFolder(client, folderInfo, rootFolder);
        }

        System.out.println("All messages downloaded.");
    } catch (java.lang.RuntimeException ex) {
        System.out.println(ex.getMessage());
    }
}

// Recursive method to get messages from folders and sub-folders
private static void listMessagesInFolder(IEWSClient client, ExchangeFolderInfo folderInfo, String rootFolder) {
    // Create the folder in disk (same name as on IMAP server)
    String currentFolder = rootFolder + "\\" + folderInfo.getDisplayName();
    new File(currentFolder).mkdirs();

    // List messages
    ExchangeMessageInfoCollection msgInfoColl = client.listMessages(folderInfo.getUri());
    System.out.println("Listing messages....");
    int i = 0;
    for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgInfoColl) {
        // Get subject and other properties of the message
        System.out.println("Subject: " + msgInfo.getSubject());

        // Get rid of characters like ? and :, which should not be included in a file name
        String fileName = msgInfo.getSubject().replace("?", " ").replace(":", " ");

        MailMessage msg = client.fetchMessage(msgInfo.getUniqueUri());
        msg.save(dataDir + "\\" + fileName + "-" + i + ".msg");

        i++;
    }
    System.out.println("============================\n");
    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) {
            listMessagesInFolder(client, subfolderInfo, currentFolder);
        }
    } catch (java.lang.RuntimeException e) {
    }
}

공용 폴더에서 메시지 다운로드

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

메시지 이동

다음의 도움으로 이메일 메시지를 한 폴더에서 다른 폴더로 이동할 수 있습니다: IEWSClient 클래스 move 메서드. 매개변수는 다음과 같습니다:

  • 이동될 메시지의 고유 URI.
  • 대상 폴더의 고유 URI.

폴더 간 메시지 이동

다음 코드 스니펫은 메일함에서 받은 편지함 폴더의 메시지를 Processed 라는 폴더로 이동하는 방법을 보여줍니다. 이 예제에서 애플리케이션은:

  1. Inbox 폴더에서 메시지를 읽습니다.
  2. 일부 기준에 따라 메시지를 처리합니다(예: 메시지 제목에 키워드가 있는지 확인).
  3. 주어진 조건을 충족하는 메시지를 처리 폴더로 이동합니다.
// Create instance of IEWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();

// List all messages from Inbox folder
System.out.println("Listing all messages from Inbox....");
ExchangeMessageInfoCollection msgInfoColl = client.listMessages(mailboxInfo.getInboxUri());
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgInfoColl) {
    // Move message to "Processed" folder, after processing certain messages based on some criteria
    if (msgInfo.getSubject() != null && msgInfo.getSubject().toLowerCase().contains("process this message")) {
        client.moveItem(mailboxInfo.getDeletedItemsUri(), msgInfo.getUniqueUri()); // EWS
        System.out.println("Message moved...." + msgInfo.getSubject());
    } else {
        // Do something else
    }
}

메시지 삭제

폴더에서 이메일 메시지를 삭제하려면 다음을 사용하면 됩니다. IEWSClient 클래스 deleteItem 메서드. 메시지의 고유 URI를 매개변수로 받습니다.

다음 코드 스니펫은 Inbox 폴더에서 메시지를 삭제하는 방법을 보여줍니다. 예시를 위해, 코드는:

  1. Inbox 폴더에서 메시지를 읽습니다.
  2. 일부 기준에 따라 메시지를 처리합니다(이 예에서는 메시지 제목에 키워드가 있는지를 찾습니다).
  3. 메시지를 삭제합니다.
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();

// List all messages from Inbox folder
System.out.println("Listing all messages from Inbox....");
ExchangeMessageInfoCollection msgInfoColl = client.listMessages(mailboxInfo.getInboxUri());
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgInfoColl) {
    // Delete message based on some criteria
    if (msgInfo.getSubject() != null && msgInfo.getSubject().toLowerCase().contains("delete") == true) {
        client.deleteItem(msgInfo.getUniqueUri(), DeletionOptions.getDeletePermanently()); // EWS
        System.out.println("Message deleted...." + msgInfo.getSubject());
    } else {
        // Do something else
    }
}

메시지 복사

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