2009-06-18 28 views
10

Có ai đã xem JavaMail không gửi MimeMessages phù hợp đến máy chủ SMTP, tùy thuộc vào cách JVM bắt đầu? Vào cuối ngày, tôi không thể gửi tin nhắn JavaMail SMTP với các trường Chủ đề: hoặc Từ: và xuất hiện các tiêu đề khác bị thiếu, chỉ khi chạy ứng dụng dưới dạng chiến tranh.JavaMail không gửi Chủ đề hoặc Từ dưới cầu cảng: chạy chiến tranh

Các dự án web được xây dựng với Maven và tôi đang thử nghiệm gửi JavaMail sử dụng một trình duyệt và một mail.jsp đơn giản để gỡ lỗi và thấy hành vi khác nhau khi khởi chạy ứng dụng với:

1) cầu cảng mvn: chạy (mail gửi tốt, với Chủ đề phù hợp và Từ lĩnh vực)

2) mvn jetty: chạy chiến tranh (mail gửi tốt, nhưng thiếu Chủ đề, Từ, và các lĩnh vực khác)

tôi đã tỉ mỉ chạy khác biệt trên đầu ra gỡ lỗi Maven (verbose) (-X) và không có sự khác biệt về phụ thuộc thời gian chạy giữa hai. Tôi cũng đã so sánh các thuộc tính hệ thống và chúng giống hệt nhau. Một cái gì đó khác đang xảy ra cầu cảng: trường hợp chạy chiến tranh thay đổi cách JavaMail hoạt động. Những loại đá nào khác cần quay?

Thật kỳ lạ, tôi đã thử một trình gỡ lỗi trong cả hai trường hợp và nhận thấy rằng cá thể javax.mail.internet.MimeMessage đang được tạo khác nhau. Webapp đang sử dụng Spring để gửi email được chọn của hàng đợi Apache ActiveMQ. Khi chạy ứng dụng dưới dạng mvn jetty:run biến MimeMessage.contentStream được sử dụng cho nội dung tin nhắn. Khi chạy dưới dạng mvn jetty:run-war, biến MimeMessage.content được sử dụng cho nội dung thư và content = ASCIIUtility.getBytes (is); Cuộc gọi xóa tất cả dữ liệu tiêu đề khỏi nội dung được phân tích cú pháp. Vì điều này có vẻ rất kỳ quặc, và việc gỡ lỗi Spring/ActiveMQ là một bước nhảy sâu, tôi đã tạo ra một bài kiểm tra đơn giản mà không cần bất kỳ cơ sở hạ tầng nào: chỉ cần một JSP bằng cách sử dụng mail-1.4.2.jar, nhưng vẫn thiếu các tiêu đề tương tự.

Ngoài ra lưu ý, các tiêu đề này bị thiếu khi chạy tệp WAR theo Tomcat 5.5.27. Tomcat hoạt động giống như Jetty khi chạy WAR, với cùng một tiêu đề bị thiếu.

Khi bật tính năng gỡ lỗi JavaMail, tôi thấy rõ đầu ra khác nhau.

TRƯỜNG HỢP TỐT: Trong cầu cảng: chạy (không WAR) các dữ liệu ghi nhận là:

DEBUG: JavaMail version 1.4.2 
DEBUG: successfully loaded resource: /META-INF/javamail.default.providers 
DEBUG: Tables of loaded providers 
DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc], com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun Microsystems, Inc], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc]} 
DEBUG: Providers Listed By Protocol: {imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc], imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc], smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc], pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun Microsystems, Inc], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]} 
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map 
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc] 
DEBUG SMTP: useEhlo true, useAuth true 
DEBUG SMTP: trying to connect to host "mail.authsmtp.com", port 465, isSSL false 
220 mail.authsmtp.com ESMTP Sendmail 8.14.2/8.14.2/Kp; Thu, 18 Jun 2009 01:35:24 +0100 (BST) 
DEBUG SMTP: connected to host "mail.authsmtp.com", port: 465 

