자바 smtp java.net.UnknownHostException javax.mail.SendFailedException javax.mail.MessagingException
자바 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);