JavaMail API-반송 된 메시지

여러 가지 이유로 메시지가 반송 될 수 있습니다. 이 문제는 rfc1211 에서 자세히 설명 합니다. 서버 만 특정 사서함 또는 사용자 이름의 존재를 확인할 수 있습니다. 서버가 오류를 감지하면 원본 메시지를 보낸 사람에게 실패 이유를 나타내는 메시지를 반환합니다.

배달 상태 알림을 다루는 많은 인터넷 표준이 있지만 많은 서버가 이러한 새로운 표준을 지원하지 않고 대신 이러한 오류 메시지를 반환하는 임시 기술을 사용합니다. 따라서 반송 된 메시지를 문제를 일으킨 원본 메시지와 연관시키는 것은 매우 어렵습니다 .

JavaMail은 전달 상태 알림 구문 분석을 지원합니다. 이 문제를 처리하기위한 많은 기술과 경험적 방법이 있습니다. 기술 중 하나는 Variable Envelope Return Paths입니다. 아래 예와 같이 엔벨로프에서 반환 경로를 설정할 수 있습니다. 반송 메일이 전송되는 주소입니다. From : 헤더와 다른 일반 주소로 설정하여 원격 반송을 처리 할 수 ​​있습니다. 이것은 JavaMail에서 mail.smtp.from 속성 을 설정하여 수행됩니다 .

자바 클래스 생성

자바 클래스 파일 만들기 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.jaractivation.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

출력 확인

명령 콘솔에 다음 메시지가 표시되어야합니다.

Sending ....
Sending done ...