ميزات الأدوات المساعدة

إرسال رسالة مع خيار التصويت

يسمح Microsoft Outlook للمستخدمين بإنشاء استطلاع عند كتابة رسالة جديدة. يتم ذلك بإضافة خيارات تصويت مثل نعم، لا، ربما، إلخ. تقدم فئة FollowUpOptions التي يوفرها Aspose.Email خاصية 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;
}

إنشاء رسائل RE و FW من ملفات MSG

IEWSClient يتيح للمطورين إنشاء رسائل RE (رد/رد على الكل) و FW (إعادة توجيه) من رسالة مصدر. يتم تحديد رسالة المصدر عن طريق اختيار معينة 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());
}

دعم OAuth لـ EWS مع Office 365

توفر واجهة Aspose.Email دعمًا لخدمة ويب Exchange (EWS) مع Office 365. الـ API’s EWSClient الواجهة توفر طريقة محملة توفر الـ OAuthNetworkCredential كمدخل للوصول إلى حساب Exchange عبر OAuth. يحتاج المستخدم إلى توفير Authority، Client Id، Client App Uri، ومعلمات Resource لكي يعمل ذلك. يُظهر مقتطف الشيفرة التالي دعم OAuth لـ EWS مع 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();

دعم التسجيل في عملاء Exchange

توفر واجهة Aspose.Email القدرة على توفير مرافق التسجيل لعميل Exchange Web Service.

التسجيل لعميل EWS

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

إضافة رؤوس في طلبات EWS

تتيح واجهة Aspose.Email إضافة رؤوس إلى طلبات Exchange. يمكن استخدام ذلك لإضافة رؤوس إلى طلبات EWS لأغراض مختلفة. مثال على ذلك هو إضافة رأس X-AnchorMailbox الذي يُستخدم لإدارة مشكلات التقييد في خادم Exchange. تُستخدم طريقة addHeader في IEWSClient لإضافة رؤوس إلى طلبات 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();
}

إرجاع معرف طلب العميل في الرأس

الـ 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. تدعم الرسائل الموحدة حالياً الحصول على معلومات التكوين، بدء مكالمة صادرة، استرجاع معلومات المكالمة عبر معرف المكالمة، وإنهاء المكالمة عبر المعرف. تُظهر عينة الشيفرة التالية كيفية استرجاع معلومات تكوين الرسائل الموحدة من 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) نصيحة البريد أثناء كتابة الرسالة إذا كان أحد أو أكثر من المستلمين قد ضبط رد "خارج المكتب". يتطلب جميع الميزات الموضحة في هذا المقال حزمة الخدمة Service Pack 1 لإصدار Microsoft Exchange Server 2010. يُظهر لك مقتطف الشيفرة التالي كيفية استخدام EWSClient فئة تستخدم خدمات ويب Exchange، المتاحة في Microsoft Exchange Server 2007 والإصدارات اللاحقة.

// 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. تهيئة ExchangeWebServiceClient للمستخدم 1.
  2. تهيئة ExchangeWebServiceClient للمستخدم 2.
  3. إلحاق رسائل اختبار بالحسابات.
  4. تمكين الانتحال.
  5. إعادة تعيين الانتحال.

يوضح مقتطف الكود التالي كيفية استخدام EWSClient فئة لتنفيذ ميزة الانتحال.

// 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 اكتشاف إعدادات خادم Exchange باستخدام عميل EWS. 

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 إلى خادم Exchange

تتيح لك واجهة Aspose.Email استعادة ملف PST إلى خادم Exchange. ومع ذلك، إذا استغرقت العملية وقتًا طويلاً بسبب حجم ملف PST الكبير، قد تحتاج إلى تحديد معيار لإلغاء العملية. يمكن تحقيق ذلك باستخدام الواجهة كما هو موضح في عينة الشيفرة التالية.

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