Как установить возвращаемый путь на адрес электронной почты, отличный от адреса отправителя, с помощью JavaMail?

Как установить возвращаемый путь на адрес электронной почты, отличный от адреса отправителя, с помощью JavaMail?

Ответы

Ответ 1

Приведенный ниже код делает то, что вы хотите, и делает это правильно. Перечитайте то, что вы сами разместили в комментарии

От: RFC2821: 4.4 Информация о трассировке

Когда сервер SMTP доставки "окончательная доставка" сообщения, это вставляет линию обратного пути в начало почтовых данных. Это использование возврата пути; почта системы ДОЛЖНЫ поддерживать его. линия возврата-пути сохраняет информации в из команды MAIL. Здесь окончательный доставка означает, что сообщение осталось среда SMTP. Обычно это будет означать, что оно было доставлено пользователь назначения или связанный с ним mail, но в некоторых случаях это может быть обрабатывается и передается другая почтовая система.

и несколько строк позже.

Система SMTP, отправляющая сообщения НЕ ДОЛЖНО отправлять сообщение, которое уже содержит заголовок Return-path.

Если вы внимательно прочитаете это, вы поймете, что только конечный smtp-сервер/агент доставки должен добавить заголовок Return-Path. Это не то, что вы, как клиент (пытаетесь отправить почту), должны делать. Окончательный smtp-сервер будет основывать заголовок Return-Path на адресе отправителя конверта (SMTP MAIL FROM part).

Таким образом, установка mail.smtp.from - это правильный способ сказать java, что адрес отправителя конверта должен отличаться от части from.

Если у вас возникли проблемы с пониманием того, что разные from просто смотрят на telnet smtp-session. Где [email protected] должен соответствовать smtp.mail.from и [email protected] - 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]"));

Ответ 2

Я столкнулся с той же проблемой и нашел единственное решение, которое обсуждалось с установкой свойства "mail.smtp.from" props.put( "mail.smtp.from", "[email protected]" );

Тем не менее это решение не подходит для меня, потому что я отправляю много сообщений электронной почты от разных пользователей, поэтому воссоздание сеанса для каждого электронного письма было бы ужасным для продиктовок.

Итак, я нашел другое решение после чтения источников JavaMail:

1) Используйте SMTPMessage (расширяет MimeMessage) вместо MimeMessage.

2) Используйте метод setEnvelopeFrom (String).

3) Используйте SMTPTransport для отправки электронной почты (я не пытался с другими). ​​

Вот пример кода:

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

Ответ 3

Я обнаружил, что если свойство mail.protocol имеет значение, отличное от smtp (например, smtps), то будет работать только следующее:

props.put("mail.smtps.from", "[email protected]");

Это позволило мне избежать использования класса SMTPMessage, как описано в ответе GiorgosDev (классы в пакете 'com.sun' не предназначены для публичного API).