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

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


person Ricardo    schedule 23.11.2009    source источник


Ответы (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]"));
person jitter    schedule 23.11.2009
comment
Я верю, что это было бы решением. Но из того, что я читал, почтовый сервер должен это поддерживать. Когда SMTP-сервер доставки выполняет окончательную доставку сообщения, он вставляет строку обратного пути в начало почтовых данных. Это использование пути возврата является обязательным; почтовые системы ДОЛЖНЫ его поддерживать. Строка пути возврата сохраняет информацию в ‹обратном пути› из команды MAIL. в ietf.org/rfc/rfc2821.txt - person Ricardo; 23.11.2009
comment
я пытался сделать это на многих других уровнях кода, это единственное решение, которое сработало для меня - person kommradHomer; 13.07.2017

Я столкнулся с той же проблемой и нашел единственное обсуждаемое решение: поставить свойство "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());
person GiorgosDev    schedule 26.09.2013
comment
Это сработало для меня, когда метод mail.smtp.from не сработал. Спасибо! Восхитительный. - person Nick; 27.05.2014

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

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

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

person davepletcher    schedule 17.06.2019
comment
какой у вас конкретный вопрос? - person David Leal; 17.06.2019
comment
первый ответ не работал у меня как есть; второй хакерский; это сработало для меня (я использую smtps вместо smtp в качестве «mail.protocol»)… просто решил поделиться… - person davepletcher; 19.06.2019