====== Java Mail ====== * [[https://java.net/projects/javamail/pages/Home|Java Mail Reference Implementation]] * [[http://www.oracle.com/technetwork/java/javamail/index.html|JavaMailAPI]] * [[http://www.oracle.com/technetwork/java/javase/downloads/index-135046.html|Javabeans Activation Framework]]가 필요함. * [[http://commons.apache.org/email/|Apache Commons Email]]로 좀 더 쉽게 사용. ===== Dependencies ===== * Javamail 1.5 부터는 구현체가 ''com.sun.mail''로 달라졌다. * [[http://mvnrepository.com/artifact/com.sun.mail|com.sun.mail]] 실제 구현체 * [[http://mvnrepository.com/artifact/javax.mail/javax.mail-api|javax.mail:javax.mail-api]] API 선언만 있음. 컴파일 의존성용. ===== 설정 ===== * [[https://javamail.java.net/nonav/docs/api/com/sun/mail/smtp/package-summary.html|Javamail SMTP 설정]] ==== Java Mail의 connection timeout 문제점 ==== * [[http://www.javacodegeeks.com/2014/06/javamail-can-be-evil-and-force-you-to-restart-your-app-server.html|JavaMail can be evil (and force you to restart your app server)]] * Java mail은 기본적으로 connection timeout 이 무한대이다. 따라서 커넥션이 하나라도 안 맺어지면 해당 쓰레드는 무한히 멈추게 된다. 모든 timeout 종류가 다 그렇기 때문에 **항상 timeout을 명시**해줘야 한다. String MAIL_SMTP_CONNECTIONTIMEOUT ="mail.smtp.connectiontimeout"; String MAIL_SMTP_TIMEOUT = "mail.smtp.timeout"; String MAIL_SMTP_WRITETIMEOUT = "mail.smtp.writetimeout"; String MAIL_SOCKET_TIMEOUT = "60000"; // Set a fixed timeout of 60s for all operations - // the default timeout is "infinite" props.put(MAIL_SMTP_CONNECTIONTIMEOUT, MAIL_SOCKET_TIMEOUT); props.put(MAIL_SMTP_TIMEOUT, MAIL_SOCKET_TIMEOUT); props.put(MAIL_SMTP_WRITETIMEOUT, MAIL_SOCKET_TIMEOUT); * DNS Roud robin을 사용할 경우(Amazon S3 등) DNS 캐시를 꺼야 한다. // Only cache DNS lookups for 10 seconds java.security.Security.setProperty("networkaddress.cache.ttl","10");