2011-11-17 3 views
0

내 응용 프로그램에서 전자 메일을 보내도록 관리하기 위해 작성한 MailMessage 클래스가 있습니다. 그것은 일반 텍스트 메시지에 대해 잘 작동하고, 컴파일 및 명령 줄에서 수동으로 실행할 때 첨부 논리가 작동하지만 Glassfish 3.1 내에서 실행할 때 내 첨부 파일을 포함하는 데 실패합니다. CLASSPATH 환경을 설정하여 명령 줄에서 clobbering하는 미묘한 클래스 로딩 문제가 있다고 가정하고 있지만 변경해야하는 응용 프로그램 서버 설정을 파악할 수 없었습니다. 내가 디버깅이 가능, 내 서블릿에서 호출하는 방법에이 기능을 변경하는 경우전자 메일 첨부 파일이 Glassfish에 포함되어 있지 않음

public static void main(String[] args) throws Exception { 
    String[] toAddr = new String[] {"[email protected]"}; 
    String subject = "This is a test"; 
    String data = "This is a message body"; 
    MailMessage mailMessage = new MailMessage(toAddr, subject, data); 
    mailMessage.addAttachment(new File("/etc/hosts"), "text/plain"); 
    mailMessage.send(); 
} 

는, 결과 메일 메시지는 다음과 같습니다 : 다음 명령 줄에서 실행할 때 내 메일 메시지를 작성하고 보낼 때 사용하는 코드는 : 나는 명령 행에서 동일한 코드를 실행할 때 비교하여

[#|2011-11-17T11:21:37.710-0500|INFO|glassfish3.1|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=105;_ThreadName=Thread-1;|Date: Thu, 17 Nov 2011 11:21:37 -0500 (EST) 
From: [email protected] 
To: [email protected] 
Message-ID: <9116840.7.1321546897580.JavaMail...> 
Subject: This is a test 
MIME-Version: 1.0 
Content-Type: multipart/mixed; 
     boundary="----=_Part_6_16232037.1321546897569" 

. 
|#] 

은, 그것은 별도의 메시지 경계와 첨부 파일의 모든 각을 보여줍니다. 이 모든 코드는 다시

Message message = new MimeMessage(session); 
message.setFrom(new InternetAddress("[email protected]")); 
InternetAddress[] addresses = new InternetAddress[mailTo.length]; 
for (int i = 0; i < mailTo.length; i++) 
    addresses[i] = new InternetAddress(mailTo[i]); 
message.setRecipients(Message.RecipientType.TO, addresses); 
message.setSubject(subject); 
message.setSentDate(new Date()); 

Multipart multipart = buildMultipartMessage(messageBody.toString()); 
message.setContent(multipart); 

: 내은 MailMessage 클래스에 의해 다음과 같이 전화를 사용

private Multipart buildMultipartMessage(String messageBody) 
     throws MessagingException { 
    MimeBodyPart messagePart = new MimeBodyPart(); 
    messagePart.setText(messageBody.toString()); 

    Multipart multipart = new MimeMultipart(); 
    multipart.addBodyPart(messagePart); 

    // Attach each of our files 
    for (File part : attachment.keySet()) { 
    BodyPart attachmentPart = new MimeBodyPart(); 
    attachmentPart.setDataHandler(new DataHandler(new FileDataSource(part))); 
    attachmentPart.setFileName(part.getName() + ".txt"); 
    attachmentPart.setHeader("Content-Type", attachment.get(part)); 
    attachmentPart.setHeader("Content-ID", part.getName()); 
    attachmentPart.setDisposition(Part.ATTACHMENT); 
    multipart.addBodyPart(attachmentPart); 
    } 

    return multipart; 
} 

: 이것은 기본 MimeMessage의에 나는 첨부 파일을 추가하기 위해 사용하고 기능입니다 정확히 동일하게 컴파일하고 실행하며 명령 줄에서 실행할 때 첨부 파일이있는 유효한 전자 메일을 생성합니다. 글래스 피쉬에서 똑같은 일을 할 때 나는 비어있는 메시지를받습니다.

이 문제를 진단하는 방법에 대한 제안 사항이 있으면 알려 주시면 감사하겠습니다.

스티브

UPDATE :

내가 buildMultipartMessage()를 호출 한 후이 코드를 추가 할 수 있지만 message.setContent (다중)하기 전에, 나는 내용이 정확한지 확인할 수있는 경우 :

try { 
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("/var/tmp/stf")); 
    multipart.writeTo(bos); 
    bos.close(); 
    } catch (Exception ex) { } 

/var/tmp/stf 파일에는 첨부 파일과 구분 기호가있는 전체 메시지 본문이 들어 있습니다. 나는 이것이 명령 행에서 왜 작동하는지에 대해서는 여전히 혼란 스럽지만 Glassfish에서는 그렇지 못하다. 그러나 정보는 문제를 해결하는데 유용 할 수있다.

답변

0

내 솔루션이 this problem 인 것으로 밝혀졌습니다. 현재 문제가 발생했습니다. 내 부트 클래스 경로의 javax.mail.jar와 승인 된 디렉토리의 activation.jar을 사용하면 로거와 함께 작동하는 이메일 처리를 얻을 수있는 유일한 방법 이었지만 정상적인 사용에는 적합하지 않았습니다. 왜 이런지 모르겠지만 -Xbootclasspath 옵션을 제거하고 내 승인 된 디렉토리에서 activation.jar을 제거하면 문제가 해결된다는 것을 알게되었습니다. 누군가 이유에 대해 추측을한다면, 나는 더 많은 테스트와보고를하게되어 기쁩니다. 당분간, 첨부 파일은 내 응용 프로그램의 요구 사항이기 때문에 이메일 로깅없이 살 필요가 있다고 생각합니다.

아마도 네이티브 Java EE 6 로깅을 사용하는 대신 log4j로 전환하면 두 가지 장점을 모두 활용할 수 있습니다.

관련 문제