2009-11-23 9 views

Odpowiedz

20

Poniższy kod robi to, co chcesz i robi to we właściwy sposób. Przeczytaj jeszcze raz co sam pisał w komentarzu

Od: RFC2821: 4.4 Trace Information

Gdy serwer dostawy SMTP sprawia „ostatecznego przesyłki” z wiadomością, że wstawia linię Return-Path w początku dane poczty. Wymagane jest użycie ścieżki powrotnej ; mail systemy MUSZĄ go obsługiwać. Linia zwrotna zachowuje informacje z w poleceniu MAIL. W tym przypadku końcowa dostawa oznacza, że ​​wiadomość pozostawiła w środowisku SMTP numer . Zwykle ten numer oznaczałby, że został dostarczony do użytkownika docelowego użytkownika lub powiązanej z nim kropli poczty elektronicznej, ale w niektórych przypadkach może być on dalej przetwarzany i przesyłany przez inny system pocztowy.

i kilka linii później.

System SMTP komunikatów pochodzących nie powinien wysyłać wiadomość, że już zawiera nagłówek Return-Path.

Jeśli uważnie przeczytacie to, zrozumiecie, że tylko końcowy serwer smtp/dostarczający ma dodać nagłówek Return-Path. To nie jest coś, co powinien zrobić klient (próbując wysłać pocztę). Ostateczny serwer smtp będzie opierał nagłówek Return-Path na adresie nadawcy koperty (część SMTP MAIL FROM).

Tak więc ustawienie mail.smtp.from jest poprawnym sposobem powiadomienia java, że ​​adres nadawcy koperty powinien być inny niż część from.

Jeśli masz problemy ze zrozumieniem, jakie są różne from, wystarczy spojrzeć na sesję sms-a telnet. Gdzie [email protected] powinna odpowiadać smtp.mail.from i [email protected] do 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

wierzę byłoby rozwiązaniem. Ale z tego, co przeczytałem, serwer pocztowy musi go obsługiwać. "Gdy serwer dostarczania SMTP dokonuje" ostatecznego dostarczenia "komunikatu, wstawia on linię zwrotną na początku danych poczty .Te użycie ścieżki powrotnej jest wymagane, systemy pocztowe MUSZĄ go obsługiwać. linia ścieżki przechowuje informacje w <ścieżka odwrotna> od polecenia MAIL. " w http://www.ietf.org/rfc/rfc2821.txt – Ricardo

+0

Sprawdź rozszerzoną odpowiedź – jitter

+0

Próbowałem zrobić to na wielu innych poziomach kodu, to jest jedyne rozwiązanie, które zadziałało dla mnie – kommradHomer

6

jakie miałem ten sam problem i okazało się jedynym rozwiązaniem omówione oddanie nieruchomości "mail.smtp.from" props.put (” mail.smtp.from "," [email protected] ");

Nadal to rozwiązanie nie było odpowiednie dla mnie, ponieważ wysyłam dużo e-maili od różnych użytkowników, więc ponowne utworzenie sesji dla każdego e-maila byłoby okropne dla prodictivity.

Więc znalazłem inne rozwiązanie po przeczytaniu źródła JavaMail:

1) Wykorzystanie SMTPMessage (rozciąga MimeMessage) zamiast MimeMessage.

2) Użyj metody setEnvelopeFrom (String).

3) Użyj funkcji SMTPTransport, aby wysłać wiadomość e-mail (nie próbowałem innych).

Oto przykładowy kod:

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

To działało dla mnie, gdy metoda "mail.smtp.from" nie. Dzięki! Zachwycający. – Nick

+0

nie działa dla mnie – Anita

Powiązane problemy