2009-11-23 16 views

Respuesta

20

El siguiente código hace lo que quiere, y lo hace de la manera correcta. Vuelva a leer lo que usted mismo ha escrito en el comentario

Desde: RFC2821: 4.4 Trace Information

Cuando el servidor SMTP entrega realiza la "entrega final" de un mensaje, se inserta una línea de ruta de retorno en el comienzo de los datos del correo. Se requiere este uso de ruta de retorno; Los sistemas de correo DEBEN respaldarlo. La línea de ruta de retorno conserva la información en del comando MAIL. Aquí, la entrega final significa que el mensaje ha dejado el entorno SMTP. Normalmente, esto significa que se entregó a el usuario de destino o un correo asociado , pero en algunos casos puede ser más procesado y transmitido por otro sistema de correo.

y unas líneas más adelante.

Un sistema SMTP mensaje originario no debe enviar un mensaje que ya contiene un cabezal de retorno de la ruta.

Si lee este documento con atención, comprenderá que solo se supone que el agente de entrega/servidor smtp final debe agregar el encabezado Return-Path. No es algo que usted como cliente (tratando de enviar un correo) debería hacer. El servidor smtp final basará el encabezado Return-Path en la dirección del remitente del sobre (SMTP MAIL FROM parte).

Así que la configuración mail.smtp.from es la forma correcta de decirle a java que la dirección del remitente del sobre debe ser diferente de la parte from.

Si tiene problemas para entender cuáles son los diferentes from, simplemente eche un vistazo a una sesión smtp de telnet. Donde [email protected] debe corresponder a smtp.mail.from y [email protected] a m.addFrom(...);

telnet smtp.example.com 25 
220 smtp.example.com ESMTP ..... 

helo computername 
250 smtp.example.com Hello computername [123.123.123.123] 

mail from:<[email protected]> 
250 <[email protected]> is syntactically correct 

rcpt to:<[email protected]> 
250 <[email protected]> verified 

data 
354 Enter message, ending with "." on a line by itself 
To: Joey <[email protected]> 
From: Joey <[email protected]> 
Subject: Joey 

Hey Joey! 

. 
250 OK id=.... 

Quit 

props.put("mail.smtp.from", "[email protected]"); 
Session session = Session.getDefaultInstance(props, null); 
MimeMessage m = new MimeMessage(session); 
m.addFrom(InternetAddress.parse("[email protected]")); 
+0

creo que sería la solución. Pero por lo que leo, el servidor de correo debe soportarlo. "Cuando el servidor SMTP de entrega realiza la" entrega final "de un mensaje, inserta una línea de ruta de retorno al comienzo de los datos del correo. Este uso de la ruta de retorno es obligatorio; los sistemas de correo DEBEN respaldarlo. la línea de ruta conserva la información en del comando MAIL. " en http://www.ietf.org/rfc/rfc2821.txt – Ricardo

+0

Revise la respuesta expandida – jitter

+0

He intentado hacer esto en muchos otros niveles del código, esta es la única solución que me ha funcionado – kommradHomer

6

que he experimentado el mismo tema y encontré la única solución discutida poniendo propiedad props.put "mail.smtp.from" (" mail.smtp.from "," [email protected] ");

Todavía esta solución no era adecuada para mí porque estoy enviando muchos correos electrónicos de diferentes usuarios, por lo que recrear la sesión para cada correo electrónico sería horrible para la prodictividad.

así que encontré otra solución después de leer las fuentes JavaMail:

1) Uso SMTPMessage (se extiende MimeMessage) en lugar de MimeMessage.

2) Use el método setEnvelopeFrom (String).

3) Use SMTPTransport para enviar correos electrónicos (no lo intenté con otros).

Aquí es un ejemplo de código:

SMTPMessage message = new SMTPMessage(session); 
message.setEnvelopeFrom("[email protected]"); 
... 
transport.sendMessage(message, message.getAllRecipients()); 
+0

Esto funcionó para cuando el método "mail.smtp.from" no. ¡Gracias! Encantador. – Nick

+0

no funcionó para mí – Anita

Cuestiones relacionadas