Come impostare il percorso di ritorno su un indirizzo e-mail diverso dall'indirizzo mittente utilizzando JavaMail?Come impostare il percorso di ritorno su un indirizzo e-mail diverso dall'indirizzo mittente utilizzando JavaMail?
risposta
Il codice seguente fa ciò che vuoi e lo fa nel modo corretto. Rileggere quello che lei stesso ha pubblicato un commento
Da: RFC2821: 4.4 Trace Information
Quando il server di consegna SMTP rende la "consegna finale" di un messaggio, inserisce una linea di ritorno percorso al inizio i dati della posta. È necessario utilizzare del percorso di ritorno; mail I sistemi DEVONO supportarlo. La riga del percorso di ritorno conserva le informazioni nello dal comando MAIL. Qui, la consegna finale significa che il messaggio ha lasciato l'ambiente SMTP . Normalmente, questo significava essere stato consegnato a l'utente di destinazione o una caduta di posta associata, ma in alcuni casi potrebbe essere ulteriormente elaborato e trasmesso da un altro sistema di posta.
e poche righe dopo.
Un sistema SMTP messaggio originario NON DEVONO inviare un messaggio che già contiene un'intestazione Return-path.
Se leggete attentamente questo si capirà che solo l'agente server SMTP/consegna finale dovrebbe aggiungere l'intestazione Return-Path
. Non è qualcosa che tu, come cliente (prova a mandare una mail), dovresti fare. L'ultimo smtp-server baserà l'intestazione Return-Path
sull'indirizzo del mittente della busta (parte SMTP MAIL FROM
).
Quindi l'impostazione mail.smtp.from
è il modo corretto per dire a java che l'indirizzo del mittente della busta dovrebbe essere diverso dalla parte from
.
Se avete problemi a capire quali sono i diversi from
, date un'occhiata a una sessione smtp di telnet. Dove [email protected]
dovrebbe corrispondere a smtp.mail.from
e [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]"));
ho sperimentato lo stesso problema e ho trovato l'unica soluzione discusso mettendo proprietà props.put "mail.smtp.from" (" mail.smtp.from "," [email protected] ");
Ancora questa soluzione non era adatta a me perché sto inviando molti e-mail da diversi utenti, quindi la sessione di ricreazione per ogni e-mail sarebbe orribile per prodictivity.
Così ho trovato un'altra soluzione dopo aver letto le fonti JavaMail:
1) Uso SMTPMessage (si estende MIMEMessage) invece di MIMEMessage.
2) Utilizzare il metodo setEnvelopeFrom (String).
3) Utilizzare SMTPTransport per inviare e-mail (non ho provato con altri).
Ecco un esempio di codice:
SMTPMessage message = new SMTPMessage(session);
message.setEnvelopeFrom("[email protected]");
...
transport.sendMessage(message, message.getAllRecipients());
Credo che sarebbe la soluzione. Ma da quello che ho letto, il server di posta deve supportarlo. "Quando il server SMTP di consegna effettua la" consegna finale "di un messaggio, inserisce una linea di percorso di ritorno all'inizio dei dati di posta.Questo uso del percorso di ritorno è richiesto, i sistemi di posta DEVONO supportarlo. la linea del percorso conserva le informazioni nel dal comando MAIL. " in http://www.ietf.org/rfc/rfc2821.txt –
Ricardo
Controlla risposta estesa – jitter
ho cercato di farlo su molti altri livelli del codice, questa è l'unica soluzione che ha funzionato per me – kommradHomer