본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Java(자바)

Javax mail 참조 및 수신기능이 되지 않을 때(Java cc, to not working)

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2020. 8. 31.

 

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로 보내는지 여부를 잘 확인 해야 되겠습니다.

 

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글