유틸리티 기능

투표 옵션이 있는 메시지 전송

Microsoft Outlook은 새 메시지를 작성할 때 설문 조사를 만들 수 있게 합니다. 이는 Yes, No, Maybe 등과 같은 투표 옵션을 포함시켜 수행됩니다. Aspose.Email이 제공하는 FollowUpOptions 클래스는 투표 옵션 값을 설정하거나 가져올 수 있는 VotingButtons 속성을 제공합니다. 이 문서는 설문 조사를 만들기 위해 투표 옵션이 포함된 MapiMessage를 생성하고, 이를 Exchange Web Service (EWS) 클라이언트를 사용하여 전송하는 자세한 예제를 제공합니다.

투표 옵션이 포함된 메시지 생성 및 전송

다음 코드 조각은 새 메시지를 생성하고 투표 옵션과 함께 전송하는 방법을 보여줍니다.

String address = "firstname.lastname@aspose.com";

IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
MailMessage message = createTestMessage(address);

// Set FollowUpOptions Buttons
FollowUpOptions options = new FollowUpOptions();
options.setVotingButtons("Yes;No;Maybe;Exactly!");

client.send(message, options);

예제에 사용된 샘플 메서드

다음 코드 조각은 위 예제에서 사용된 메서드들을 사용하는 방법을 보여줍니다.

private static MailMessage createTestMessage(String address) {
    MailMessage eml = new MailMessage(address, address, "Flagged message",
            "Make it nice and short, but descriptive. The description may appear in search engines' search results pages...");

    return eml;
}

MSG 파일에서 RE 및 FW 메시지 생성

IEWSClient 개발자가 원본 메시지에서 RE(Reply/Reply All) 및 FW(Forward) 메시지를 생성하도록 합니다. 원본 메시지는 특정 ExchangeMessageInfo 출처 ExchangeMessageInfoCollection IEWSClient.listMessages()에 의해 얻어집니다. 다른 인수는 실제 MailMessage RE 또는 FW 메시지로 전송됩니다. 다음 코드 조각은 샘플 계정을 생성하여 메시지를 전송하고, 그 샘플 메시지에 대해 회신 및 전달 기능을 시연하는 방법을 보여줍니다. 이 작업을 수행하려면:

  1. 유효한 자격 증명을 제공하여 IEWSClient 객체를 초기화합니다.
  2. 몇 개의 샘플 메시지를 전송합니다.
  3. IEWSClient.reply(), IEWSClient.replyAll() 및 IEWSClient.forward() 함수를 호출하여 메시지를 전송합니다.
IEWSClient client = EWSClient.getEWSClient(mailboxUri, credential);

try {
    MailMessage message = new MailMessage("user@domain.com", "user@domain.com", "TestMailRefw - " + UUID.randomUUID().toString(),
            "TestMailRefw Implement ability to create RE and FW messages from source MSG file");

    client.send(message);

    ExchangeMessageInfoCollection messageInfoCol = client.listMessages(client.getMailboxInfo().getInboxUri());
    if (messageInfoCol.size() == 1)
        System.out.println("1 message in Inbox");
    else
        System.out.println("Error! No message in Inbox");

    MailMessage message1 = new MailMessage("user@domain.com", "user@domain.com", "TestMailRefw - " + UUID.randomUUID().toString(),
            "TestMailRefw Implement ability to create RE and FW messages from source MSG file");

    client.send(message1);
    messageInfoCol = client.listMessages(client.getMailboxInfo().getInboxUri());

    if (messageInfoCol.size() == 2)
        System.out.println("2 messages in Inbox");
    else
        System.out.println("Error! No new message in Inbox");

    MailMessage message2 = new MailMessage("user@domain.com", "user@domain.com", "TestMailRefw - " + UUID.randomUUID().toString(),
            "TestMailRefw Implement ability to create RE and FW messages from source MSG file");
    message2.getAttachments().addItem(Attachment.createAttachmentFromString("Test attachment 1", "Attachment Name 1"));
    message2.getAttachments().addItem(Attachment.createAttachmentFromString("Test attachment 2", "Attachment Name 2"));

    // Reply, Replay All and forward Message
    client.reply(message2, messageInfoCol.get_Item(0));
    client.replyAll(message2, messageInfoCol.get_Item(0));
    client.forward(message2, messageInfoCol.get_Item(0));
} catch (java.lang.RuntimeException ex) {
    System.out.println("Error in program" + ex.getMessage());
}

