JavaMail senden nicht Unterliegen oder Von unter jetty:run-war
Hat jemand gesehen JavaMail nicht senden, die richtige MimeMessages an einen SMTP-server, je nachdem, wie die JVM in angefangen? Am Ende des Tages, ich kann nicht senden JavaMail-SMTP-Nachrichten mit dem Betreff: oder Aus: Felder, und es scheint, andere Header fehlen, nur, wenn Sie die app als ein Krieg.
Des web-Projekts mit Maven und ich Teste versenden mit JavaMail ein browser und eine einfache E-mail.jsp zu Debuggen und finden Sie das unterschiedliche Verhalten beim Start der app mit:
1) mvn jetty:run (E-mail sendet, fein, mit dem richtigen Betreff und Von-Felder)
2) mvn jetty:run-war (E-mail schickt, in Ordnung, aber die fehlende Subject, From und andere Felder)
Habe ich akribisch diff auf die (ausführliche) Maven debug output (-X), und es sind keine Unterschiede in den Laufzeit-Abhängigkeiten zwischen den beiden. Ich habe auch im Vergleich der Systemeigenschaften, und Sie sind identisch. Passiert etwas anderes jetty:run-war Fall, dass die änderungen die Art und Weise JavaMail verhält. Was die anderen Steine müssen drehen?
Neugierig, ich habe versucht, einen debugger in beiden Fällen und festgestellt, dass die javax.E-mail.internet.MimeMessage Instanz ist immer auf eine andere Weise erstellt. Die webapp ist mit Feder E-Mails senden, pflückte von einem Apache ActiveMQ queue. Wann läuft die app wie mvn jetty:run
die MimeMessage.contentStream-variable wird verwendet für den Inhalt der Nachricht. Bei Ausführung als mvn jetty:run-war
, die MimeMessage.content-variable ist für den Inhalt der Nachricht und die
content = ASCIIUtility.getBytes(ist);
Aufruf entfernt alle header-Daten von der analysierten Inhalte. Da das erschien mir sehr sonderbar, und debugging-Frühjahr/ActiveMQ ist ein tiefer Tauchgang, habe ich eine vereinfachte Prüfung ohne, dass die Infrastruktur: nur mit JSP mail-1.4.2.jar noch die gleichen Kopfzeilen fehlen.
Außerdem ist zu beachten, dass diese Kopfzeilen fehlen beim ausführen der war-Datei unter Tomcat-5.5.27. Tomcat verhält sich genauso wie Steg bei der Ausführung des KRIEGES, mit den gleichen fehlenden Header.
Mit JavaMail-debugging eingeschaltet, ich sehe deutlich anderen Ausgang.
GUTES Beispiel: In der jetty:run (nicht KRIEG) die log-Ausgabe ist:
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:<webmaster@mydomain.org>
250 2.1.0 <webmaster@mydomain.org>... Sender ok
RCPT TO:<jason@mydomain.org>
250 2.1.5 <jason@mydomain.org>... Recipient ok
DEBUG SMTP: Verified Addresses
DEBUG SMTP: Jason Thrasher <jason@mydomain.org>
DATA
354 Enter mail, end with "." on a line by itself
From: Webmaster <webmaster@mydomain.org>
To: Jason Thrasher <jason@mydomain.org>
Message-ID: <5158456.0.1245285323633.JavaMail.jason@mail.authsmtp.com>
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
BÖSE FALLE: Die log-Ausgabe beim ausführen als ein KRIEG, mit fehlenden Header, ist eine ganz andere:
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; type=javax.mail.Provider$Type@98203f; 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:<webmaster@mydomain.org>
250 2.1.0 <webmaster@mydomain.org>... Sender ok
RCPT TO:<jason@mydomain.org>
250 2.1.5 <jason@mydomain.org>... Recipient ok
DEBUG SMTP: Verified Addresses
DEBUG SMTP: Jason Thrasher <jason@mydomain.org>
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
Hier ist die aktuelle mail.jsp, die ich Teste Krieg/nicht-Krieg mit.
<%@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
LÖSUNG:
Ja, das problem war transitive Abhängigkeiten von Apache CXF 2. Ich musste ausschließen, geronimo-javamail_1.4_spec aus zu bauen, und Verlass dich einfach auf javax s mail-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>
Danke für all die Antworten.
- können Sie nach dem code verwendet werden, um tatsächlich die E-mail senden?
- Hallo Matt, klar, siehe meine E-mail.jsp vor. Die komplette app lädt verschiedene Spring, Struts und Apache Gläsern, aber da war ich so verwirrt, als das problem, erstellte ich dieses einfache E-mail.jsp, um es zu testen mit. Nur mail-1.4.2.jar geladen wird. Ich bin an einem Verlust, was würde die Fahrt-up-E-Mails senden. Danke.
- Hallo Jason, hast du die Lösung finden? Wir haben etwas anderer Fall, aber das Ergebnis ist das gleiche.
- Nicht nur um Steg, in der Regel, wenn Sie haben, cxf Sie müssen vorsichtig sein, mit seinen Abhängigkeiten
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es möglich, dass wenn du es baust einen KRIEG, der andere Abhängigkeiten gezogen, in? Es scheint, andere haben auf dieses problem, und die Ursache war ein bug in geronimo (weitere Informationen finden Sie unter http://mail-archives.apache.org/mod_mbox/geronimo-user/200902.mbox/%[email protected]%3E ).
Hatten wir auch geronimo-javamail_1.4_spec-1.2 eingeschlossen in unser Produkt und das Paket hat einen bug mit Header. Wir ausgeschlossen diesen (zusammen mit geronimo-activation_1.1_spec) aus unseren Abhängigkeiten und es das problem behoben.
It 'SS, die Abhängigkeit, die entsteht dieses problem, stellen Sie sicher, Sie laden mail.jar vor anderen jar' s, die enthält javax.E-mail.Transport-Klasse. In meinem Fall ist der Täter war javaee-api-5.0-1.jar
Habe ich dieses gleiche problem auch. Ich sehe den kaputten E-Mail, sobald ich laufen in TestNG mit Feder und eine ganze Reihe von Anwendungs-Gläser. Wenn ich in einer reinen java-main-Methode, es funktioniert Prima. Hier sind die Klassenunterschiede zwischen, wenn ich diesen code ausführen innerhalb TestNG vs PSVM
Diese E-mail-Klassen, die abwesend sind, wenn ich in TestNG:
Diese E-mail-Klasse ist in TestNG aber nicht PSVM
In meinem Fall, der eigentliche Täter war, einige der amazon-Bibliothek, die war anstelle der standard-transport-Mechanismus:
Ich musste mich zwingen, die Sitzung für die Verwendung der standard zurück, der beim erstellen der Sitzung:
Ich noch erwähnen, dass ich auch die Implementierung der Korrekturen gegeben, die von Jason und Vijay um auszuschließen das geronimo-Bibliotheken.
Vielleicht den Transport von AMazon SDK ist mit geronimo code intern?...
Dank!