2009-06-18 44 views
10

有沒有人看到JavaMail沒有發送適當的MimeMessage到SMTP服務器,這取決於JVM如何啓動?在一天結束時,我無法發送帶有Subject:或From:字段的JavaMail SMTP郵件,並且只有在將應用程序作爲戰爭運行時纔會顯示其他標頭。JavaMail沒有發送主題或來自底層碼頭:run-war

Web項目是建立與Maven和我測試發送的JavaMail使用瀏覽器和一個簡單的mail.jsp調試和看到啓動應用程序時,不同的行爲:

1)MVN碼頭:運行(郵件發送細末,用適當的主題和發件人字段)

2)命令mvn碼頭:運行戰爭(郵件發送正常,但缺少的主題,發件人等領域)

我已經認真在(詳細的)Maven調試輸出(-X)上運行diff ,兩者之間的運行時依賴關係沒有差異。我還比較了系統屬性,它們是相同的。碼頭髮生了其他事情:運行 - 戰爭案件改變了JavaMail的行爲方式。還有哪些石頭需要轉向?

奇怪的是,我在兩種情況下都試過調試器,發現javax.mail.internet.MimeMessage實例的創建方式不同。該webapp使用Spring發送從Apache ActiveMQ隊列中選取的電子郵件。當以mvn jetty:run的身份運行應用程序時,MimeMessage.contentStream變量用於消息內容。當作爲mvn jetty:run-war運行時,MimeMessage.content變量用於消息內容,而 content = ASCIIUtility.getBytes(is);調用將從解析的內容中刪除所有標題數據。由於這看起來很奇怪,並且調試Spring/ActiveMQ是一個深入的探索,我創建了一個沒有任何基礎架構的簡化測試:只使用mail-1.4.2.jar的JSP,但是缺少相同的頭文件。

另外值得注意的是,在Tomcat 5.5.27下運行WAR文件時,缺少這些頭文件。運行WAR時,Tomcat的行爲與Jetty相同,但缺少相同的標頭。

隨着JavaMail調試開啓,我清楚地看到不同的輸出。

好的情況下:在碼頭:運行(非WAR)日誌輸出是:

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 

不好的情況下:作爲WAR運行時,與缺失頭中的日誌輸出,是完全不同的:

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 

這是我測試war/non-war的實際mail.jsp。

<%@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:

是的,問題是Apache的CXF 2的傳遞依賴我不得不從構建排除Geronimo的javamail_1.4_spec,僅僅依靠使用javax的郵件1.4.jar。

<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> 

感謝您的所有答案。

+0

你可以發佈用於實際發送郵件的代碼嗎? – 2009-06-18 02:03:30

+0

嗨馬特,當然,看看我上面的mail.jsp。完整的應用程序加載各種Spring,Struts和Apache jar,但由於我對這個問題非常困惑,所以我創建了這個簡單的mail.jsp,以便對其進行測試。只有郵件1.4.2.jar被加載。我不知道發送郵件會發生什麼。謝謝。 – 2009-06-18 15:57:28

回答

9

是否有可能,當你把它做成一個WAR,其他依賴關係正經歷着?看起來其他人已經遇到了這個問題,原因是geronimo中的一個錯誤(更多信息,請參閱http://mail-archives.apache.org/mod_mbox/geronimo-user/200902.mbox/%[email protected]%3E)。

我們還在我們的產品中包含了geronimo-javamail_1.4_spec-1.2,該軟件包有一個標題錯誤。我們從我們的依賴中排除了這個(和geronimo-activation_1.1_spec一起),並且糾正了這個問題。

0

我也有這個相同的問題。當我在Spring中運行TestNG和一大堆應用程序罐時,我看到了破損的電子郵件。當我在普通的java主要方法中運行時,它工作正常。下面是當我運行這段代碼裏面TestNG的VS PSVM之間的階級差別

這些郵件類是不存在的,當我在TestNG的運行:

-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 

此郵件類是目前在TestNG的,但不是PSVM

+javax.mail.internet.CachedDataHandler 
2

它是造成此問題的依賴關係,請確保您在其他包含javax.mail.Transport類的jar之前加載mail.jar。在我的情況的罪魁禍首是JavaEE的-API 5.0-1.jar

0

在我的情況下,實際的罪魁禍首是被取代標準傳輸機制的一些亞馬遜圖書館:

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

我不得不強迫會話使用標準的一回,同時創造了本屆會議:

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

我不得不提,我還實施了以排除Geronimo的庫由Jason和維傑給予修復。

也許亞馬遜SDK運輸使用Geronimo的代碼在內部?...

謝謝!