자바(Java)

자바 smtp java.net.UnknownHostException javax.mail.SendFailedException javax.mail.MessagingException

xemaker 2023. 4. 25. 15:40


자바 smtp java.net.UnknownHostException javax.mail.SendFailedException javax.mail.MessagingException

smtp 연동 시 발생할 수 있는 데러에 관해 살펴본다.

잘 될거 같은데 막상 하다보면 정신이 없어서 잘 안된다.

차분하게 생각하면 별거 아니고 쉬운것을..

막상 정신이 없다보니 먼길을 돌아간다.

워낙 IT가 복잡해서리.. 알아야 될것도 많고.. 묵시적인것도 많고..

그럼 이제 먼길 안돌아가고 빠르게 해결할 수 있게 사례를 살펴 본다.

1. java.net.UnknownHostException :

Exception in thread "main" javax.mail.MessagingException: Unknown SMTP host: aaa.com;

도메인을 자바 smtp 세팅할때 했는데 (mail.smtp.host) 그 도메인에 매핑되는 IP가 없을 경우 발생하는 에러이다.

String url="aaa.com";
Properties prop = new Properties();
prop.put("mail.smtp.host", url);

그래서 hosts 파일에 추가해주면 된다.

1.1.1.1 aaa.com

(
윈도우라면 C:\Windows\System32\drivers\etc 여기에 hosts 파일이 있다.
리눅스라면 /etc 밑에 있다.
리눅스를 오랜만에 쓰면 잘 기억이 안날 수도 있다. 그럼 찾아야 된다.

find / -name hosts

하면 되는데 그럼 허가 거부도 많이 나와서 허가 거부를 지워준다.

find / -name hosts 2>/dev/null

그럼 /etc/hosts 라고 나올것이다.

host가 아니다 hosts 이다.
)


이게 싫다면 smtp 세팅 시 ip 주소를 넣으면 된다.

String url="1.1.1.1";
Properties prop = new Properties();
prop.put("mail.smtp.host", url);

2. javax.mail.SendFailedException
Exception in thread "main" javax.mail.SendFailedException: Invalid Addresses;
  nested exception is:
com.sun.mail.smtp.SMTPAddressFailedException: 530 5.7.1 Authentication Required

at co m.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1835) 
at co m.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1098) 
at javax.mail.Transport.send0(Transport.java:195)
at javax.mail.Transport.send(Transport.java:124)
at mail.SendMailTest.main(SendMailTest.java:78)
Caused by: com.sun.mail.smtp.SMTPAddressFailedException:530 5.7.1 Authentication Required

at co m.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1733) 
... 4 more


Invalid Addresses 즉, 메일주소가 잘못된 것이다. 메일주소를 잘 쓰면 해결될 것이다.

3. javax.mail.MessagingException
Exception in thread "main" javax.mail.MessagingException: Could not connect to SMTP host: aaa.com, port: 2;
  nested exception is:
java.net.ConnectException: Connection timed out: connect
at co m.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1934) 
at co m.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:638) 
at javax.mail.Service.connect(Service.java:295)
at javax.mail.Service.connect(Service.java:176)
at javax.mail.Service.connect(Service.java:125)
at javax.mail.Transport.send0(Transport.java:194)
at javax.mail.Transport.send(Transport.java:124)
at mail.SendMailTest.main(SendMailTest.java:79)
Caused by: java.net.ConnectException: Connection timed out: connect

25번인데 2번으로 해봤다. 그러니 한참을(한 20초) 기다려서 위와 같은 에러를 뱉었다.
포트가 잘 못된 경우에 발생한다.

참고로 3번과 같은 에러가 발생하면 기본 설정된 timeout 시간이 꽤 걸리는 경우가 있다. 오래 기다려야 하니 아래처럼 타임아웃 시간을 넣어주는게 좋다.
에러나면 바로 에러를 뱉는다.

prop.put("mail.smtp.connectiontimeout", 10);