Office 365용 EWS OAuth 지원

Aspose.Email API는 Office 365와 함께 Exchange Web Service (EWS)를 지원합니다. API의 EWSClient 인터페이스는 다음을 제공하는 오버로드 메서드를 제공합니다. OAuthNetworkCredential OAuth를 통해 Exchange 계정에 액세스하기 위한 입력으로 사용됩니다. 사용자는 이 기능을 사용하려면 Authority, Client Id, Client App Uri 및 Resource 매개변수를 제공해야 합니다. 다음 코드 조각은 Office 365와 함께 사용하는 EWS에 대한 OAuth 지원을 보여줍니다.

// token provider
/*ITokenProvider provider = new ITokenProvider() {

    @Override
    public void dispose() {
    }

    @Override
    public OAuthToken getAccessToken(boolean ignoreExistingToken) {
        return null;
    }

    @Override
    public OAuthToken getAccessToken() {
        return null;
    }
};

NetworkCredential credentials = new OAuthNetworkCredential(provider);*/

// accessToken
NetworkCredential credentials = new OAuthNetworkCredential("accessToken");

IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", credentials);
client.listMessages();

Exchange 클라이언트 로깅 지원

Aspose.Email API는 Exchange Web Service 클라이언트에 대한 로깅 기능을 제공합니다.

EWS 클라이언트 로깅

client.setLogFileName("logs/ews");
// OR
EWSClient.setCommonLogFileName("logs/ews");

EWS 요청에 헤더 추가

Aspose.Email API를 사용하면 Exchange 요청에 헤더를 추가할 수 있습니다. 이는 다양한 목적에 사용되는 헤더를 EWS 요청에 추가하는 데 활용될 수 있습니다. 예를 들어 Exchange 서버의 제한 문제를 관리하는 데 사용되는 X-AnchorMailbox 헤더를 추가할 수 있습니다. 아래 코드 조각과 같이 IEWSClient의 addHeader 메서드를 사용하여 EWS 요청에 헤더를 추가합니다.

final IEWSClient client = EWSClient.getEWSClient("exchange.domain.com/ews/Exchange.asmx", "username", "password", "");
try {
    client.addHeader("X-AnchorMailbox", "username@domain.com");
    ExchangeMessageInfoCollection messageInfoCol = client.listMessages(client.getMailboxInfo().getInboxUri());
} finally {
    client.dispose();
}

헤더에 클라이언트 요청 ID 반환

다음은 return-client-request-id 헤더가 요청에 전송되고 서버가 여부를 판단하는 데 사용됩니다. client-request-id 클라이언트가 지정한 헤더는 서버 응답에 반환되어야 합니다. 이 작업에 사용되는 메서드는 다음과 같습니다:

try (IEWSClient client = createEWSClient())
{
    // Client will create random id and pass it to the server.
    // The server should include this id in request-id header of all responses.
    client.setReturnClientRequestId(true);
    
    client.setLogFileName("ews.log");
    client.getMailboxInfo();
}

통합 메시징 작업

Aspose.Email는 Exchange Server 2010에서 통합 메시징 정보를 검색할 수 있습니다. 현재 지원되는 통합 메시징에는 구성 정보 가져오기, 외부 호출 시작, 호출 ID로 전화 통화 정보 검색 및 ID로 전화 끊기가 포함됩니다. 다음 코드 샘플은 Microsoft Exchange Server 2010에서 통합 메시징 구성 정보를 검색하는 방법을 보여줍니다.

IEWSClient client = EWSClient.getEWSClient(mailboxUri, credential);
UnifiedMessagingConfiguration umConf = client.getUMConfiguration();

