Как установить возвращаемый путь на адрес электронной почты, отличный от адреса отправителя, с помощью 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).