תכונות שימושיות
שליחת הודעה עם אפשרות הצבעה
Microsoft Outlook מאפשר למשתמשים ליצור סקר כאשר הם כותבים הודעה חדשה. זה נעשה על ידי הכללת אפשרויות הצבעה כגון כן, לא, אולי, וכד’. המחלקה FollowUpOptions שמוצעת על ידי Aspose.Email, מספקת את המאפיין VotingButtons שניתן להשתמש בו כדי להגדיר או לקבל את ערך אפשרויות ההצבעה. מאמר זה מספק דוגמה מפורטת ליצירת MapiMessage עם אפשרויות הצבעה ליצירת סקר ולאחר מכן שליחת ההודעה באמצעות Exchange Web Service (EWS) client.
יצירה ושליחת הודעה עם אפשרויות הצבעה
קטע הקוד הבא מציג כיצד ליצור הודעה חדשה ולאחר מכן לשלוח אותה עם אפשרויות הצבעה.
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 (Reply/Reply All) ו-FW (Forward) מהודעה מקורית. הודעה מקורית מזוהה על ידי בחירת ExchangeMessageInfo מתוך ExchangeMessageInfoCollection המתקבל מ-IEWSClient.listMessages(). הארגומנט השני הוא האמיתי MailMessage כדי להישלח כהודעת RE או FW. קטע הקוד הבא מציג כיצד ליצור חשבון לדוגמה המשמש לשליחת הודעה ולאחר מכן מציג את תכונות תגובה והעברה (Reply ו-Forward) על הודעה זו. לבצע זאת:
- אתחל את אובייקט IEWSClient על‑ידי אספקת אישורים תקינים.
- שלח כמה הודעות לדוגמה.
- קרא לפונקציות IEWSClient.reply(), IEWSClient.replyAll() ו-IESWClient.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 API מספקת תמיכה ב-Exchange Web Service (EWS) עם Office 365. ה-API’s EWSClient interface מספקת מתוד 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
Aspose.Email API מספקת את היכולת להציע מתקן תיעוד ללקוח Exchange Web Service.
תיעוד עבור לקוח EWS
client.setLogFileName("logs/ews");
// OR
EWSClient.setCommonLogFileName("logs/ews");
הוספת כותרות בבקשות EWS
Aspose.Email API מאפשרת הוספת כותרות לבקשות 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 הכותרת שהוגדרה על ידי הלקוח צריכה להיות מוחזרת בתשובת השרת. המתודות הבאות משמשות בפעולה זו:
- getReturnClientRequestId()
- setReturnClientRequestId(boolean value) - קבל או הגדר דגל שמציין האם הלקוח דורש שהשרת יחזיר את מזהה הבקשה.
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 יכולה לאחזר מידע על הודעות מאוחדות (Unified Messaging) מ-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) שולח את הטיפ בזמן כתיבת המייל אם אחד או יותר מהנמענים הגדרו תגובה מחוץ למשרד. נדרש Microsoft Exchange Server 2010 Service Pack 1 לכל התכונות המוצגות במאמר זה. קטע הקוד הבא מציג כיצד להשתמש ב- EWSClient class שמשתמשת ב-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 class מספקת את השיטות ImpersonateUser ו-ResetImpersonation לצורך הקלות השימוש בתכונה זו.
כדי לבצע משימה זו:
- אתחול ExchangeWebServiceClient עבור משתמש 1.
- אתחול ExchangeWebServiceClient עבור משתמש 2.
- הוספת הודעות בדיקה לחשבונות.
- הפעלת התחזות.
- איפוס התחזות.
קטעת הקוד הבא מראה לך כיצד להשתמש ב- EWSClient class למימוש תכונת ההתחזות.
// 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 מאפשרת לך לגלות את ההגדרות של שרת 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 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();
}