Сообщение может быть отклонено по нескольким причинам. Эта проблема подробно обсуждается на rfc1211 . Только сервер может определить наличие определенного почтового ящика или имени пользователя. Когда сервер обнаружит ошибку, он вернет сообщение с указанием причины сбоя отправителю исходного сообщения.
Существует множество интернет-стандартов, касающихся уведомлений о состоянии доставки, но большое количество серверов не поддерживают эти новые стандарты, а используют специальные методы для возврата таких сообщений об ошибках. Следовательно, становится очень трудно соотнести отклоненное сообщение с исходным сообщением, вызвавшим проблему.
JavaMail включает в себя поддержку анализа уведомлений о состоянии доставки. Существует ряд методов и эвристик для решения этой проблемы. Одним из методов является путь возврата переменной оболочки. Вы можете установить обратный путь в разработчике, как показано в примере ниже. Это адрес, на который отправляются письма с отказами. Возможно, вы захотите установить для него общий адрес, отличный от заголовка From :, чтобы вы могли обрабатывать удаленные отскоки. Это делается путем установки свойства mail.smtp.from в JavaMail.
Создать класс Java
Создайте файл java класса SendEmail , содержимое которого выглядит следующим образом:
import java.util.Properties; import javax.mail.Message; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class SendEmail { public static void main(String[] args) throws Exception { String smtpServer = "smtp.gmail.com"; int port = 587; final String userid = "youraddress";//change accordingly final String password = "*****";//change accordingly String contentType = "text/html"; String subject = "test: bounce an email to a different address " + "from the sender"; String from = "[email protected]"; String to = "[email protected]";//some invalid address String bounceAddr = "[email protected]";//change accordingly String body = "Test: get message to bounce to a separate email address"; Properties props = new Properties(); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.host", smtpServer); props.put("mail.smtp.port", "587"); props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.from", bounceAddr); Session mailSession = Session.getInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(userid, password); } }); MimeMessage message = new MimeMessage(mailSession); message.addFrom(InternetAddress.parse(from)); message.setRecipients(Message.RecipientType.TO, to); message.setSubject(subject); message.setContent(body, contentType); Transport transport = mailSession.getTransport(); try { System.out.println("Sending ...."); transport.connect(smtpServer, port, userid, password); transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO)); System.out.println("Sending done ..."); } catch (Exception e) { System.err.println("Error Sending: "); e.printStackTrace(); } transport.close(); }// end function main() }
Здесь мы видим, что свойство mail.smtp.from установлено отличным от адреса from .
Скомпилируйте и запустите
Теперь, когда наш класс готов, давайте скомпилируем вышеуказанный класс. Я сохранил класс SendEmail.java в каталог: / home / manisha / JavaMailAPIExercise . Нам понадобятся jars javax.mail.jar и активации.jar в пути к классам. Выполните приведенную ниже команду, чтобы скомпилировать класс (оба файла jar находятся в каталоге / home / manisha /) из командной строки:
javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendEmail.java
Теперь, когда класс скомпилирован, выполните следующую команду:
java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendEmail
Проверить вывод
Вы должны увидеть следующее сообщение в командной консоли: