امکانات ابزار

ارسال پیام با گزینه رأی‌گیری

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 ارسال می‌شود. قطعه کد زیر نشان می‌دهد چگونه یک حساب نمونه ایجاد شود که برای ارسال پیام استفاده می‌شود و سپس ویژگی‌های پاسخ (Reply) و انتقال (Forward) پیام نسبت به آن پیام نمونه نشان داده می‌شود. برای انجام این کار:

  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

API Aspose.Email پشتیبانی از Exchange Web Service (EWS) با Office 365 را فراهم می‌کند. EWSClient رابط متدی overload ارائه می‌دهد که 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

API Aspose.Email امکان فراهم کردن قابلیت ثبت لاگ برای کلاینت Exchange Web Service را فراهم می‌کند.

ثبت لاگ برای کلاینت EWS

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

افزودن سرآیندها به درخواست‌های EWS

API Aspose.Email امکان افزودن سرآیندها به درخواست‌های Exchange را فراهم می‌کند. این می‌تواند برای افزودن سرآیندهای مختلف به درخواست‌های EWS برای مقاصد متفاوت استفاده شود. یکی از مثال‌ها افزودن سرآیند X-AnchorMailbox است که برای مدیریت مسائل محدودیت (throttling) در سرور 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 چند قابلیت جدید افزود. یکی از این قابلیت‌ها به کاربران اجازه می‌دهد هنگام نوشتن ایمیل نکات ایمیلی (mail tips) دریافت کنند. این نکات بسیار مفید هستند زیرا پیش از ارسال ایمیل اطلاعاتی را ارائه می‌دهند. برای مثال، اگر آدرس ایمیل در فهرست گیرندگان اشتباه باشد، یک نکته نشان داده می‌شود تا شما بدانید آدرس ایمیل نامعتبر است. نکات ایمیلی همچنین به شما امکان می‌دهند پاسخ‌های خارج از دفتر را قبل از ارسال ایمیل ببینید: Exchange Server (2010 و 2013) هنگام نوشتن ایمیل اگر یک یا چند گیرنده پاسخ خارج از دفتر تنظیم کرده باشند، نکته ایمیلی ارسال می‌کند. برای تمام قابلیت‌های نشان داده شده در این مقاله نیاز به Microsoft Exchange Server 2010 Service Pack 1 است. قطعه کد زیر نشان می‌دهد چگونه از EWSClient کلاسی که از Exchange Web Services استفاده می‌کند، موجود در 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 برای کاربر ۱.
  2. راه‌اندازی ExchangeWebServiceClient برای کاربر ۲.
  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

API 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

API Aspose.Email به شما امکان بازیابی یک فایل 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();
}