Как установить Return-Path на адрес электронной почты, отличный от адреса отправителя, с помощью JavaMail?
Как установить Return-Path на адрес электронной почты, отличный от адреса отправителя, с помощью JavaMail?
Ответы (3)
Приведенный ниже код делает то, что вы хотите, и делает это правильно. Перечитайте то, что вы сами написали в комментарии
Из: RFC2821: 4.4 Информация о трассировке
Когда SMTP-сервер доставки выполняет «окончательную доставку» сообщения, он вставляет строку обратного пути в начало почтовых данных. Это использование пути возврата является обязательным; почтовые системы ДОЛЖНЫ его поддерживать. Строка пути возврата сохраняет информацию из команды from MAIL. Здесь окончательная доставка означает, что сообщение покинуло среду SMTP. Обычно это означает, что оно было доставлено целевому пользователю или связанной с ним почте, но в некоторых случаях оно может быть дополнительно обработано и передано другой почтовой системой.
и несколькими строками позже.
Системе SMTP, отправляющей сообщение, НЕ СЛЕДУЕТ отправлять сообщение, которое уже содержит заголовок Return-path.
Если вы внимательно прочитаете это, то поймете, что только конечный smtp-сервер/агент доставки должен добавлять заголовок Return-Path
. Это не то, что вы, как клиент (пытающийся отправить письмо), должны делать. Окончательный smtp-сервер будет основывать заголовок Return-Path
на адресе отправителя конверта (часть SMTP MAIL FROM
).
Таким образом, установка mail.smtp.from
— это правильный способ сообщить java, что адрес отправителя конверта должен отличаться от части from
.
Если у вас есть проблемы с пониманием того, что представляют собой разные from
, просто взгляните на smtp-сеанс telnet. Где [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]"));
Я столкнулся с той же проблемой и нашел единственное обсуждаемое решение: поставить свойство "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());
Я обнаружил, что если для свойства «mail.protocol» установлено значение, отличное от «smtp» (например, «smtps»), то будет работать только следующее:
props.put("mail.smtps.from", "[email protected]");
Это позволило мне избежать использования класса SMTPMessage, как описано в ответе GiorgosDev (классы в пакете com.sun не предназначены для общедоступного API).