EHLO jmac.local 
250-mail.authsmtp.com Hello sul-pubs-3a.Stanford.EDU [171.66.201.2], pleased to meet you 
250-ENHANCEDSTATUSCODES 
250-PIPELINING 
250-8BITMIME 
250-SIZE 52428800 
250-AUTH CRAM-MD5 DIGEST-MD5 LOGIN PLAIN 
250-DELIVERBY 
250 HELP 
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg "" 
DEBUG SMTP: Found extension "PIPELINING", arg "" 
DEBUG SMTP: Found extension "8BITMIME", arg "" 
DEBUG SMTP: Found extension "SIZE", arg "52428800" 
DEBUG SMTP: Found extension "AUTH", arg "CRAM-MD5 DIGEST-MD5 LOGIN PLAIN" 
DEBUG SMTP: Found extension "DELIVERBY", arg "" 
DEBUG SMTP: Found extension "HELP", arg "" 
DEBUG SMTP: Attempt to authenticate 
DEBUG SMTP: check mechanisms: LOGIN PLAIN DIGEST-MD5 
AUTH LOGIN 
334 VXNlcm5hjbt7 
YWM0MDkwhi== 
334 UGFzc3dvjbt7 
YXV0aHNtdHAydog3 
235 2.0.0 OK Authenticated 
DEBUG SMTP: use8bit false 
MAIL FROM:<[email protected]> 
250 2.1.0 <[email protected]>... Sender ok 
RCPT TO:<[email protected]> 
250 2.1.5 <[email protected]>... Recipient ok 
DEBUG SMTP: Verified Addresses 
DEBUG SMTP: Jason Thrasher <[email protected]> 
DATA 
354 Enter mail, end with "." on a line by itself 
From: Webmaster <[email protected]> 
To: Jason Thrasher <[email protected]> 
Message-ID: <[email protected]> 
Subject: non-Spring: Hello World 
MIME-Version: 1.0 
Content-Type: text/plain;charset=UTF-8 
Content-Transfer-Encoding: 7bit 

Hello World: message body here 
. 
250 2.0.0 n5I0ZOkD085654 Message accepted for delivery 
QUIT 
221 2.0.0 mail.authsmtp.com closing connection 

trường hợp xấu: Các dữ liệu ghi nhận khi chạy như một WAR, với tiêu đề mất tích, là khá khác nhau:

Loading javamail.default.providers from jar:file:/Users/jason/.m2/repository/javax/mail/mail/1.4.2/mail-1.4.2.jar!/META-INF/javamail.default.providers 
DEBUG: loading new provider protocol=imap, className=com.sun.mail.imap.IMAPStore, vendor=Sun Microsystems, Inc, version=null 
DEBUG: loading new provider protocol=imaps, className=com.sun.mail.imap.IMAPSSLStore, vendor=Sun Microsystems, Inc, version=null 
DEBUG: loading new provider protocol=smtp, className=com.sun.mail.smtp.SMTPTransport, vendor=Sun Microsystems, Inc, version=null 
DEBUG: loading new provider protocol=smtps, className=com.sun.mail.smtp.SMTPSSLTransport, vendor=Sun Microsystems, Inc, version=null 
DEBUG: loading new provider protocol=pop3, className=com.sun.mail.pop3.POP3Store, vendor=Sun Microsystems, Inc, version=null 
DEBUG: loading new provider protocol=pop3s, className=com.sun.mail.pop3.POP3SSLStore, vendor=Sun Microsystems, Inc, version=null 
Loading javamail.default.providers from jar:file:/Users/jason/Documents/dev/subscribeatron/software/trunk/web/struts/target/work/webapp/WEB-INF/lib/mail-1.4.2.jar!/META-INF/javamail.default.providers 
DEBUG: loading new provider protocol=imap, className=com.sun.mail.imap.IMAPStore, vendor=Sun Microsystems, Inc, version=null 
DEBUG: loading new provider protocol=imaps, className=com.sun.mail.imap.IMAPSSLStore, vendor=Sun Microsystems, Inc, version=null 
DEBUG: loading new provider protocol=smtp, className=com.sun.mail.smtp.SMTPTransport, vendor=Sun Microsystems, Inc, version=null 
DEBUG: loading new provider protocol=smtps, className=com.sun.mail.smtp.SMTPSSLTransport, vendor=Sun Microsystems, Inc, version=null 
DEBUG: loading new provider protocol=pop3, className=com.sun.mail.pop3.POP3Store, vendor=Sun Microsystems, Inc, version=null 
DEBUG: loading new provider protocol=pop3s, className=com.sun.mail.pop3.POP3SSLStore, vendor=Sun Microsystems, Inc, version=null 
DEBUG: getProvider() returning provider protocol=smtp; [email protected]; class=com.sun.mail.smtp.SMTPTransport; vendor=Sun Microsystems, Inc 
DEBUG SMTP: useEhlo true, useAuth false 
DEBUG SMTP: trying to connect to host "mail.authsmtp.com", port 465, isSSL false 
220 mail.authsmtp.com ESMTP Sendmail 8.14.2/8.14.2/Kp; Thu, 18 Jun 2009 01:51:46 +0100 (BST) 
DEBUG SMTP: connected to host "mail.authsmtp.com", port: 465 

