IMAP Sunucusundan Mesajlarla Çalışma
Sunucudan MIME Mesaj Kimliklerini Listeleme
ImapMessageInfo MIME’i sağlar MessageId tam mesajı çıkarmadan mesaj tanımlaması için. Aşağıdaki kod parçacığı, MIME messageId’yi nasıl listeleyeceğinizi gösterir.
// 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());
}
Sunucudan Mesajları Listeleme
Aspose.Email, 2 üyeli aşırı yüklenmiş bir varyant sağlar listMessages() bir sorguya dayalı belirli sayıda mesaj almak için. Aşağıdaki kod parçacığı, mesajları nasıl listeleyeceğinizi gösterir.
// 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");
Sunucudan Mesajları Özyinelemeli Olarak Listeleme
IMAP protokolü, bir posta kutusu klasöründen mesajları özyinelemeli olarak listelemeyi destekler. Bu, bir klasörün alt klasörlerinden de mesajları listelemeye yardımcı olur. Aşağıdaki kod parçacığı, mesajları özyinelemeli olarak nasıl listeleyeceğinizi gösterir.
// 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());
Çoklu Bağlantı ile Mesajları Listeleme
ImapClient sağlar UseMultiConnection ağır işlemler için birden fazla bağlantı oluşturmak amacıyla kullanılabilen özellik. Çoklu bağlantı modunda kullanılacak bağlantı sayısını şu şekilde ayarlayabilirsiniz: ImapClient.ConnectionsQuantityAşağıdaki kod parçacığı, mesajları listelemek için çoklu bağlantı modunun kullanımını gösterir ve tek bağlantı modu ile performansını karşılaştırır.
// 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);
Mesajları azalan sırada al
Aspose.Email sağlar ImapClient.listMessagesByPage metot, mesajları sayfalama desteğiyle listeler. Bazı aşırı yüklemeleri ImapClient.listMessagesByPage kabul eder PageSettings parametre olarak. PageSettings sağlar bir AscendingSorting özellik, false olarak ayarlandığında e-postaları azalan sırada döndürür.
Aşağıdaki örnek kod, kullanımını gösterir AscendingSorting özellik PageSettings sınıf, e-postaların sırasını değiştirmek için.
// 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());
}
Sunucudan Mesajları Al ve Diske Kaydet
Bu ImapClient sınıf, bir IMAP sunucusundan mesajları alabilir ve mesajları yerel diske EML formatında kaydedebilir. Mesajları diske kaydetmek için aşağıdaki adımlar gerekir:
- Şunun bir örneğini oluştur ImapClient sınıf.
- ImapClient içinde bir ana bilgisayar adı, bağlantı noktası, kullanıcı adı ve şifre belirleyin yapıcı.
- Klasörü şu şekilde seçin selectFolder() metod.
- Şuğu çağırın listMessages yöntem, … alır ImapMessageInfoCollection nesne.
- İçinde döngü yap ImapMessageInfoCollection koleksiyon, şunu çağırın saveMessage() metodu ve çıktı yolu ile dosya adını sağlayın.
Aşağıdaki kod parçacığı, bir sunucudan e-posta mesajlarını nasıl alıp kaydedeceğinizi gösterir.
// 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");
}
Mesajları MSG Formatında Kaydetme
Yukarıdaki örnekte, e-postalar EML formatında kaydedilir. E-postaları MSG formatında kaydetmek için, ImapClient.fetchMessage() metodun çağrılması gerekir. Mesajı şu nesnenin bir örneği olarak döndürür MailMessage sınıf. MailMessage.save() metot, mesajı MSG formatında kaydetmek için ardından çağrılabilir. Aşağıdaki kod parçacığı, mesajları MSG formatında nasıl kaydedeceğinizi gösterir.
// 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());
}
Gruplu Mesaj Çekme
ImapClient sağlar fetchMessages metod, Sıra Numaraları ya da Benzersiz ID’nin iterable’ını kabul eder ve bir liste döndürür MailMessage. Aşağıdaki kod snippet’i, şunun kullanımını gösterir: fetchMessages metod, mesajları Sıra Numaraları ve Benzersiz ID ile çekmek için.
// 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());
}
E-posta Konularını (Thread) Düzenleme / E-postaları Konuşmalara Organize Etme
Aspose.Email, aynı konuşmayla ilgili tüm yönlendirmeleri, yanıtları ve tümüne yanıt mesajlarını hiyerarşik bir şekilde gruplayabilmeyi mümkün kılar. Temelde, IMAP protokolü RFC-5256’da tanımlanan THREAD yeteneğini destekleyebilir. Ayrıca, Gmail tarafından sağlanan ve X-GM-EXT-1 olarak tanımlanan başka bir IMAP uzantısı da vardır.
Aşağıdaki e-posta konu (thread) özellikleri kullanılabilir:
- getMessageThreads metot - Mesaj konularını alır ImapClient.
- boolean getGmExt1Supported - Gmail X-GM-EXT-1 uzantısının desteklenip desteklenmediği bilgisini alır.
- boolean getThreadSupported - THREAD uzantısının desteklenip desteklenmediği bilgisini alır.
- String[] getThreadAlgorithms - Desteklenen THREAD algoritmalarını alır.
Aşağıdaki kod örnekleri, bu özelliklerin Gmail’den e-posta konularını (thread) almak için nasıl kullanılacağını gösterir:
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);
}
}
}
Kod, IMAP sunucusu THREAD yeteneğini destekliyorsa biraz değişir:
IMAP sunucusunun THREAD uzantısını destekleyip desteklemediğini kontrol edin:
if (client.getThreadSupported())
Bir konu (thread) için uygun arama koşullarını oluşturun:
ThreadSearchConditions conditions = new ThreadSearchConditions();
conditions.setAlgorithm(client.getThreadAlgorithms()[0]);
conditions.setUseUId(true);
Sayfalama Desteğiyle Mesaj Listeleme
E-posta sunucusundaki posta kutusunda çok sayıda mesaj bulunduğunda, mesajları sayfalama desteğiyle listelemek veya almak genellikle istenir. Aspose.Email API ImapClient sayfalama desteğiyle sunucudan mesajları almanıza olanak tanır.
// 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();
}
Klasörleri Almak ve Mesajları Tekrarlı Olarak Okumak
Bu makalede, çoğu ImapClient özellikler, bir IMAP sunucusundan tüm klasör ve alt klasörleri tekrarlı (recursive) olarak listeleyen bir uygulama oluşturmak için kullanılır. Ayrıca, her klasör ve alt klasördeki mesajları yerel diskte MSG formatında kaydeder. Diskte, klasörler ve mesajlar IMAP sunucusundaki aynı hiyerarşik yapıda oluşturulur ve kaydedilir. Aşağıdaki kod parçacığı, mesajları ve alt klasör bilgilerini tekrarlı olarak nasıl alacağınızı gösterir.
// 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) {
}
}
Mesaj UID’si veya Sıra Numarasını Al
Aspose.Email genel API’si, sunucudan alınan mesajları işlerken gerekebilecek UID veya sıra numarası gibi mesaj kimlik bilgilerini almayı sağlayan aşağıdaki özellikleri sunar:
MailboxInfo sınıf - Bir posta kutusundaki mesaj hakkında kimlik bilgilerini temsil eder.
- getSequenceNumber() metot - Bir mesajın sıra numarasını alır.
- getUniqueId() metot - Bir mesajın benzersiz kimliğini alır.
MailMessage sınıf - Bir e-posta mesajını temsil eder ve konu, gövde, gönderici ve alıcı adresleri gibi mesaj özelliklerine erişim sağlar.
- getItemId metot - Bir posta kutusundaki mesajın kimlik bilgilerini temsil eder.
Aşağıdaki kod örneği, bir IMAP sunucusundaki "INBOX" klasöründen mesajların ayrıntılarını alıp görüntülemenin nasıl yapılacağını gösterir ImapClient sınıf:
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());
}
}
Ek Parametreleri Özet Bilgi Olarak Getirme
// 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 Başlık Bilgilerini Alma
List-Unsubscribe başlığı, e-posta listelerinden (örneğin reklamlar, bültenler vb.) çıkmak için URL içerir. List-Unsubscribe başlığını almak için, kullanın listUnsubscribe özellik ImapMessageInfo sınıf. Aşağıdaki örnek, kullanımını gösterir listUnsubscribe List-Unsubscribe başlığını almayı sağlayan özellik.
// 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());
}