العمل مع رسائل من خادم IMAP
قائمة معرفات رسائل MIME من الخادم
ImapMessageInfo يوفر الـ MIME MessageId لتحديد الرسائل دون استخراج الرسالة كاملة. يوضح المقتطف البرمجي التالي كيفية سرد معرف MIME للرسالة.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
ImapClient client = new ImapClient();
client.setHost("domain.com");
client.setUsername("username");
client.setPassword("password");
try {
ImapMessageInfoCollection messageInfoCol = client.listMessages("Inbox");
for (ImapMessageInfo info : messageInfoCol) {
// Display MIME Message ID
System.out.println("Message Id = " + info.getMessageId());
}
} catch (java.lang.RuntimeException ex) {
System.out.println(ex.getMessage());
}
سرد الرسائل من الخادم
يوفر Aspose.Email نسخة محملة بمتغيرين من listMessages() لاسترجاع عدد محدد من الرسائل بناءً على استعلام. يوضح المقتطف البرمجي التالي كيفية سرد الرسائل.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Create an imapclient with host, user and password
ImapClient client = new ImapClient("localhost", "user", "password");
// Select the inbox folder and Get the message info collection
ImapQueryBuilder builder = new ImapQueryBuilder();
MailQuery query = builder
.or(builder.or(builder.or(builder.or(builder.getSubject().contains(" (1) "), builder.getSubject().contains(" (2) ")), builder.getSubject().contains(" (3) ")),
builder.getSubject().contains(" (4) ")), builder.getSubject().contains(" (5) "));
ImapMessageInfoCollection messageInfoCol4 = client.listMessages(query, 4);
System.out.println((messageInfoCol4.size() == 4) ? "Success" : "Failure");
سرد الرسائل من الخادم بصورة متكررة
يدعم بروتوكول IMAP سرد الرسائل بصورة متكررة من مجلد صندوق بريد. هذا يساعد في سرد الرسائل من المجلدات الفرعية كذلك. يوضح المقتطف البرمجي التالي كيفية سرد الرسائل بصورة متكررة.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Create an imapclient with host, user and password
ImapClient client = new ImapClient();
client.setHost("domain.com");
client.setUsername("username");
client.setPassword("password");
client.selectFolder("InBox");
ImapMessageInfoCollection msgsColl = client.listMessages(true);
System.out.println("Total Messages: " + msgsColl.size());
قائمة الرسائل باستخدام الاتصال المتعدد
ImapClient يوفر UseMultiConnection خاصية يمكن استخدامها لإنشاء اتصالات متعددة للعمليات الثقيلة. يمكنك أيضًا تحديد عدد الاتصالات التي ستُستخدم أثناء وضع متعدد الاتصالات باستخدام ImapClient.ConnectionsQuantity. يوضح المقتطف البرمجي التالي استعمال وضع الاتصال المتعدد لسرد الرسائل ويقارن أدائه مع وضع الاتصال الفردي.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
ImapClient imapClient = new ImapClient();
imapClient.setHost("<HOST>");
imapClient.setPort(993);
imapClient.setUsername("<USERNAME>");
imapClient.setPassword("<PASSWORD>");
imapClient.setSupportedEncryption(EncryptionProtocols.Tls);
imapClient.setSecurityOptions(SecurityOptions.SSLImplicit);
imapClient.selectFolder("Inbox");
imapClient.setConnectionsQuantity(5);
imapClient.setUseMultiConnection(MultiConnectionMode.Enable);
long multiConnectionModeStartTime = System.currentTimeMillis();
ImapMessageInfoCollection messageInfoCol1 = imapClient.listMessages(true);
long multiConnectionModeTimeSpan = System.currentTimeMillis() - multiConnectionModeStartTime;
imapClient.setUseMultiConnection(MultiConnectionMode.Disable);
long singleConnectionModeStartTime = System.currentTimeMillis();
ImapMessageInfoCollection messageInfoCol2 = imapClient.listMessages(true);
long singleConnectionModeTimeSpan = System.currentTimeMillis() - singleConnectionModeStartTime;
double performanceRelation = singleConnectionModeTimeSpan / multiConnectionModeTimeSpan;
System.out.println("Performance Relation: " + performanceRelation);
جلب الرسائل بترتيب تنازلي
يوفر Aspose.Email ImapClient.listMessagesByPage طريقة تقوم بسرد الرسائل بدعم الصفحات. بعض التحميلات الزائدة لـ ImapClient.listMessagesByPage accept PageSettings كمعامل. PageSettings يوفر AscendingSorting الخاصية التي عند ضبطها على false تُعيد الرسائل بترتيب تنازلي.
يُظهر مثال الشيفرة التالي كيفية استخدام AscendingSorting خاصية الـ PageSettings فئة لتغيير ترتيب الرسائل.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
ImapClient imapClient = new ImapClient();
imapClient.setHost("<HOST>");
imapClient.setPort(993);
imapClient.setUsername("<USERNAME>");
imapClient.setPassword("<PASSWORD>");
imapClient.setSupportedEncryption(EncryptionProtocols.Tls);
imapClient.setSecurityOptions(SecurityOptions.SSLImplicit);
PageSettings pageSettings = new PageSettings();
pageSettings.setAscendingSorting(false);
ImapPageInfo pageInfo = imapClient.listMessagesByPage(5, pageSettings);
ImapMessageInfoCollection messages = pageInfo.getItems();
for (ImapMessageInfo message : messages) {
System.out.println(message.getSubject() + " -> " + message.getDate().toString());
}
جلب الرسائل من الخادم وحفظها على القرص
الـ ImapClient الفئة يمكنها جلب الرسائل من خادم IMAP وحفظها بصيغة EML على قرص محلي. الخطوات التالية مطلوبة لحفظ الرسائل على القرص:
- إنشاء مثيل من الـ ImapClient فئة.
- حدد اسم المضيف، المنفذ، اسم المستخدم، وكلمة المرور في ImapClient constructor.
- اختر المجلد باستخدام selectFolder() طريقة.
- استدعِ الـ listMessages طريقة للحصول على الـ ImapMessageInfoCollection الكائن.
- التكرار عبر الـ ImapMessageInfoCollection مجموعة، استدعِ الـ saveMessage() طريقة وتزويد مسار الإخراج واسم الملف.
يُظهر مقتطف الشيفرة التالي كيفية جلب رسائل البريد الإلكتروني من خادم وحفظها.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Select the inbox folder and Get the message info collection
client.selectFolder(ImapFolderInfo.IN_BOX);
ImapMessageInfoCollection list = client.listMessages();
// Download each message
for (int i = 0; i < list.size(); i++) {
// Save the EML file locally
client.saveMessage(list.get_Item(i).getUniqueId(), dataDir + list.get_Item(i).getUniqueId() + ".eml");
}
حفظ الرسائل بتنسيق MSG
في المثال أعلاه, تُحفظ الرسائل بصيغة EML. لحفظ الرسائل بصيغة MSG، ImapClient.fetchMessage() يجب استدعاء الطريقة. تُعيد الرسالة ككائن من النوع MailMessage الفئة. الـ MailMessage.save() يمكن بعد ذلك استدعاء الطريقة لحفظ الرسالة بصيغة MSG. يوضح مقتطف الشيفرة التالي كيفية حفظ الرسائل بصيغة MSG.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the file directory.
String dataDir = "data/";
// Create an imapclient with host, user and password
ImapClient client = new ImapClient("localhost", "user", "password");
// Select the inbox folder and Get the message info collection
client.selectFolder(ImapFolderInfo.IN_BOX);
ImapMessageInfoCollection list = client.listMessages();
// Download each message
for (int i = 0; i < list.size(); i++) {
// Save the message in MSG format
MailMessage message = client.fetchMessage(list.get_Item(i).getUniqueId());
message.save(dataDir + list.get_Item(i).getUniqueId() + "_out.msg", SaveOptions.getDefaultMsgUnicode());
}
جلب رسائل مجموعة
ImapClient يوفر fetchMessages طريقة التي تقبل iterable من أرقام التسلسل أو المعرف الفريد وتُعيد قائمة بـ MailMessage. يوضح المقتطف البرمجي التالي كيفية استخدام الـ fetchMessages طريقة لجلب الرسائل حسب أرقام التسلسل والمعرف الفريد.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
ImapClient imapClient = new ImapClient();
imapClient.setHost("<HOST>");
imapClient.setPort(993);
imapClient.setUsername("<USERNAME>");
imapClient.setPassword("<PASSWORD>");
imapClient.setSupportedEncryption(EncryptionProtocols.Tls);
imapClient.setSecurityOptions(SecurityOptions.SSLImplicit);
ImapMessageInfoCollection messageInfoCol = imapClient.listMessages();
System.out.println("ListMessages Count: " + messageInfoCol.size());
List<Integer> sequenceNumberAr = new ArrayList<Integer>();
List<String> uniqueIdAr = new ArrayList<String>();
for (ImapMessageInfo mi : messageInfoCol) {
sequenceNumberAr.add(mi.getSequenceNumber());
uniqueIdAr.add(mi.getUniqueId());
}
for (MailMessage m : imapClient.fetchMessagesBySequences(sequenceNumberAr)) {
System.out.println("FetchMessages-sequenceNumberAr : " + m.getSubject());
}
for (MailMessage m : imapClient.fetchMessagesByUids(uniqueIdAr)) {
System.out.println("FetchMessages-uniqueIdAr : " + m.getSubject());
}
تسلسل البريد الإلكتروني/تنظيم الرسائل في محادثات
تمكن Aspose.Email من تجميع جميع رسائل التمرير، الرد، والرد على الجميع المتعلقة بنفس المحادثة معًا بطريقة هرمية. بصفة أساسية، قد يدعم بروتوكول IMAP قدرة THREAD المحددة في RFC-5256. بالإضافة إلى ذلك، هناك امتداد IMAP آخر توفره Gmail ويُسمى X-GM-EXT-1.
الميزات التالية لتسلسل البريد الإلكتروني متاحة للاستخدام:
- getMessageThreads طريقة - تستقبل سلاسل الرسائل عن طريق ImapClient.
- boolean getGmExt1Supported - يحصل على معلومات ما إذا كان امتداد Gmail X-GM-EXT-1 مدعومًا.
- boolean getThreadSupported - يحصل على معلومات ما إذا كان امتداد THREAD مدعومًا.
- String[] getThreadAlgorithms - يحصل على خوارزميات THREAD المدعومة.
تُظهر نماذج الشيفرة التالية كيفية استخدام هذه الميزات للحصول على سلاسل البريد الإلكتروني من Gmail:
ImapClient client = new ImapClient("imap.gmail.com", 993, "username", "password", SecurityOptions.SSLImplicit);
try {
client.selectFolder(ImapFolderInfo.IN_BOX);
// get a list of messages that we'll group by conversation
ImapMessageInfoCollection messages = client.listMessages();
// make sure the IMAP server supports X-GM-EXT-1 extension
if (client.getGmExt1Supported()) {
// gets unique conversationId for our example
Set<String> conversationIds = new HashSet<String>();
for (ImapMessageInfo messageInfo : messages) {
if (messageInfo.getConversationId() != null)
conversationIds.add(messageInfo.getConversationId());
}
for (String conversationId : conversationIds) {
// create the necessary search conditions for a thread
XGMThreadSearchConditions conditions = new XGMThreadSearchConditions();
conditions.setConversationId(conversationId);
conditions.setUseUId(true);
// get results
List<MessageThreadResult> conversation = client.getMessageThreads(conditions);
// print the email conversation in hierarchically manner
printConversaton("", conversation, messages);
System.out.println("--------------------");
}
}
} finally {
client.dispose();
}
/**
* <p>
* Prints the email conversation in hierarchically manner
* </p>
*/
public static void printConversaton(String indent, Iterable<MessageThreadResult> conversation,
Iterable<ImapMessageInfo> messages) {
for (MessageThreadResult thread : conversation) {
for (ImapMessageInfo messageInfo : messages) {
if (thread.getUniqueId().equals(messageInfo.getUniqueId())) {
System.out.println(indent + " (" + thread.getUniqueId() + ") " + messageInfo.getSubject());
break;
}
}
if (thread.getChildMessages().size() != 0) {
printConversaton(indent += "-", thread.getChildMessages(), messages);
}
}
}
تتغير الشيفرة قليلًا إذا كان خادم IMAP يدعم قدرة THREAD:
تحقق مما إذا كان خادم IMAP يدعم امتداد THREAD:
if (client.getThreadSupported())
إنشاء شروط البحث المناسبة لسلسلة المناقشة:
ThreadSearchConditions conditions = new ThreadSearchConditions();
conditions.setAlgorithm(client.getThreadAlgorithms()[0]);
conditions.setUseUId(true);
قائمة الرسائل مع دعم التجزئة
في السيناريوهات التي يحتوي فيها خادم البريد على عدد كبير من الرسائل في صندوق البريد، غالبًا ما يُرغب في سرد أو جلب الرسائل بدعم الصفحات. Aspose.Email API ImapClient يسمح لك بجلب الرسائل من الخادم مع دعم الصفحات.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// This example shows the paging support of ImapClient for listing messages from the server
// Available in Aspose.Email for Java and onwards
final ImapClient client = new ImapClient("host.domain.com", 993, "username", "password");
try {
try {
int messagesNum = 12;
int itemsPerPage = 5;
MailMessage message = null;
// Create some test messages and append these to server's inbox
for (int i = 0; i < messagesNum; i++) {
message = new MailMessage("from@domain.com", "to@domain.com", "EMAILNET-35157 - " + UUID.randomUUID(),
"EMAILNET-35157 Move paging parameters to separate class");
client.appendMessage(ImapFolderInfo.IN_BOX, message);
}
// List messages from inbox
client.selectFolder(ImapFolderInfo.IN_BOX);
ImapMessageInfoCollection totalMessageInfoCol = client.listMessages();
// Verify the number of messages added
System.out.println(totalMessageInfoCol.size());
////////////////// RETREIVE THE MESSAGES USING PAGING SUPPORT////////////////////////////////////
List<ImapPageInfo> pages = new ArrayList<ImapPageInfo>();
PageSettings pageSettings = new PageSettings();
ImapPageInfo pageInfo = client.listMessagesByPage(itemsPerPage, 0, pageSettings);
System.out.println(pageInfo.getTotalCount());
pages.add(pageInfo);
while (!pageInfo.getLastPage()) {
pageInfo = client.listMessagesByPage(itemsPerPage, pageInfo.getNextPage().getPageOffset(), pageSettings);
pages.add(pageInfo);
}
int retrievedItems = 0;
// foreach to while statements conversion
for (ImapPageInfo folderCol : pages) {
retrievedItems += folderCol.getItems().size();
}
System.out.println(retrievedItems);
} finally {
}
} finally {
if (client != null)
client.dispose();
}
الحصول على المجلدات وقراءة الرسائل بشكل متكرر
في هذه المقالة، معظم ImapClient تُستخدم الميزات لإنشاء تطبيق يقوم بقائمة جميع المجلدات والمجلدات الفرعية بشكل متكرر من خادم IMAP. كما أنه يحفظ الرسائل في كل مجلد ومجلد فرعي بصيغة MSG على قرص محلي. على القرص، يتم إنشاء المجلدات والرسائل وحفظها بنفس الهيكل الهرمي كما في خادم IMAP. يظهر مقتطف الشيفرة التالي كيفية جلب الرسائل ومعلومات المجلدات الفرعية بشكل متكرر.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
public static void run() throws Exception {
// Create an instance of the ImapClient class
ImapClient client = new ImapClient();
// Specify host, username, password, Port and SecurityOptions for your client
client.setHost("imap.gmail.com");
client.setUsername("your.username@gmail.com");
client.setPassword("your.password");
client.setPort(993);
client.setSecurityOptions(SecurityOptions.Auto);
try {
// The root folder (which will be created on disk) consists of host and username
String rootFolder = client.getHost() + "-" + client.getUsername();
// Create the root folder and List all the folders from IMAP server
new File(rootFolder).mkdirs();
ImapFolderInfoCollection folderInfoCollection = client.listFolders();
for (ImapFolderInfo folderInfo : folderInfoCollection) {
// Call the recursive method to read messages and get sub-folders
listMessagesInFolder(folderInfo, rootFolder, client);
}
// Disconnect to the remote IMAP server
client.dispose();
} catch (java.lang.RuntimeException ex) {
System.out.println(ex);
}
System.out.println("Downloaded messages recursively from IMAP server.");
}
/// Recursive method to get messages from folders and sub-folders
private static void listMessagesInFolder(ImapFolderInfo folderInfo, String rootFolder, ImapClient client) {
// Create the folder in disk (same name as on IMAP server)
String currentFolder = "data/";
new File(currentFolder).mkdirs();
// Read the messages from the current folder, if it is selectable
if (folderInfo.getSelectable()) {
// Send status command to get folder info
ImapFolderInfo folderInfoStatus = client.getFolderInfo(folderInfo.getName());
System.out.println(folderInfoStatus.getName() + " folder selected. New messages: " + folderInfoStatus.getNewMessageCount() + ", Total messages: "
+ folderInfoStatus.getTotalMessageCount());
// Select the current folder and List messages
client.selectFolder(folderInfo.getName());
ImapMessageInfoCollection msgInfoColl = client.listMessages();
System.out.println("Listing messages....");
for (ImapMessageInfo msgInfo : msgInfoColl) {
// Get subject and other properties of the message
System.out.println("Subject: " + msgInfo.getSubject());
System.out.println("Read: " + msgInfo.isRead() + ", Recent: " + msgInfo.getRecent() + ", Answered: " + msgInfo.getAnswered());
// Get rid of characters like ? and :, which should not be included in a file name and Save the message in MSG format
String fileName = msgInfo.getSubject().replace(":", " ").replace("?", " ");
MailMessage msg = client.fetchMessage(msgInfo.getSequenceNumber());
msg.save(currentFolder + "\\" + fileName + "-" + msgInfo.getSequenceNumber() + ".msg", SaveOptions.getDefaultMsgUnicode());
}
System.out.println("============================\n");
} else {
System.out.println(folderInfo.getName() + " is not selectable.");
}
try {
// If this folder has sub-folders, call this method recursively to get messages
ImapFolderInfoCollection folderInfoCollection = client.listFolders(folderInfo.getName());
for (ImapFolderInfo subfolderInfo : folderInfoCollection) {
listMessagesInFolder(subfolderInfo, rootFolder, client);
}
} catch (java.lang.RuntimeException e) {
}
}
الحصول على UID الرسالة أو رقم التسلسل
توفر Aspose.Email API العامة الميزات التالية للحصول على معلومات تعريف الرسالة مثل UID أو رقم التسلسل، والتي قد تكون مطلوبة عند معالجة الرسائل المستلمة من الخادم:
MailboxInfo فئة - تمثل معلومات تعريفية عن رسالة في صندوق البريد.
- getSequenceNumber() طريقة - تحصل على رقم التسلسل للرسالة.
- getUniqueId() طريقة - تحصل على المعرف الفريد للرسالة.
MailMessage فئة - تمثل رسالة بريد إلكتروني وتسمح بالوصول إلى خصائص الرسالة، مثل: الموضوع، المحتوى، المرسل وعناوين المستلمين، إلخ.
- getItemId طريقة - تمثل معلومات التعريف حول رسالة في صندوق بريد.
يُظهر مثال الشيفرة أدناه كيفية جلب وعرض تفاصيل الرسائل من مجلد "INBOX" على خادم IMAP باستخدام ImapClient فئة:
try (ImapClient client = new ImapClient(imapHost, port, emailAddress, password, securityOption)) {
ImapMessageInfoCollection msgs = client.listMessages("INBOX");
List<Integer> seqIds = new ArrayList<>();
for (ImapMessageInfo msg : msgs) {
seqIds.add(msg.getSequenceNumber());
}
Iterable<MailMessage> msgsViaFetch = client.fetchMessagesBySequences(seqIds);
for (MailMessage thisMsg : msgsViaFetch) {
System.out.println("Message ID: " + thisMsg.getItemId().getUniqueId()
+ " SequenceNumber: " + thisMsg.getItemId().getSequenceNumber()
+ " Subject: " + thisMsg.getSubject());
}
}
استرجاع المعلمات الإضافية كمعلومات ملخصة
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
final ImapClient client = new ImapClient("host.domain.com", "username", "password");
try {
MailMessage message = new MailMessage("from@domain.com", "to@doman.com", "EMAILNET-38466 - " + UUID.randomUUID().toString(),
"EMAILNET-38466 Add extra parameters for UID FETCH command");
// append the message to the server
String uid = client.appendMessage(message);
// wait for the message to be appended
Thread.sleep(5000);
// Define properties to be fetched from server along with the message
List<String> messageExtraFields = Arrays.asList("X-GM-MSGID", "X-GM-THRID");
// retreive the message summary information using it's UID
ImapMessageInfo messageInfoUID = client.listMessage(uid, messageExtraFields);
// retreive the message summary information using it's sequence number
ImapMessageInfo messageInfoSeqNum = client.listMessage(1, messageExtraFields);
// List messages in general from the server based on the defined properties
ImapMessageInfoCollection messageInfoCol = client.listMessages(messageExtraFields);
ImapMessageInfo messageInfoFromList = messageInfoCol.get_Item(0);
// verify that the parameters are fetched in the summary information
for (String paramName : messageExtraFields) {
System.out.println(messageInfoFromList.getExtraParameters().containsKey(paramName));
System.out.println(messageInfoUID.getExtraParameters().containsKey(paramName));
System.out.println(messageInfoSeqNum.getExtraParameters().containsKey(paramName));
}
} finally {
if (client != null)
client.dispose();
}
الحصول على معلومات رأس List-Unsubscribe
رأس List-Unsubscribe يحتوي على عنوان URL لإلغاء الاشتراك من القوائم البريدية مثل الإعلانات والنشرات الإخبارية، إلخ. للحصول على رأس List-Unsubscribe، استخدم listUnsubscribe خاصية الـ ImapMessageInfo فئة. يُظهر المثال التالي استخدام listUnsubscribe خاصية للحصول على رأس List-Unsubscribe.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
ImapClient imapClient = new ImapClient();
imapClient.setHost("<HOST>");
imapClient.setPort(993);
imapClient.setUsername("<USERNAME>");
imapClient.setPassword("<PASSWORD>");
imapClient.setSupportedEncryption(EncryptionProtocols.Tls);
imapClient.setSecurityOptions(SecurityOptions.SSLImplicit);
ImapMessageInfoCollection messageInfoCol = imapClient.listMessages();
for (ImapMessageInfo imapMessageInfo : messageInfoCol) {
System.out.println("ListUnsubscribe Header: " + imapMessageInfo.getListUnsubscribe());
}