EHLO jmac.local 
250-mail.authsmtp.com Hello sul-pubs-3a.Stanford.EDU [171.66.201.2], pleased to meet you 
250-ENHANCEDSTATUSCODES 
250-PIPELINING 
250-8BITMIME 
250-SIZE 52428800 
250-AUTH CRAM-MD5 DIGEST-MD5 LOGIN PLAIN 
250-DELIVERBY 
250 HELP 
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg "" 
DEBUG SMTP: Found extension "PIPELINING", arg "" 
DEBUG SMTP: Found extension "8BITMIME", arg "" 
DEBUG SMTP: Found extension "SIZE", arg "52428800" 
DEBUG SMTP: Found extension "AUTH", arg "CRAM-MD5 DIGEST-MD5 LOGIN PLAIN" 
DEBUG SMTP: Found extension "DELIVERBY", arg "" 
DEBUG SMTP: Found extension "HELP", arg "" 
DEBUG SMTP: Attempt to authenticate 
DEBUG SMTP: check mechanisms: LOGIN PLAIN DIGEST-MD5 
AUTH LOGIN 
334 VXNlcm5hjbt7 
YWM0MDkwhi== 
334 UGFzc3dvjbt7 
YXV0aHNtdHAydog3 
235 2.0.0 OK Authenticated 
DEBUG SMTP: use8bit false 
MAIL FROM:<[email protected]> 
250 2.1.0 <[email protected]>... Sender ok 
RCPT TO:<[email protected]> 
250 2.1.5 <[email protected]>... Recipient ok 
DEBUG SMTP: Verified Addresses 
DEBUG SMTP: Jason Thrasher <[email protected]> 
DATA 
354 Enter mail, end with "." on a line by itself 

Hello World: message body here 
. 
250 2.0.0 n5I0pkSc090137 Message accepted for delivery 
QUIT 
221 2.0.0 mail.authsmtp.com closing connection 

Đây là mail.jsp thực tế mà tôi đang thử nghiệm chiến tranh/không chiến tranh với.

<%@page import="java.util.*"%> 
<%@page import="javax.mail.internet.*"%> 
<%@page import="javax.mail.*"%> 

<% 
    InternetAddress from = new InternetAddress("[email protected]", "Webmaster"); 
    InternetAddress to = new InternetAddress("[email protected]", "Jason Thrasher"); 
    String subject = "non-Spring: Hello World"; 
    String content = "Hello World: message body here"; 

    final Properties props = new Properties(); 
    props.setProperty("mail.transport.protocol", "smtp"); 
    props.setProperty("mail.host", "mail.authsmtp.com"); 
    props.setProperty("mail.port", "465"); 
    props.setProperty("mail.username", "myusername"); 
    props.setProperty("mail.password", "secret"); 
    props.setProperty("mail.debug", "true"); 
    props.setProperty("mail.smtp.auth", "true"); 
    props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
    props.setProperty("mail.smtp.socketFactory.fallback", "false"); 

    Session mailSession = Session.getDefaultInstance(props); 

    Message message = new MimeMessage(mailSession); 
    message.setFrom(from); 
    message.setRecipient(Message.RecipientType.TO, to); 
    message.setSubject(subject); 
    message.setContent(content, "text/plain;charset=UTF-8"); 

    Transport trans = mailSession.getTransport(); 
    trans.connect(props.getProperty("mail.host"), Integer 
      .parseInt(props.getProperty("mail.port")), props 
      .getProperty("mail.username"), props 
      .getProperty("mail.password")); 
    trans.sendMessage(message, message 
      .getRecipients(Message.RecipientType.TO)); 
    trans.close(); 
%> 

email was sent 

SOLUTION:

Vâng, vấn đề là phụ thuộc bắc cầu của Apache CXF 2. Tôi đã phải loại trừ geronimo-javamail_1.4_spec từ việc xây dựng, và chỉ dựa vào mail-1.4.jar javax của.

<dependency> 
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-rt-frontend-jaxws</artifactId> 
    <version>2.2.6</version> 
    <exclusions> 
     <exclusion> 
      <groupId>org.apache.geronimo.specs</groupId> 
      <artifactId>geronimo-javamail_1.4_spec</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

Cảm ơn tất cả các câu trả lời.

