Utility‑Funktionen

Senden einer Nachricht mit Abstimmungsoption

Microsoft Outlook ermöglicht es Benutzern, beim Verfassen einer neuen Nachricht eine Umfrage zu erstellen. Dies geschieht durch Einbeziehen von Abstimmungsoptionen wie Ja, Nein, Vielleicht usw. Die von Aspose.Email bereitgestellte Klasse FollowUpOptions bietet die Eigenschaft VotingButtons, mit der der Wert der Abstimmungsoptionen gesetzt oder abgerufen werden kann. Dieser Artikel liefert ein detailliertes Beispiel zur Erstellung einer MapiMessage mit Abstimmungsoptionen für eine Umfrage und zum Senden der Nachricht über den Exchange Web Service (EWS)‑Client.

Erstellen und Senden einer Nachricht mit Abstimmungsoptionen

Das folgende Code‑Snippet zeigt, wie Sie eine neue Nachricht erstellen und sie mit Abstimmungsoptionen senden.

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

Beispielmethoden aus Beispielen

Das folgende Code‑Snippet zeigt, wie die im obigen Beispiel verwendeten Methoden benutzt werden.

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

Erstellung von RE‑ und FW‑Nachrichten aus MSG‑Dateien

IEWSClient ermöglicht Entwicklern, RE (Reply/Reply All) und FW (Forward) Nachrichten aus einer Quellnachricht zu erstellen. Die Quellnachricht wird durch Auswahl einer bestimmten ExchangeMessageInfo von ExchangeMessageInfoCollection erhalten durch IEWSClient.listMessages(). Das andere Argument ist das eigentliche MailMessage um als RE‑ oder FW‑Nachricht gesendet zu werden. Das folgende Code‑Snippet zeigt, wie ein Beispielkonto erstellt wird, um eine Nachricht zu senden, und anschließend die Reply‑ und Forward‑Funktionen an dieser Beispielnachricht demonstriert werden. So führen Sie den Vorgang aus:

  1. Initialisieren Sie das IEWSClient‑Objekt, indem Sie gültige Anmeldeinformationen angeben.
  2. Einige Beispielnachrichten senden.
  3. Rufen Sie die Funktionen IEWSClient.reply(), IEWSClient.replyAll() und IEWSClient.forward() auf, um Nachrichten zu senden.
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‑Unterstützung für EWS mit Office 365

Die Aspose.Email‑API bietet Unterstützung für Exchange Web Service (EWS) mit Office 365. Die API‑ EWSClient Schnittstelle bietet überladene Methode, die die OAuthNetworkCredential Als Eingabe für den Zugriff auf das Exchange‑Konto via OAuth. Der Benutzer muss Authority, Client‑Id, Client‑App‑Uri und Resource‑Parameter angeben, damit es funktioniert. Das folgende Code‑Snippet zeigt OAuth‑Unterstützung für EWS mit 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();

Unterstützung für Protokollierung in Exchange‑Clients

Die Aspose.Email‑API bietet die Möglichkeit, eine Protokollierungsfunktion für den Exchange Web Service‑Client bereitzustellen.

Protokollierung für EWS‑Client

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

Header in EWS‑Anfragen hinzufügen

Die Aspose.Email‑API ermöglicht das Hinzufügen von Headern zu Exchange‑Anfragen. Dies kann verwendet werden, um unterschiedliche Header zu EWS‑Anfragen hinzuzufügen, die für verschiedene Zwecke genutzt werden können. Ein Beispiel ist das Hinzufügen des X‑AnchorMailbox‑Headers, der zur Verwaltung von Drosselungsproblemen auf dem Exchange‑Server verwendet wird. Die Methode addHeader des IEWSClient wird zum Hinzufügen von Headern zu den EWS‑Anfragen verwendet, wie im folgenden Code‑Snippet gezeigt.

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 im Header zurückgeben

Die return-client-request-id Header wird in der Anforderung gesendet und vom Server verwendet, um zu bestimmen, ob die client-request-id Der vom Client angegebene Header sollte in der Serverantwort zurückgegeben werden. Die folgenden Methoden werden in diesem Vorgang verwendet:

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

Arbeiten mit Unified Messaging

Aspose.Email kann vereinte Messaging‑Informationen von Exchange Server 2010 abrufen. Vereintes Messaging wie das Abrufen von Konfigurationsinformationen, das Initiieren eines ausgehenden Anrufs, das Abrufen von Anrufinformationen per Anruf‑ID und das Trennen eines Anrufs per ID wird derzeit unterstützt. Das folgende Code‑Beispiel zeigt, wie man die Konfigurationsinformationen für vereintes Messaging von Microsoft Exchange Server 2010 abruft.

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

Mail‑Tips abrufen

Microsoft Exchange Server hat mit den Versionen 2010 und 2013 mehrere neue Funktionen eingeführt. Eine davon ermöglicht es Benutzern, beim Verfassen einer E‑Mail Mail‑Tips zu erhalten. Diese Tipps sind sehr nützlich, da sie Informationen bereitstellen, bevor die E‑Mail gesendet wird. Zum Beispiel wird ein Hinweis angezeigt, wenn eine E‑Mail‑Adresse im Empfängerfeld ungültig ist. Mail‑Tips zeigen zudem Abwesenheitsantworten an, bevor die E‑Mail gesendet wird: Exchange Server (2010 & 2013) sendet den Mail‑Tip, während die E‑Mail geschrieben wird, falls einer oder mehrere Empfänger eine Abwesenheitsnachricht eingerichtet haben. Für alle im Artikel demonstrierten Funktionen ist Microsoft Exchange Server 2010 Service Pack 1 erforderlich. Das folgende Code‑Snippet zeigt, wie Sie die EWSClient Klasse, die Exchange Web Services verwendet und seit Microsoft Exchange Server 2007 und späteren Versionen verfügbar ist.

// 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‑Impersonation

Exchange‑Impersonation ermöglicht es, ein anderes Konto zu übernehmen und Aufgaben sowie Operationen mit den Berechtigungen des übernommenen Kontos auszuführen, anstatt mit den eigenen. Während Delegierung es Benutzern erlaubt, im Namen anderer zu handeln, erlaubt Impersonation das direkte Handeln als andere Benutzer. Aspose.Email unterstützt Exchange‑Impersonation. Die EWSClient Klasse stellt die Methoden ImpersonateUser und ResetImpersonation bereit, um diese Funktion zu erleichtern.

Um diese Aufgabe auszuführen:

  1. ExchangeWebServiceClient für Benutzer 1 initialisieren.
  2. ExchangeWebServiceClient für Benutzer 2 initialisieren.
  3. Testnachrichten an die Konten anhängen.
  4. Impersonation aktivieren.
  5. Impersonation zurücksetzen.

Das folgende Code‑Snippet zeigt, wie Sie die EWSClient Klasse zur Implementierung der Impersonations‑Funktion.

// 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‑Funktion mit EWS

Die Aspose.Email‑API ermöglicht es, über den EWS‑Client Einstellungen des Exchange‑Servers zu ermitteln. 

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‑Wiederherstellung auf Exchange‑Server abbrechen

Die Aspose.Email‑API ermöglicht das Wiederherstellen einer PST‑Datei auf einem Exchange‑Server. Wenn der Vorgang aufgrund einer großen PST‑Datei lange dauert, kann es notwendig sein, ein Kriterium zum Abbrechen des Vorgangs anzugeben. Dies kann mit der API erreicht werden, wie im folgenden Beispielcode gezeigt.

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