메일 팁 받기

Microsoft Exchange Server는 Exchange Server 2010 및 2013에서 여러 새로운 기능을 추가했습니다. 그 중 하나는 사용자가 이메일을 작성할 때 메일 팁을 제공하는 기능입니다. 이 팁은 이메일이 전송되기 전에 정보를 제공하므로 매우 유용합니다. 예를 들어 수신자 목록에 잘못된 이메일 주소가 있으면 팁이 표시되어 주소가 유효하지 않음을 알려줍니다. 메일 팁을 통해 이메일을 보내기 전에 부재 중 자동 회신을 확인할 수 있습니다: 수신자 중 하나 이상이 부재 중 회신을 설정한 경우 Exchange Server(2010 & 2013)는 이메일 작성 중에 메일 팁을 보냅니다. 이 문서에 시연된 모든 기능을 사용하려면 Microsoft Exchange Server 2010 Service Pack 1이 필요합니다. 다음 코드 조각은 이를 사용하는 방법을 보여줍니다. EWSClient Microsoft Exchange Server 2007 이후 버전에서 사용할 수 있는 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");
System.out.println("Connected to Exchange server...");
// Provide mail tips options
MailAddressCollection addrColl = new MailAddressCollection();
addrColl.addMailAddress(new MailAddress("test.exchange@ex2010.local", true));
addrColl.addMailAddress(new MailAddress("invalid.recipient@ex2010.local", true));
GetMailTipsOptions options = new GetMailTipsOptions(MailAddress.to_MailAddress("administrator@ex2010.local"), addrColl, MailTipsType.All);

// Get Mail Tips
MailTips[] tips = client.getMailTips(options);

// Display information about each Mail Tip
for (MailTips tip : tips) {
    // Display Out of office message, if present
    if (tip.getOutOfOffice() != null) {
        System.out.println("Out of office: " + tip.getOutOfOffice().getReplyBody().getMessage());
    }

    // Display the invalid email address in recipient, if present
    if (tip.getInvalidRecipient() == true) {
        System.out.println("The recipient address is invalid: " + tip.getRecipientAddress());
    }
}

Exchange 인페르소네이션

Exchange 인페르소네이션은 사용자가 다른 계정을 가장하여 해당 계정의 권한으로 작업을 수행하도록 허용합니다. 위임이 다른 사용자를 대신해 행동하게 하는 반면, 인페르소네이션은 다른 사용자인 것처럼 행동하게 합니다. Aspose.Email는 Exchange 인페르소네이션을 지원합니다. EWSClient 이 클래스는 ImpersonateUser 및 ResetImpersonation 메서드를 제공하여 이 기능을 지원합니다.

이 작업을 수행하려면:

  1. 사용자 1에 대한 ExchangeWebServiceClient를 초기화합니다.
  2. 사용자 2에 대한 ExchangeWebServiceClient를 초기화합니다.
  3. 계정에 테스트 메시지를 추가합니다.
  4. Impersonation 활성화.
  5. Impersonation 재설정.

다음 코드 스니펫은 사용 방법을 보여줍니다. EWSClient Impersonation 기능을 구현하기 위한 클래스.

