Javax.mail 패키지를 활용해서 메일을 보내는 기능을 사용 중이였습니다.
기존 화면에서 수신자를 선택해서 메일을 보내는 어렵지 않는 기능이였습니다.
그러다, 참조(CC)에 메일목록을 추가해야되는 사항이 있어서 참조에 대상을 넣고 기능을 테스트 해 보았는데, 참조에 포함된 인원에 대해서는 메일이 발송되지 않았습니다.
대략적인 소스코드의 모습입니다.
public boolean sendMail(){
Message msg = //메시지와 관련된 정보입니다.
msg.setFrom(new InternetAddress(user));
msg.addRecipients(Message.RecipientType.TO, InternetAddress.parse(receiver)); //수신자
msg.addRecipients(Message.RecipientType.CC, InternetAddress.parse(cc_user));//추가한 참조
msg.setSubject("제목");
msg.getRecipients(Message.RecipientType.TO);
Transport trns =session.getTransport("smtp");
try {
trns.connect();
trns.sendMessage(msg, InternetAddress.parse(receiver));
}
catch (Exception e) {
e.printStackTrace();
}
finally{
if(trns != null){
trns.close();
}
}
return true;
}
내용을 조금 생략했을 뿐 거의 공식처럼 나온 내용을 그대로 사용하였습니다.
참조대상 결과 목록에 메일주소가 있는게 보였는데 실제로 메일은 참조 대상인원에게 계속해서 발송되지 않았습니다.
구글링을 하다가 아주 단순하게 "try just, instead" 라는 문구를 보고 아래처럼 수정 해 보았습니다.
public boolean sendMail(){
Message msg = //메시지와 관련된 정보입니다.
msg.setFrom(new InternetAddress(user));
msg.addRecipients(Message.RecipientType.TO, InternetAddress.parse(receiver)); //수신자
msg.addRecipients(Message.RecipientType.CC, InternetAddress.parse(cc_user));//추가한 참조
msg.setSubject("제목");
msg.getRecipients(Message.RecipientType.TO);
/*
Transport trns =session.getTransport("smtp");
try {
trns.connect();
trns.sendMessage(msg, InternetAddress.parse(receiver));
}
catch (Exception e) {
e.printStackTrace();
}
finally{
if(trns != null){
trns.close();
}
}
*/
Transport.send(msg); //변경
return true;
}
결과는 왠걸, 새로이 추가한 대상자에게 메일이 잘 발송이 되는 것 이였습니다.
Transport 클래스에서 send 메소드를 호출하는 방식은 메시지에 등록된 수신자, 참조자, 발신자등의 정보를 토대로 직접 동작하기 때문 입니다.
기존 방식은 Message를 통해 구현한 받는이, 참조, 숨은참조 등등 내용은 메시지를 이루는 구성항목으로만 사용되어 집니다.
실제로 메일 발송 대상자는 sendMassage메소드를 호출할 때 두번째 파라미터에 담긴 메일주소에만 발송하게 됩니다.
그러므로 기존방식대로 하려면 아래처럼 참조대상자에게도 보내라고 수정해야 됩니다.
public boolean sendMail(){
Message msg = //메시지와 관련된 정보입니다.
msg.setFrom(new InternetAddress(user));
msg.addRecipients(Message.RecipientType.TO, InternetAddress.parse(receiver)); //수신자
msg.addRecipients(Message.RecipientType.CC, InternetAddress.parse(cc_user));//추가한 참조
msg.setSubject("제목");
msg.getRecipients(Message.RecipientType.TO);
Transport trns =session.getTransport("smtp");
try {
trns.connect();
trns.sendMessage(msg, InternetAddress.parse(receiver));
trns.sendMessage(msg, InternetAddress.parse(cc_user)); //이렇게 추가하여야 합니다.
}
catch (Exception e) {
e.printStackTrace();
}
finally{
if(trns != null){
trns.close();
}
}
return true;
}
Javax mail의 사용법이 미숙하여 생긴 실수가 아닌가 싶습니다.
Java메일에서 발송과 관련된 기능을 구현하는 경우에는 send로 보내는지, 아니면 sendMessage로 보내는지 여부를 잘 확인 해야 되겠습니다.
'Java(자바)' 카테고리의 다른 글
Java 클래스 컴파일 버전 확인(Java class check version, javap) (0) | 2021.11.22 |
---|---|
Java Map 다양한 데이터 정렬하기(자바 맵 정렬 - 2) (0) | 2020.11.05 |
Tomcat LifecycleMBeanBase Failed to unregister MBean with name(흔치 않는 톰캣 오류) (4) | 2020.07.08 |
Java List to Map (Java 리스트를 맵으로, 자바 List to Map) (0) | 2020.07.06 |
Java Map 정렬하기(자바 맵 정렬) (0) | 2020.07.06 |
댓글