props mensajes envío enviar correos correo con adjunto java smtp javamail war

mensajes - javamail en java



JavaMail no envía el asunto o desde debajo del embarcadero: la corrida (4)

¿Es posible que cuando lo construya como WAR, se tomen otras dependencias? Parece que otros han encontrado este problema, y ​​la causa fue un error en geronimo (para obtener más información, consulte http://mail-archives.apache.org/mod_mbox/geronimo-user/200902.mbox/%3C21943498.post@talk .nabble.com% 3E ).

También teníamos geronimo-javamail_1.4_spec-1.2 incluido en nuestro producto y ese paquete tiene un error con los encabezados. Excluimos esto (junto con geronimo-activation_1.1_spec) de nuestras dependencias y corrigió el problema.

¿Alguien ha visto a JavaMail no enviando mensajes MimeMessage adecuados a un servidor SMTP, dependiendo de cómo se inició la JVM? Al final del día, no puedo enviar mensajes JavaMail SMTP con los campos Subject: o From: y parece que faltan otros encabezados, solo cuando se ejecuta la aplicación como una guerra.

El proyecto web está construido con Maven y estoy probando enviar JavaMail usando un navegador y un simple mail.jsp para depurar y ver un comportamiento diferente al iniciar la aplicación con:

1) mvn embarcadero: ejecutar (el correo se envía bien, con los campos adecuados de Asunto y De)

2) mvn embarcadero: run-war (el correo envía bien, pero falta Subject, From y otros campos)

He ejecutado meticulosamente diff en la salida de depuración (verbosa) Maven (-X), y no hay diferencias en las dependencias de tiempo de ejecución entre los dos. También comparé las propiedades del sistema, y ​​son idénticas. Algo más está sucediendo en el muelle: caso de guerra en marcha que cambia la forma en que se comporta JavaMail. ¿Qué otras piedras necesitan girar?

Curiosamente, probé un depurador en ambas situaciones y descubrí que la instancia de javax.mail.internet.MimeMessage se está creando de forma diferente. La aplicación web usa Spring para enviar correos electrónicos eliminados de una cola de Apache ActiveMQ. Al ejecutar la aplicación como mvn jetty:run la variable MimeMessage.contentStream se utiliza para el contenido del mensaje. Cuando se ejecuta como mvn jetty:run-war , la variable MimeMessage.content se utiliza para el contenido del mensaje y el contenido = ASCIIUtility.getBytes (es); llamada elimina todos los datos de encabezado del contenido analizado. Como esto parecía muy extraño, y la depuración de Spring / ActiveMQ es una inmersión profunda, creé una prueba simplificada sin ninguna de esa infraestructura: solo una JSP que utiliza mail-1.4.2.jar, pero faltan los mismos encabezados.

También debe tenerse en cuenta que estas cabeceras faltan cuando se ejecuta el archivo WAR bajo Tomcat 5.5.27. Tomcat se comporta como Jetty cuando ejecuta WAR, con los mismos encabezados que faltan.

Con la depuración JavaMail activada, veo claramente una salida diferente.

BUENA CASE: En el embarcadero: ejecutar (no WAR), la salida del registro es:

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

MALO CASO: El resultado del registro cuando se ejecuta como GUERRA, con encabezados perdidos, es bastante diferente:

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

Aquí está el mail.jsp real con el que estoy probando war / no-war.

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

SOLUCIÓN:

Sí, el problema eran las dependencias transitivas de Apache CXF 2. Tuve que excluir geronimo-javamail_1.4_spec de la compilación, y solo confié en 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>

Gracias por todas las respuestas.


En mi caso, el verdadero culpable era alguna biblioteca de Amazon que estaba reemplazando el mecanismo de transporte estándar:

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

Tuve que obligar a la sesión a utilizar la versión estándar mientras creaba la sesión:

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

Debo mencionar que también implementé las correcciones dadas por Jason y Vijay para excluir las bibliotecas de geronimo.

Tal vez el transporte de AMazon SDK está usando código geronimo internamente? ...

¡Gracias!


Es la dependencia que crea este problema, asegúrese de cargar mail.jar antes de otro jar que contenga la clase javax.mail.Transport. En mi caso, el culpable fue javaee-api-5.0-1.jar


Estoy teniendo este mismo problema también. Veo el correo electrónico roto cuando corro en TestNG con Spring y un montón de tarros de aplicaciones. Cuando corro en un método principal simple de Java, funciona bien. Estas son las diferencias de clase entre cuando ejecuto este código dentro de TestNG vs PSVM

Estas son las clases de correo que faltan cuando corro en 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

Esta clase de correo está presente en TestNG pero no en PSVM

+javax.mail.internet.CachedDataHandler