IMAP 서버의 메시지 작업
서버에서 MIME 메시지 ID 나열
ImapMessageInfo MIME을 제공합니다 MessageId 전체 메시지를 추출하지 않고 메시지를 식별하기 위해 사용됩니다. 다음 코드 스니펫은 MIME messageId를 나열하는 방법을 보여줍니다.
// 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은 2개의 멤버를 오버로드한 변형을 제공합니다. 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 받아들입니다 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에 호스트 이름, 포트, 사용자 이름 및 비밀번호를 지정합니다 생성자.
- 다음으로 폴더를 선택합니다 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 시퀀스 번호 또는 고유 ID의 iterable을 받아 리스트를 반환하는 메서드. MailMessage. 다음 코드 스니펫은 ~의 사용을 보여줍니다. fetchMessages 시퀀스 번호와 고유 ID로 메시지를 가져오는 메서드.
// 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 프로토콜은 RFC-5256에 정의된 THREAD 기능을 지원할 수 있습니다. 또한 Gmail에서 제공하는 X-GM-EXT-1이라는 다른 IMAP 확장이 있습니다.
다음 이메일 스레딩 기능을 사용할 수 있습니다:
- 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() 메서드 - 메시지의 고유 ID를 가져옵니다.
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());
}