+0

bạn có thể đăng mã được sử dụng để thực sự gửi thư không? –

+0

Xin chào Matt, chắc chắn, hãy xem mail.jsp của tôi ở trên. Ứng dụng hoàn chỉnh tải các Spring, Struts và Apache jars khác nhau, nhưng vì tôi đã quá bối rối về vấn đề này, tôi đã tạo ra mail.jsp đơn giản này, để kiểm tra nó với. Chỉ mail-1.4.2.jar đang được tải. Tôi đang thua lỗ vì những gì sẽ tăng lên khi gửi email. Cảm ơn. –

+0

Xin chào Jason, bạn đã tìm ra giải pháp chưa? Chúng tôi có trường hợp hơi khác nhau nhưng kết quả là như nhau. –

Trả lời

9

Có thể khi bạn xây dựng nó như một WAR mà các phụ thuộc khác đang được kéo vào? Có vẻ như những người khác đã gặp phải vấn đề này, và nguyên nhân là một lỗi trong geronimo (để biết thêm thông tin, xem http://mail-archives.apache.org/mod_mbox/geronimo-user/200902.mbox/%[email protected]%3E).

Chúng tôi cũng có geronimo-javamail_1.4_spec-1.2 được bao gồm trong sản phẩm của chúng tôi và gói đó có lỗi với tiêu đề. Chúng tôi đã loại trừ điều này (cùng với geronimo-activation_1.1_spec) từ các phụ thuộc của chúng tôi và nó đã khắc phục sự cố.

+1

Tôi cũng đã có vấn đề ở trên (đã sử dụng Mule, mà cuối cùng đã đưa vào Geronimo cho một số bit). Việc loại trừ javamail * _spec chắc chắn nên khắc phục sự cố. –

+0

Bạn đúng, đó là geronimo. Cảm ơn bạn đã giúp đỡ. –

+0

Bạn tiết kiệm cuộc sống! – seanhodges

0

Tôi cũng gặp vấn đề tương tự. Tôi thấy email bị hỏng khi tôi chạy trong TestNG với Spring và một loạt các lọ ứng dụng. Khi tôi chạy trong một phương thức chính java đơn giản, nó hoạt động tốt.Dưới đây là những khác biệt đẳng cấp giữa khi tôi chạy mã này bên TestNG vs PSVM

Đây là những lớp mail mà vắng mặt khi tôi chạy trong TestNG:

lớp
-com.sun.mail.smtp.SMTPTransport$Authenticator 
-com.sun.mail.smtp.SMTPTransport$DigestMD5Authenticator 
-com.sun.mail.smtp.SMTPTransport$LoginAuthenticator 
-com.sun.mail.smtp.SMTPTransport$PlainAuthenticator 
-com.sun.mail.util.FolderClosedIOException 
-com.sun.mail.util.MessageRemovedIOException 
-com.sun.mail.util.PropUtil 
-javax.mail.FolderClosedException 
-javax.mail.MessageRemovedException 
-javax.mail.Multipart 
-javax.mail.internet.ParameterList$MultiValue 
-javax.net.SocketFactory 
-javax.net.ssl.SSLException 
-javax.net.ssl.SSLPeerUnverifiedException 
-javax.net.ssl.SSLSocket 

email này hiện diện trong TestNG nhưng không PSVM

+javax.mail.internet.CachedDataHandler 
2

Đó là sự phụ thuộc tạo ra vấn đề này, đảm bảo bạn tải mail.jar trước các jar khác có chứa lớp javax.mail.Transport. Trong trường hợp của tôi là thủ phạm là JavaEE-api-5.0-1.jar

0

Trong trường hợp của tôi, thủ phạm thực tế là một số thư viện amazon đã được thay thế cơ chế vận chuyển tiêu chuẩn:

<dependency> 
     <groupId>com.amazonaws</groupId> 
     <artifactId>aws-java-sdk</artifactId> 
     <version>1.3.9</version> 
</dependency> 

tôi phải buộc Phiên để sử dụng lại tiêu chuẩn khi tạo phiên:

properties.setProperty("mail.smtp.class", "com.sun.mail.smtp.SMTPTransport"); // Fix to prevent Amazon AWS from giving their transport 

Tôi phải đề cập đến các bản sửa lỗi do Jason và Vijay đưa ra để loại trừ các thư viện geronimo.

Có lẽ việc vận chuyển AMazon SDK đang sử dụng mã geronimo trong nội bộ? ...

Cảm ơn!

Các vấn đề liên quan