Java/Tools
스프링 JavaMailSenderImpl 을 이용하여 네이버, 다음 smtp 메일발송하기
허니몬
2014. 1. 10. 18:35
구글 SMTP를 사용하다가, 고객의 요구에 따라 네이버나 다음으로 변경하려고 했는데...
smtp 로 메일 발송테스트를 하는데 포트만 바꾸면 될 줄 알았더니... 아니더라.
상당한 삽질을 통해 확인한 결과는 다음과 같다.
application.properties
mail.host = smtp.gmail.com
mail.port = 587
mail.protocol = smtp
mailService 빈설정
<bean class="...MailServiceImpl">
<constructor-arg name="mailSender">
<bean class="org.springframework.mail.javamail.JavaMailSenderImpl"
p:password="${mail.password}"
p:host="${mail.host}"
p:port="${mail.port}"
p:protocol="${mail.protocol}"
p:username="${mail.username}"
p:defaultEncoding="${mail.encoding}">
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.starttls.enable">${mail.smtp.starttls.enable}</prop>
<prop key="mail.smtp.auth">${mail.smtp.auth}</prop>
</props>
</property>
</bean>
</constructor-arg>
</bean>
네이버 메일 테스트 시
mail.xml 파일의 MailServiceImpl 빈 설정을
<bean class="...impl.MailServiceImpl">
<constructor-arg name="mailSender">
<bean class="org.springframework.mail.javamail.JavaMailSenderImpl"
p:password="${mail.password}" p:host="${mail.host}" p:port="${mail.port}"
p:protocol="${mail.protocol}" p:username="${mail.username}"
p:defaultEncoding="${mail.encoding}">
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.starttls.enable">${mail.smtp.starttls.enable}</prop>
<prop key="mail.smtp.auth">${mail.smtp.auth}</prop>
<prop key="mail.smtps.ssl.checkserveridentity">true</prop>
<prop key="mail.smtps.ssl.trust">*</prop>
</props>
</property>
</bean>
</constructor-arg>
</bean>
의 형태로 변경한다. 기존 설정내용과의 차이는
<prop key="mail.smtps.ssl.checkserveridentity">true</prop>
<prop key="mail.smtps.ssl.trust">*</prop>
그리고 application.properties의 내용을 다음과 같이 변경한다.
mail.host = smtp.naver.com
mail.port = 465
mail.protocol = smtps
테스트를 위해서 작성된 MailServiceImplTest를 실행하여 확인하다.
테스트를 실행하기 위해서는 MailServiceImplTest-context.xml 의 내용을 다음과 같이 변경하시고,
<bean class="...MailServiceImpl">
<constructor-arg name="mailSender">
<bean class="org.springframework.mail.javamail.JavaMailSenderImpl"
p:password="${mail.password}" p:host="${mail.host}" p:port="${mail.port}"
p:protocol="${mail.protocol}" p:username="${mail.username}"
p:defaultEncoding="${mail.encoding}">
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.starttls.enable">${mail.smtp.starttls.enable}</prop>
<prop key="mail.smtp.auth">${mail.smtp.auth}</prop>
<prop key="mail.debug">true</prop> <!-- 이건 테스트를 위한 디버그 내용 확인을 위한 겁니다. -->
<prop key="mail.smtps.ssl.checkserveridentity">true</prop>
<prop key="mail.smtps.ssl.trust">*</prop>
</props>
</property>
</bean>
</constructor-arg>
</bean>
test의 setFrom의 메일 계정은 로그인에 사용된 계정과 동일하게 변경한다.
다음 메일 SMTP 테스트 시
daum으로 발송할 경우에는, MailServiceImplTest 를 다음과 같이 변경하고
<bean class="...MailServiceImpl">
<constructor-arg name="mailSender">
<bean class="org.springframework.mail.javamail.JavaMailSenderImpl"
p:password="${mail.password}" p:host="${mail.host}" p:port="${mail.port}"
p:protocol="${mail.protocol}" p:username="${mail.username}"
p:defaultEncoding="${mail.encoding}">
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.starttls.enable">${mail.smtp.starttls.enable}</prop>
<prop key="mail.smtp.auth">${mail.smtp.auth}</prop>
<prop key="mail.debug">true</prop> <!-- 이건 테스트를 위한 디버그 내용 확인을 위한 겁니다. -->
</props>
</property>
</bean>
</constructor-arg>
</bean>
application.properties
mail.host = smtp.daum.net
mail.port = 465
mail.protocol = smtps
메일을 발송할 때에는, from 이메일 주소는 로그인에 사용된 메일주소와 동일해야 한다. protocol이 smtp가 아니라 smtps 이다. JavaMail에서 접근방식이 다를 줄은 몰랐다.
protocol이 'smtps'여야 SSL 설정이 활성화된다.
별도의 설정 프로퍼티가 있을 줄 알았는데... 크흐.