Java 기반 독립 실행 형 프로그램 (JavaMail API v1.4.4 사용)을 작성하여 POP3 서버에서 이메일 메시지를 읽었습니다.'mail.pop3.filecache.enabled'가 true 일 때 스트림 닫힌 예외가 발생합니다.
props.put("mail.pop3.filecache.enable", "true");
을 지속적으로, 나는 특정 이메일 메시지를 message.getContent()
방법에서 다음 런타임 Stream Closed
예외를 받고 있어요 :
mail.pop3.filecache.enable
을 설정 0
예외 stracktrace : ReadPop3Email.java의
java.lang.RuntimeException: Stream closed
at javax.mail.util.SharedFileInputStream.newStream(SharedFileInputStream.java:507)
at com.sun.mail.pop3.POP3Message.getContentStream(POP3Message.java:242)
at javax.mail.internet.MimePartDataSource.getInputStream(MimePartDataSource.java:98)
at com.sun.mail.handlers.text_plain.getContent(text_plain.java:107)
at javax.activation.DataSourceDataContentHandler.getContent(DataHandler.java:774)
at javax.activation.DataHandler.getContent(DataHandler.java:521)
at javax.mail.internet.MimeMessage.getContent(MimeMessage.java:1419)
at ReadPop3Email.readPOP3Account(ReadPop3Email.java:290)
at ReadPop3Email.main(ReadPop3Email.java:73)
라인 no.290는 다음과 같다 : 내가 설정 한 경우,
Object object = message.getContent();
그러나 mail.pop3.filecache.enable
-거짓, I 돈 어떤 예외도 보이지 않습니다. 그러나, mail.pop3.filecache.enable
에서 까지의 속성을 사용하기를 원합니다. JavaMail 문서에 따라 메시지 데이터를 메모리가 아닌 임시 파일에 캐시하기 때문입니다.
filecache
을 사용하는 이유는 무엇입니까? 무슨 일있어? 어떤 도움이나 제안도 높이 평가됩니다. 이 문제가 발생하면 JDK1.6을 사용하고 있습니다.
편집 : 원본 소스 코드를 공유/게시 할 수 없지만 원래 원본 코드의 수정 된 버전 아래에 붙여 넣었습니다.
public class ReadPop3Email
{
public static void main(String[] args)
{
System.setProperty("mail.mime.parameters.strict", "false");
System.setProperty("mail.mime.ignoremultipartencoding", "false");
ReadPop3Email pop3Email = new ReadPop3Email();
pop3Email.readPOP3Account();
}
public static String[] getPOP3Info()
{
return new String[]{"mypop3host.net", "110", "[email protected]", "password"};
}
public Properties getPOP3Properties()
{
Properties props = new Properties();
props.put("mail.pop3.timeout", "30000");
props.put("mail.pop3.connectiontimeout", "10000");
props.put("mail.pop3.filecache.enable", "true");
return props;
}
public void readPOP3Account()
{
String server = getPOP3Info()[0];
int port = Integer.parseInt(getPOP3Info()[1]);
String username = getPOP3Info()[2];
String password = getPOP3Info()[3];
Session session = null;
Store store = null;
Folder folder = null;
POP3Folder pf = null;
Message message = null;
Message[] messages = null;
try {
System.out.println("-------------- Started processing POP3 account: " + username + " -----------------");
session = Session.getInstance(getPOP3Properties());
System.out.println("Getting the session for accessing email.");
store = session.getStore("pop3");
store.connect(server, port, username, password);
System.out.println("Connection established with POP3 server.");
folder = store.getDefaultFolder();
folder = folder.getFolder("inbox");
System.out.println("Getting the Inbox folder.");
folder.open(Folder.READ_ONLY);
pf = (POP3Folder) folder;
System.out.println("Total messages found: " + folder.getMessageCount());
messages = folder.getMessages();
//Message no. 26 is the one having this issue
message = messages[26 - 1];
System.out.println("Message number: " + message.getMessageNumber());
System.out.println("Message UID: " + pf.getUID(message));
System.out.println("From: " + message.getFrom()[0].toString());
System.out.println("Subject: " + message.getSubject());
System.out.println("Received date: " + message.getReceivedDate());
System.out.println("Sent date: " + message.getSentDate());
System.out.println("Content Type: " + message.getContentType());
System.out.println("Disposition: " + message.getDisposition());
boolean isMultipart = (message.getContent() instanceof Multipart);
System.out.println("Message is multipart? " + isMultipart);
if (!isMultipart) {
getBodyContent(message);
}
folder.close(true);
store.close();
System.out.println("-------------- Completed processing POP3 account: " + username + " -----------------");
} catch (Exception e) {
e.printStackTrace();
}
}
private void getBodyContent(Message message)
{
try
{
System.out.println("============== BODY CONTENT STARTS HERE ==============");
Object object = message.getContent();
if (object instanceof String) {
System.out.println("STRING content follows below: \n" + (String) object);
} else if (object instanceof InputStream) {
System.out.println("INPUTSTREAM content");
InputStream is = (InputStream) object;
int c;
while ((c = is.read()) != -1) {
System.out.write(c);
}
}
System.out.println("============== BODY CONTENT ENDS HERE ==============");
} catch (Exception e) {
e.printStackTrace();
}
}
}
조금 더 추가 할 수 있습니까? nr. 290? 예 : ~ 20 라인 이상이 필요합니다. (모든 방법을 공유 할 수 있습니다 ... 전혀 문제가 없습니다!) –
@OndrejKvasnovsky : 원본 소스 코드를 약간 수정 한 버전 위에 붙여 넣었습니다. – Gnanam