ทำงานกับกล่องเมล Exchange และข้อความ - อ่านอีเมลจากเซิร์ฟเวอร์ Exchange ด้วย Java
รับข้อมูลกล่องเมลโดยใช้ EWS
นี้ EWSClient คลาสมีสมาชิกที่สามารถใช้ดึงข้อมูลกล่องจดหมายจาก Exchange Server โดยเรียก IEWClient.getMailboxInfo() เมธอด คืนค่าอินสแตนซ์ของชนิด ExchangeMailboxInfo. รับข้อมูลกล่องจดหมายจากคุณสมบัติ เช่น MailboxUri, InboxUri และ DraftsUri. บทความนี้แสดงวิธีเข้าถึงข้อมูลกล่องเมลโดยใช้ Exchange Web Services.
หากคุณต้องการเชื่อมต่อกับ Exchange Server โดยใช้ Exchange Web Services (EWS) ให้ใช้ EWSClient class. คลาสนี้ใช้ EWS เชื่อมต่อและจัดการรายการบน Exchange Server โค้ด Java ต่อไปนี้แสดงวิธีรับข้อมูลกล่องเมลโดยใช้ Exchange Web Services.
// Create instance of EWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
// Get mailbox size, exchange mailbox info, Mailbox and Inbox folder URI
System.out.println("Mailbox size: " + client.getMailboxSize() + " bytes");
ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();
System.out.println("Mailbox URI: " + mailboxInfo.getMailboxUri());
System.out.println("Inbox folder URI: " + mailboxInfo.getInboxUri());
System.out.println("Sent Items URI: " + mailboxInfo.getSentItemsUri());
System.out.println("Drafts folder URI: " + mailboxInfo.getDraftsUri());
การส่งข้อความอีเมล
คุณสามารถส่งข้อความอีเมลโดยใช้ Exchange Server ด้วยความช่วยเหลือของเครื่องมือใน Aspose.Email.Exchange. เมธอด IEWSClient.Send() รับ MailMessage อินสแตนซ์เป็นพารามิเตอร์และส่งอีเมล บทความนี้อธิบายวิธีส่งข้อความอีเมลโดยใช้ Exchange Web Services.
Aspose.Email มีคลาส IEWSClient เพื่อเชื่อมต่อกับ Microsoft Exchange Server ด้วย Exchange Web Services โค้ดสคริปต์ต่อไปนี้แสดงวิธีใช้ EWS ส่งอีเมลด้วย Microsoft Exchange Server โค้ด Java ต่อไปนี้แสดงวิธีส่งข้อความอีเมลโดยใช้ EWS.
// Create instance of IEWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
// Create instance of type MailMessage
MailMessage msg = new MailMessage();
msg.setFrom(MailAddress.to_MailAddress("sender@domain.com"));
msg.setTo(MailAddressCollection.to_MailAddressCollection("recipient@ domain.com "));
msg.setSubject("Sending message from exchange server");
msg.setHtmlBody("<h3>sending message from exchange server</h3>");
// Send the message
client.send(msg);
รับคลาสของข้อความ
นี้ getMessageClass() เมธอดของ ExchangeMessageInfo class รับสตริงที่แสดงประเภทของข้อความ ตัวอย่างโค้ดด้านล่างแสดงวิธีรับคลาสของข้อความ:
try (IEWSClient client = EWSClient.getEWSClient(uri, credentials))
{
ExchangeMessageInfoCollection messageInfoCollection = client.listMessagesFromPublicFolder(publicFolder);
for (ExchangeMessageInfo messageInfo : messageInfoCollection)
{
System.out.println("Message Class: " + messageInfo.getMessageClass());
}
}
การอ่านอีเมลจากกล่องเมลของผู้ใช้อื่น
บัญชีบางบัญชีบนเซิร์ฟเวอร์ Exchange มีสิทธิ์เข้าถึงหลายกล่องเมล และผู้ใช้บางคนมีหลายบัญชีอีเมลบนเซิร์ฟเวอร์ Exchange เดียวกัน ในทั้งสองกรณี ผู้ใช้สามารถเข้าถึงกล่องเมลของผู้ใช้คนอื่นโดยใช้ Aspose.Email สำหรับ Java API นี้ให้กลไกสำหรับเข้าถึงโฟลเดอร์และอีเมลจากกล่องเมลอื่นโดยใช้ IEWSClient class. ความสามารถนี้สามารถทำได้โดยใช้เวอร์ชันโอเวอร์โหลดของ getMailboxInfo() เมธอดและให้ที่อยู่อีเมลของผู้ใช้เป็นพารามิเตอร์.
โค้ดสคริปต์ต่อไปนี้แสดงวิธีอ่านอีเมลโดยใช้ IEWSClient คลาส.
// Create instance of EWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
// Get Exchange mailbox info of other email account
ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo("otherUser@domain.com");
การแสดงรายการข้อความ
สามารถดึงรายการอีเมลในกล่องจดหมาย Exchange ได้โดยเรียก IEWClient.listMessages เมธอด ใช้เพื่อรับข้อมูลพื้นฐานของข้อความ เช่น หัวเรื่อง, ผู้ส่ง, ผู้รับ และ ID ของข้อความ โดยใช้ listMessages เมธอด.
รายการข้อความอย่างง่าย
เพื่อแสดงรายการข้อความในกล่องเมล Exchange:
- สร้างอินสแตนซ์ของ IEWSClient คลาส.
- เรียกเมธอด listMessages และสร้างคอลเลกชันของข้อความ.
- วนลูปผ่านคอลเลกชันและแสดงข้อมูลข้อความ
โค้ด Java ต่อไปนี้แสดงวิธีเชื่อมต่อกับเซิร์ฟเวอร์ Exchange ด้วย EWS และแสดงรายการข้อความจากโฟลเดอร์ Inbox.
// Create instance of ExchangeWebServiceClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "UserName", "Password");
// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());
// Loop through the collection to display the basic information
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgCollection) {
System.out.println("Subject: " + msgInfo.getSubject());
System.out.println("From: " + msgInfo.getFrom().toString());
System.out.println("To: " + msgInfo.getTo().toString());
System.out.println("Message ID: " + msgInfo.getMessageId());
System.out.println("Unique URI: " + msgInfo.getUniqueUri());
}
รายการข้อความจากหลายโฟลเดอร์
โค้ดสคริปต์ข้างต้น, แสดงรายการข้อความทั้งหมดในโฟลเดอร์ Inbox. สามารถรับรายการข้อความจากโฟลเดอร์อื่น ๆ ได้เช่นกัน. IEWClient.listMessages() เมธอดรับ URI ของโฟลเดอร์เป็นพารามิเตอร์ ตราบใดที่ URI ของโฟลเดอร์ถูกต้อง คุณสามารถรับรายการข้อความจากโฟลเดอร์นั้นได้ ใช้คุณสมบัติ IEWSClient.getMailboxInfo().getXXXFolderUri เพื่อรับ URI ของโฟลเดอร์ต่าง ๆ ส่วนที่เหลือของโค้ดเหมือนกับการรับรายการข้อความ โค้ดสคริปต์ต่อไปนี้แสดงวิธีรายการข้อความจากโฟลเดอร์ต่าง ๆ ด้วย EWS.
// Create instance of EWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
// Get folder URI
String strFolderURI = "";
strFolderURI = client.getMailboxInfo().getInboxUri();
strFolderURI = client.getMailboxInfo().getDeletedItemsUri();
strFolderURI = client.getMailboxInfo().getDraftsUri();
strFolderURI = client.getMailboxInfo().getSentItemsUri();
// Get list of messages from the specified folder
ExchangeMessageInfoCollection msgCollection = client.listMessages(strFolderURI);
รายการข้อความพร้อมการสนับสนุนการแบ่งหน้า
โค้ด Java ต่อไปนี้แสดงวิธีรับรายการข้อความพร้อมการสนับสนุนการแบ่งหน้า.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
final IEWSClient client = EWSClient.getEWSClient("exchange.domain.com", "username", "password");
try {
try {
// Create some test messages to be added to server for retrieval later
int messagesNum = 12;
int itemsPerPage = 5;
MailMessage message = null;
for (int i = 0; i < messagesNum; i++) {
message = new MailMessage("from@domain.com", "to@domain.com", "EMAILNET-35157_1 - " + UUID.randomUUID().toString(),
"EMAILNET-35157 Move paging parameters to separate class");
client.appendMessage(client.getMailboxInfo().getInboxUri(), message);
}
// Verfiy that the messages have been added to the server
ExchangeMessageInfoCollection totalMessageInfoCol = client.listMessages(client.getMailboxInfo().getInboxUri());
System.out.println(totalMessageInfoCol.size());
////////////////// RETREIVING THE MESSAGES USING PAGING SUPPORT ////////////////////////////////////
List<ExchangeMessagePageInfo> pages = new ArrayList<ExchangeMessagePageInfo>();
ExchangeMessagePageInfo pageInfo = client.listMessagesByPage(client.getMailboxInfo().getInboxUri(), itemsPerPage);
// Total Pages Count
System.out.println(pageInfo.getTotalCount());
pages.add(pageInfo);
while (!pageInfo.getLastPage()) {
pageInfo = client.listMessagesByPage(client.getMailboxInfo().getInboxUri(), itemsPerPage, pageInfo.getPageOffset() + 1);
pages.add(pageInfo);
}
int retrievedItems = 0;
// foreach to while statements conversion
for (ExchangeMessagePageInfo pageCol : pages) {
retrievedItems += pageCol.getItems().size();
}
// Verify total message count using paging
System.out.println(retrievedItems);
} finally {
}
} finally {
client.dispose();
}
รับข้อมูลประเภทข้อความจาก ExchangeMessageInfo
IEWSClient client = EWSClient.getEWSClient(mailboxUri, credentials);
ExchangeMessageInfoCollection list = client.listMessages(client.getMailboxInfo().getDeletedItemsUri());
System.out.println(list.get_Item(0).getMessageInfoType()); // MessageInfoType
การบันทึกข้อความ
บทความนี้แสดงวิธีรับข้อความจากกล่องเมล Exchange Server และบันทึกลงดิสก์ในรูปแบบ EML และ MSG:
- บันทึกเป็น EML ลงดิสก์.
- บันทึกไปยังสตรีมหน่วยความจำ.
- บันทึกเป็น MSG.
บันทึกข้อความเป็น EML
เพื่อดึงข้อความและบันทึกในรูปแบบ EML:
- สร้างอินสแตนซ์ของคลาส IEWSClient.
- ระบุ mailboxUri, ชื่อผู้ใช้, รหัสผ่านและโดเมน.
- เรียกเมธอด IEWSClient.listMessages() เพื่อรับอินสแตนซ์ของคอลเลกชัน ExchangeMessagesInfoCollection.
- วนลูปผ่านคอลเลกชัน ExchangeMessagesInfoCollection เพื่อรับ URI เฉพาะสำหรับแต่ละข้อความ.
- เรียกเมธอด IEWSClient.saveMessage() และส่ง URI ที่ไม่ซ้ำกันเป็นพารามิเตอร์.
- ให้เมธอด saveMessage() กับพาธที่คุณต้องการบันทึกไฟล์.
โค้ดสคริปต์ต่อไปนี้แสดงวิธีใช้ EWS เชื่อมต่อกับ Exchange Server และบันทึกข้อความเป็นไฟล์ EML.
// Create instance of IEWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());
// Loop through the collection to get Message URI
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgCollection) {
String strMessageURI = msgInfo.getUniqueUri();
// Now save the message in disk
client.saveMessage(strMessageURI, dataDir + msgInfo.getMessageId() + "out.eml");
}
บันทึกข้อความไปยังสตรีมหน่วยความจำ
แทนที่จะบันทึกไฟล์ EML ลงดิสก์ สามารถบันทึกลงสตรีมหน่วยความจำได้ ซึ่งเป็นประโยชน์เมื่อคุณต้องการบันทึกสตรีมไปยังที่เก็บข้อมูลเช่นฐานข้อมูล เมื่อสตรีมถูกบันทึกลงฐานข้อมูลแล้ว คุณสามารถโหลดไฟล์ EML กลับเข้าไปใน MailMessage class. โค้ดสคริปต์ต่อไปนี้แสดงวิธีบันทึกข้อความจากกล่องเมล Exchange Server ไปยังสตรีมหน่วยความจำโดยใช้ EWS.
// Create instance of EWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());
// Loop through the collection to get Message URI
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgCollection) {
String strMessageURI = msgInfo.getUniqueUri();
// Now save the message in memory stream
ByteArrayOutputStream stream = new ByteArrayOutputStream();
client.saveMessage(strMessageURI, stream);
}
บันทึกข้อความในรูปแบบ MSG
นี้ IEWSClient.saveMessage() เมธอดสามารถบันทึกข้อความเป็นรูปแบบ EML โดยตรง เพื่อบันทึกเป็นรูปแบบ MSG ก่อนอื่นให้เรียก IEWSClient.fetchMessage() เมธอดที่คืนอินสแตนซ์ของ MailMessage คลาส จากนั้นเรียก MailMessage.save() เมธอดเพื่อบันทึกข้อความเป็น MSG โค้ดสคริปต์ต่อไปนี้แสดงวิธีรับข้อความจากกล่องเมล Exchange Server และบันทึกเป็นรูปแบบ MSG โดยใช้ EWS.
// Create instance of EWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());
int count = 0;
// Loop through the collection to get Message URI
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgCollection) {
String strMessageURI = msgInfo.getUniqueUri();
// Now get the message details using FetchMessage() and Save message as Msg
MailMessage message = client.fetchMessage(strMessageURI);
message.save(dataDir + (count++) + "_out.msg", SaveOptions.getDefaultMsgUnicode());
}
รับ ExchangeMessageInfo จาก Message URI
ข้อความอีเมลถูกแทนด้วยตัวระบุที่ไม่ซ้ำกัน, URI, และเป็นส่วนสำคัญของ ExchangeMessageInfo อ็อบเจ็กต์. ในกรณีที่มีเฉพาะ URI ของข้อความเท่านั้น แล้ว ExchangeMessageInfo อ็อบเจ็กต์สามารถดึงได้โดยใช้ข้อมูลที่มีอยู่นี้ เวอร์ชันโอเวอร์โหลดของ listMessages รับรายการ Ids เพื่อใช้ ExchangeMessageInfoCollection. โค้ดสคริปต์ต่อไปนี้แสดงวิธีรับ ExchangeMessageInfo จาก URI ของข้อความ.
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "user@domain.com", "pwd", "domain");
List<String> ids = new ArrayList<String>();
List<MailMessage> messages = new ArrayList<MailMessage>();
for (int i = 0; i < 5; i++) {
MailMessage message = new MailMessage("user@domain.com", "receiver@domain.com", "EMAILNET-35033 - " + UUID.randomUUID().toString(),
"EMAILNET-35033 Messages saved from Sent Items folder doesn't contain 'To' field");
messages.add(message);
String uri = client.appendMessage(message);
ids.add(uri);
}
ExchangeMessageInfoCollection messageInfoCol = client.listMessages(ids);
for (ExchangeMessageInfo messageInfo : (Iterable<ExchangeMessageInfo>) messageInfoCol) {
// Do something ...
System.out.println(messageInfo.getUniqueUri());
}
ดึงข้อความจากกล่องจดหมาย Exchange Server
การแสดงรายการข้อความบน Exchange Server ใช้เมธอด listMessages() เมธอดเพื่อดึงรายการข้อความจากกล่องจดหมาย Exchange Server. เมธอด listMessages() เมธอดนี้รับข้อมูลพื้นฐานของข้อความ เช่น หัวข้อ, รหัสข้อความ, ผู้ส่งและผู้รับ เพื่อรับรายละเอียดของข้อความทั้งหมด Aspose.Email.Exchange มีเมธอด IEWSClient.fetchMessage() เมธอดนี้รับ URI ของข้อความเป็นพารามิเตอร์และคืนค่าอินสแตนซ์ของ MailMessage คลาส. เมธอด MailMessage class จากนั้นจะให้รายละเอียดของข้อความ เช่น เนื้อหา, ส่วนหัวและไฟล์แนบ ค้นหาข้อมูลเพิ่มเติมเกี่ยวกับ MailMessage API หรือค้นหาวิธีจัดการอีเมลด้วย MailMessage class. เพื่อดึงข้อความจากกล่องเมลของ Exchange Server:
- สร้างอินสแตนซ์ของประเภท IEWSClient.
- ระบุชื่อเซิร์ฟเวอร์, ชื่อผู้ใช้, รหัสผ่านและโดเมน.
- เรียก listMessages เพื่อรับ ExchangeMessageInfoCollection.
- วนลูปผ่านคอลเลกชัน ExchangeMessageInfoCollection เพื่อรับค่า ExchangeMessageInfo.UniqueURI.
- เรียก IEWSClient.fetchMessage() และส่ง ExchangeMessageInfo.UniqueURI เป็นพารามิเตอร์.
โค้ดสคริปต์ต่อไปนี้แสดงให้คุณเชื่อมต่อกับกล่องเมลของ Exchange Server และดึงข้อความทั้งหมดโดยใช้ EWS.
// Create instance of ExchangeWebServiceClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());
// Loop through the collection to get Message URI
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgCollection) {
String strMessageURI = msgInfo.getUniqueUri();
// Now get the message details using FetchMessage()
MailMessage msg = client.fetchMessage(strMessageURI);
for (Attachment att : (Iterable<Attachment>) msg.getAttachments()) {
System.out.println("Attachment Name: " + att.getName());
}
}
ใช้เมธอด FetchItem เพื่อดึงข้อความ
นี้ FetchItem เมธอดนี้เป็นที่แนะนำหากคุณต้องการดึง MapiMessage และทำงานกับคุณสมบัติของ MAPI คุณยังสามารถใช้เมธอดนี้เพื่อดึงข้อมูลรายการ Outlook ใด ๆ เช่น รายชื่อติดต่อ, นัดหมาย, งาน เป็นต้น
// Create instance of ExchangeWebServiceClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());
// Loop through the collection to get Message URI
for (ExchangeMessageInfo msgInfo : msgCollection)
{
// Now get the message using FetchItem()
MapiMessage msg = client.fetchItem(msgInfo.getUniqueUri());
// If necessary, you can cast the MapiMessage to the proper item type to simplify working with its properties.
MapiContact contact = (MapiContact) msg.toMapiMessageItem();
}
ดึงขนาดข้อความล่วงหน้า
Microsoft Outlook InterOp มีฟีเจอร์การดึงขนาดข้อความก่อนที่จะดึงข้อความเต็มจากเซิร์ฟเวอร์ ในกรณีของ Aspose.Email API ข้อมูลสรุปที่ดึงจาก Exchange server แสดงโดย ExchangeMessageInfo คลาส มันให้คุณลักษณะเดียวกันในการดึงขนาดข้อความโดยใช้คุณสมบัติ Size เพื่อดึงขนาดข้อความ จะใช้การเรียกมาตรฐานไปยัง listMessages ของ IEWSClient ซึ่งดึงคอลเลกชันของ ExchangeMessageInfo. โค้ดส่วนต่อไปนี้จะแสดงวิธีแสดงขนาดข้อความโดยใช้ ExchangeMessageInfo คลาส.
// Create instance of ExchangeWebServiceClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());
// Loop through the collection to display the basic information
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgCollection) {
System.out.println("Subject: " + msgInfo.getSubject());
System.out.println("From: " + msgInfo.getFrom().toString());
System.out.println("To: " + msgInfo.getTo().toString());
System.out.println("Message Size: " + msgInfo.getSize());
System.out.println("==================================");
}
ดาวน์โหลดข้อความอย่างทำซ้ำ
นี้ EWSClient’s listSubFolders() เมธอดนี้สามารถใช้เพื่อดึงข้อความจากโฟลเดอร์และโฟลเดอร์ย่อยจากกล่องข้อความของ Exchange Server อย่างทำซ้ำได้ ต้องใช้ Exchange Server 2007 หรือใหม่กว่า เนื่องจากใช้ EWS โค้ดส่วนต่อไปนี้จะแสดงวิธีดาวน์โหลดกล่องเมลทั้งหมด (โฟลเดอร์และโฟลเดอร์ย่อย) ของ Exchange Server โครงสร้างโฟลเดอร์จะถูกสร้างในเครื่องและดาวน์โหลดข้อความทั้งหมด
public static void run() {
try {
downloadAllMessages();
} catch (java.lang.RuntimeException ex) {
System.out.println(ex.getMessage());
}
}
private static void downloadAllMessages() {
try {
String rootFolder = domain + "-" + username;
new File(rootFolder).mkdirs();
String inboxFolder = rootFolder + "\\Inbox";
new File(inboxFolder).mkdirs();
System.out.println("Downloading all messages from Inbox....");
// Create instance of IEWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", username, password, domain);
ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();
System.out.println("Mailbox URI: " + mailboxInfo.getMailboxUri());
String rootUri = client.getMailboxInfo().getRootUri();
// List all the folders from Exchange server
ExchangeFolderInfoCollection folderInfoCollection = client.listSubFolders(rootUri);
for (ExchangeFolderInfo folderInfo : (Iterable<ExchangeFolderInfo>) folderInfoCollection) {
// Call the recursive method to read messages and get sub-folders
listMessagesInFolder(client, folderInfo, rootFolder);
}
System.out.println("All messages downloaded.");
} catch (java.lang.RuntimeException ex) {
System.out.println(ex.getMessage());
}
}
// Recursive method to get messages from folders and sub-folders
private static void listMessagesInFolder(IEWSClient client, ExchangeFolderInfo folderInfo, String rootFolder) {
// Create the folder in disk (same name as on IMAP server)
String currentFolder = rootFolder + "\\" + folderInfo.getDisplayName();
new File(currentFolder).mkdirs();
// List messages
ExchangeMessageInfoCollection msgInfoColl = client.listMessages(folderInfo.getUri());
System.out.println("Listing messages....");
int i = 0;
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgInfoColl) {
// Get subject and other properties of the message
System.out.println("Subject: " + msgInfo.getSubject());
// Get rid of characters like ? and :, which should not be included in a file name
String fileName = msgInfo.getSubject().replace("?", " ").replace(":", " ");
MailMessage msg = client.fetchMessage(msgInfo.getUniqueUri());
msg.save(dataDir + "\\" + fileName + "-" + i + ".msg");
i++;
}
System.out.println("============================\n");
try {
// If this folder has sub-folders, call this method recursively to get messages
ExchangeFolderInfoCollection folderInfoCollection = client.listSubFolders(folderInfo.getUri());
for (ExchangeFolderInfo subfolderInfo : (Iterable<ExchangeFolderInfo>) folderInfoCollection) {
listMessagesInFolder(client, subfolderInfo, currentFolder);
}
} catch (java.lang.RuntimeException e) {
}
}
ดาวน์โหลดข้อความจากโฟลเดอร์สาธารณะ
Microsoft Exchange Server อนุญาตให้ผู้ใช้สร้างโฟลเดอร์สาธารณะและโพสต์ข้อความในนั้น เพื่อทำผ่านแอปพลิเคชันของคุณ ให้ใช้ Aspose.Email’s EWSClient คลาสสำหรับเชื่อมต่อกับ Exchange Server และอ่านและดาวน์โหลดข้อความและโพสต์จากโฟลเดอร์สาธารณะ โค้ดส่วนต่อไปนี้จะแสดงวิธีอ่านโฟลเดอร์สาธารณะทั้งหมดและโฟลเดอร์ย่อย, และแสดงรายการและดาวน์โหลดข้อความใด ๆ ที่พบในโฟลเดอร์เหล่านี้ ตัวอย่างนี้ทำงานได้เฉพาะกับ Microsoft Exchange Server 2007 หรือใหม่กว่าเนื่องจากมีการสนับสนุน EWS เท่านั้น
public static void run() {
try {
readPublicFolders();
} catch (java.lang.RuntimeException ex) {
System.out.println(ex.getMessage());
}
}
private static void readPublicFolders() {
NetworkCredential credential = new NetworkCredential(username, password, domain);
IEWSClient client = EWSClient.getEWSClient(mailboxUri, credential);
ExchangeFolderInfoCollection folders = client.listPublicFolders();
for (ExchangeFolderInfo publicFolder : (Iterable<ExchangeFolderInfo>) folders) {
System.out.println("Name: " + publicFolder.getDisplayName());
System.out.println("Subfolders count: " + publicFolder.getChildFolderCount());
listMessagesFromSubFolder(publicFolder, client);
}
}
private static void listMessagesFromSubFolder(ExchangeFolderInfo publicFolder, IEWSClient client) {
System.out.println("Folder Name: " + publicFolder.getDisplayName());
ExchangeMessageInfoCollection msgInfoCollection = client.listMessagesFromPublicFolder(publicFolder);
for (ExchangeMessageInfo messageInfo : (Iterable<ExchangeMessageInfo>) msgInfoCollection) {
MailMessage msg = client.fetchMessage(messageInfo.getUniqueUri());
System.out.println(msg.getSubject());
msg.save(dataDir + msg.getSubject() + ".msg", SaveOptions.getDefaultMsgUnicode());
}
// Call this method recursively for any subfolders
if (publicFolder.getChildFolderCount() > 0) {
ExchangeFolderInfoCollection subfolders = client.listSubFolders(publicFolder);
for (ExchangeFolderInfo subfolder : (Iterable<ExchangeFolderInfo>) subfolders) {
listMessagesFromSubFolder(subfolder, client);
}
}
}
ย้ายข้อความ
คุณสามารถย้ายอีเมลจากโฟลเดอร์หนึ่งไปยังอีกโฟลเดอร์โดยใช้ IEWSClient คลาส ย้าย เมธอด รับพารามิเตอร์:
- URI ที่เป็นเอกลักษณ์ของข้อความที่ต้องการย้าย
- URI ที่เป็นเอกลักษณ์ของโฟลเดอร์ปลายทาง
ย้ายข้อความระหว่างโฟลเดอร์
โค้ดส่วนต่อไปนี้จะแสดงวิธีย้ายข้อความในกล่องเมลจากโฟลเดอร์ Inbox ไปยังโฟลเดอร์ชื่อ Processed. ในตัวอย่างนี้, แอปพลิเคชัน:
- อ่านข้อความจากโฟลเดอร์ Inbox
- ประมวลผลข้อความบางส่วนตามเกณฑ์ (ในตัวอย่างนี้เราค้นหาคำสำคัญในหัวข้อข้อความ)
- ย้ายข้อความที่ตรงตามเงื่อนไขที่กำหนดไปยังโฟลเดอร์ processed
// Create instance of IEWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();
// List all messages from Inbox folder
System.out.println("Listing all messages from Inbox....");
ExchangeMessageInfoCollection msgInfoColl = client.listMessages(mailboxInfo.getInboxUri());
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgInfoColl) {
// Move message to "Processed" folder, after processing certain messages based on some criteria
if (msgInfo.getSubject() != null && msgInfo.getSubject().toLowerCase().contains("process this message")) {
client.moveItem(mailboxInfo.getDeletedItemsUri(), msgInfo.getUniqueUri()); // EWS
System.out.println("Message moved...." + msgInfo.getSubject());
} else {
// Do something else
}
}
ลบข้อความ
คุณสามารถลบอีเมลจากโฟลเดอร์ได้โดยใช้ IEWSClient คลาส deleteItem เมธอดนี้รับ URI เฉพาะของข้อความเป็นพารามิเตอร์
โค้ดสคริปต์ต่อไปนี้แสดงวิธีลบข้อความจากโฟลเดอร์ Inbox เพื่อเป็นตัวอย่าง โค้ด:
- อ่านข้อความจากโฟลเดอร์ Inbox
- ประมวลผลข้อความตามเกณฑ์บางอย่าง (ในตัวอย่างนี้เราค้นหาคำสำคัญในหัวเรื่องของข้อความ)
- ลบข้อความ.
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();
// List all messages from Inbox folder
System.out.println("Listing all messages from Inbox....");
ExchangeMessageInfoCollection msgInfoColl = client.listMessages(mailboxInfo.getInboxUri());
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgInfoColl) {
// Delete message based on some criteria
if (msgInfo.getSubject() != null && msgInfo.getSubject().toLowerCase().contains("delete") == true) {
client.deleteItem(msgInfo.getUniqueUri(), DeletionOptions.getDeletePermanently()); // EWS
System.out.println("Message deleted...." + msgInfo.getSubject());
} else {
// Do something else
}
}
การคัดลอกข้อความ
Aspose.Email API อนุญาตให้คัดลอกข้อความจากโฟลเดอร์หนึ่งไปยังอีกโฟลเดอร์โดยใช้ copyItem เมธอด. เวอร์ชันที่โอเวอร์โหลดของเมธอดนี้จะคืนค่า URI ที่ไม่ซ้ำของข้อความที่คัดลอกตามที่แสดงในบทความนี้.
คัดลอกข้อความไปยังโฟลเดอร์อื่น
โค้ดสคริปต์ต่อไปนี้แสดงวิธีคัดลอกข้อความไปยังโฟลเดอร์อื่น.
try {
// Create instance of EWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
MailMessage message = new MailMessage("from@domain.com", "to@domain.com", "EMAILNET-34997 - " + UUID.randomUUID().toString(),
"EMAILNET-34997 Exchange: Copy a message and get reference to the new Copy item");
String messageUri = client.appendMessage(message);
String newMessageUri = client.copyItem(messageUri, client.getMailboxInfo().getDeletedItemsUri());
} catch (java.lang.RuntimeException ex) {
System.out.println(ex.getMessage());
}