Hulpfuncties

Bericht verzenden met stemoptie

Microsoft Outlook laat gebruikers een poll maken bij het opstellen van een nieuw bericht. Dit gebeurt door stemopties op te nemen zoals Ja, Nee, Misschien, enz. De FollowUpOptions‑klasse van Aspose.Email biedt de VotingButtons‑eigenschap die gebruikt kan worden om de waarde van de stemopties in te stellen of op te vragen. Dit artikel geeft een gedetailleerd voorbeeld van het maken van een MapiMessage met stemopties voor het creëren van een poll en vervolgens het verzenden van het bericht via Exchange Web Service (EWS) client.

Bericht maken en verzenden met stemopties

Het volgende codefragment toont hoe u een nieuw bericht maakt en vervolgens verzendt met stemopties.

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

Voorbeeldmethoden gebruikt in voorbeelden

Het volgende codefragment toont hoe u de in het bovenstaande voorbeeld gebruikte methoden toepast.

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

RE- en FW-berichten maken vanuit MSG‑bestanden

IEWSClient laat ontwikkelaars RE (Reply/Reply All) en FW (Forward) berichten maken vanuit een bronbericht. Het bronbericht wordt geïdentificeerd door een bepaald ExchangeMessageInfo van ExchangeMessageInfoCollection verkregen via IEWSClient.listMessages(). Het andere argument is de daadwerkelijke MailMessage te verzenden als RE- of FW-bericht. Het volgende codefragment toont hoe u een voorbeeldaccount maakt die wordt gebruikt om een bericht te verzenden en vervolgens de Reply- en Forward-functies wordt gedemonstreerd op dat voorbeeldbericht. Om deze taak uit te voeren:

  1. Initialiseer het IEWSClient-object door geldige inloggegevens te verstrekken.
  2. Stuur een paar voorbeeldberichten.
  3. Roep de functies IEWSClient.reply(), IEWSClient.replyAll() en IEWSClient.forward() aan om berichten te verzenden.
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());
}

OAuth‑ondersteuning voor EWS met Office 365

Aspose.Email API biedt ondersteuning voor Exchange Web Service (EWS) met Office 365. De API’s EWSClient interface biedt een overload‑methode die het OAuthNetworkCredential als invoer voor toegang tot het Exchange‑account via OAuth. De gebruiker moet de Authority, Client‑ID, Client‑App‑URI en Resource‑parameters opgeven om dit te laten werken. Het volgende codefragment toont OAuth‑ondersteuning voor EWS met Office 365.

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

Ondersteuning voor logging in Exchange‑clients

Aspose.Email API biedt de mogelijkheid om logging‑faciliteit voor de Exchange Web Service‑client te bieden.

Loggen voor EWS‑client

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

Headers toevoegen in EWS‑verzoeken

Aspose.Email API staat toe headers toe te voegen aan Exchange‑verzoeken. Dit kan worden gebruikt om headers aan EWS‑verzoeken toe te voegen voor verschillende doeleinden. Een voorbeeld is het toevoegen van de X-AnchorMailbox‑header die wordt gebruikt om throttling‑problemen op de Exchange‑server te beheren. De addHeader‑methode van de IEWSClient wordt gebruikt om headers aan de EWS‑verzoeken toe te voegen, zoals getoond in het volgende codefragment.

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

Client‑request‑ID in de header retourneren

De return-client-request-id header wordt verzonden in het verzoek en door de server gebruikt om te bepalen of de client-request-id header opgegeven door de client moet worden geretourneerd in de serverrespons. De volgende methoden worden in deze bewerking gebruikt:

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

Werken met Unified Messaging

Aspose.Email kan unified messaging‑informatie ophalen van Exchange Server 2010. Unified messaging zoals het verkrijgen van configuratie‑informatie, een uitgaand gesprek starten, gespreksinformatie opvragen via gespreks‑ID en een gesprek beëindigen via ID wordt momenteel ondersteund. Het volgende codevoorbeeld toont hoe u unified messaging‑configuratie‑informatie van Microsoft Exchange Server 2010 kunt ophalen.

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

E‑mailtips verkrijgen

Microsoft Exchange Server heeft verschillende nieuwe functies toegevoegd in Exchange Server 2010 en 2013. Een daarvan laat gebruikers e‑mailtips zien tijdens het opstellen van een e‑mail. Deze tips zijn erg handig omdat ze informatie geven voordat de e‑mail wordt verzonden. Bijvoorbeeld, als een e‑mailadres onjuist is in de lijst van geadresseerden, wordt een tip getoond die aangeeft dat het adres ongeldig is. E‑mailtips laten ook zien wanneer afwezigheidsantwoorden zijn ingesteld voordat de e‑mail wordt verzonden: Exchange Server (2010 & 2013) stuurt de tip tijdens het opstellen als één of meer geadresseerden een afwezigheidsantwoord hebben ingesteld. Microsoft Exchange Server 2010 Service Pack 1 is vereist voor alle functies die in dit artikel worden gedemonstreerd. Het volgende codefragment toont hoe u de EWSClient klasse die Exchange Web Services gebruikt, beschikbaar in Microsoft Exchange Server 2007 en latere versies.

// 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-imitatie

Exchange-imitatie stelt iemand in staat een ander account na te bootsen en taken uit te voeren met de rechten van dat geëmuleerde account in plaats van de eigen rechten. Waar delegatie gebruikers laat handelen namens anderen, laat imitatie hen als andere gebruikers handelen. Aspose.Email ondersteunt Exchange-imitatie. De EWSClient klasse biedt de methoden ImpersonateUser en ResetImpersonation om deze functie te vergemakkelijken.

Om deze taak uit te voeren:

  1. Initialiseer de ExchangeWebServiceClient voor gebruiker 1.
  2. Initialiseer de ExchangeWebServiceClient voor gebruiker 2.
  3. Testberichten aan de accounts toevoegen.
  4. Imitatie inschakelen.
  5. Imitatie resetten.

De volgende codefragment laat zien hoe je de EWSClient klasse om de imitatie‑functie te implementeren.

// 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) {
        }
    }
}

Auto‑discover functie gebruiken met EWS

Aspose.Email API stelt u in staat de Exchange Server-instellingen te ontdekken met de EWS-client. 

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

PST-herstel naar Exchange Server afbreken

Aspose.Email API stelt u in staat een PST‑bestand naar Exchange Server te herstellen. Als de bewerking lang duurt vanwege een groot PST‑bestand, kan het nodig zijn criteria op te geven om de bewerking af te breken. Dit kan worden bereikt met behulp van de API, zoals getoond in de volgende voorbeeldcode.

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