// Create instance's of EWSClient class by giving credentials
IEWSClient client1 = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser1", "pwd", "domain");
IEWSClient client2 = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser2", "pwd", "domain");
{
    String folder = "Drafts";
    try {
        for (ExchangeMessageInfo messageInfo : (Iterable<ExchangeMessageInfo>) client1.listMessages(folder))
            client1.deleteItem(messageInfo.getUniqueUri(), DeletionOptions.getDeletePermanently());
        String subj1 = "NETWORKNET_33354 User User1";
        client1.appendMessage(folder, new MailMessage("User1@exchange.conholdate.local", "To@aspsoe.com", subj1, ""));

        for (ExchangeMessageInfo messageInfo : (Iterable<ExchangeMessageInfo>) client2.listMessages(folder))
            client2.deleteItem(messageInfo.getUniqueUri(), DeletionOptions.getDeletePermanently());
        String subj2 = "NETWORKNET_33354 User User2";
        client2.appendMessage(folder, new MailMessage("User2@exchange.conholdate.local", "To@aspose.com", subj2, ""));

        ExchangeMessageInfoCollection messInfoColl = client1.listMessages(folder);
        // Assert.AreEqual(1, messInfoColl.Count);
        // Assert.AreEqual(subj1, messInfoColl[0].Subject);

        client1.impersonateUser(ItemChoice.PrimarySmtpAddress, "User2@exchange.conholdate.local");
        ExchangeMessageInfoCollection messInfoColl1 = client1.listMessages(folder);
        // Assert.AreEqual(1, messInfoColl1.Count);
        // Assert.AreEqual(subj2, messInfoColl1[0].Subject);

        client1.resetImpersonation();
        ExchangeMessageInfoCollection messInfoColl2 = client1.listMessages(folder);
        // Assert.AreEqual(1, messInfoColl2.Count);
        // Assert.AreEqual(subj1, messInfoColl2[0].Subject);
    } finally {
        try {
            for (ExchangeMessageInfo messageInfo : (Iterable<ExchangeMessageInfo>) client1.listMessages(folder))
                client1.deleteItem(messageInfo.getUniqueUri(), DeletionOptions.getDeletePermanently());
            for (ExchangeMessageInfo messageInfo : (Iterable<ExchangeMessageInfo>) client2.listMessages(folder))
                client2.deleteItem(messageInfo.getUniqueUri(), DeletionOptions.getDeletePermanently());
        } catch (java.lang.RuntimeException e) {
        }
    }
}

EWS를 이용한 자동 검색 기능

Aspose.Email API를 사용하면 EWS 클라이언트를 통해 Exchange 서버 설정을 검색할 수 있습니다. 

AutodiscoverService svc = new AutodiscoverService();
svc.setCredentials(new NetworkCredential(email, password));

IGenericDictionary</* UserSettingName */Integer, Object> userSettings = svc.getUserSettings(email, UserSettingName.ExternalEwsUrl).getSettings();
String ewsUrl = (String) userSettings.get_Item(UserSettingName.ExternalEwsUrl);
System.out.println("Auto discovered EWS Url: " + ewsUrl);

Exchange 서버에서 PST 복원 중단 작업

Aspose.Email API를 사용하면 PST 파일을 Exchange 서버로 복원할 수 있습니다. 그러나 PST 파일이 크게 인해 작업이 오래 걸리는 경우 작업을 중단하기 위한 기준을 지정해야 할 수 있습니다. 이는 아래 예제 코드와 같이 API를 사용하여 구현할 수 있습니다.

final IEWSClient client = EWSClient.getEWSClient("https://exchange.office365.com/ews/exchange.asmx", "username", "password");
try {
    final long startTime = System.currentTimeMillis();
    final AtomicInteger processedItems = new AtomicInteger(0);
    final long S15 = 15 * 1000;

    BeforeItemCallback callback = new BeforeItemCallback() {
        public void invoke(ItemCallbackArgs item) {
            if (System.currentTimeMillis() - startTime > S15) {
                throw new AbortRestoreException();
            }

            processedItems.incrementAndGet();
        }
    };

    try {
        // create a test pst and add some test messages to it
        PersonalStorage pst = PersonalStorage.create(new ByteArrayOutputStream(), FileFormatVersion.Unicode);
        FolderInfo folder = pst.getRootFolder().addSubFolder("My test folder");
        for (int i = 0; i < 20; i++) {
            MapiMessage message = new MapiMessage("from@gmail.com", "to@gmail.com", "subj", "body");
            folder.addMessage(message);
        }
        RestoreSettings rs = new RestoreSettings();
        rs.setBeforeItemCallback(callback);

        // now restore the PST with callback
        client.restore(pst, rs);
        System.out.println("Success!");
    } catch (AbortRestoreException e) {
        System.out.println("Timeout! " + processedItems.get());
    }
} finally {
    client.dispose();
}