gmail을 사용한 스프링 jpetstore의 메일 발송 설정
Gmail을 메일서버로 사용하여 메일을 발송할 수 있도록 설정합니다. 스프링 프레임워크의 jpetstore 샘플 프로젝트에서 보면 pet을 구매하고 결재할 때 고객의 메일주소로 감사메일을 보내게 되어있는데 그 부분의 설정을 정리해봅니다.
applicationContext.xml
<!-- MailSender used by EmailAdvice -->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="protocol" value="smtp"/>
<property name="host" value="smtp.gmail.com"/>
<property name="port" value="587"/>
<property name="username" value="yourID@gmail.com"/>
<property name="password" value="******"/>
<property name="defaultEncoding" value="utf-8"/>
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.starttls.enable">true</prop>
<prop key="mail.smtp.quitwait">false</prop>
<prop key="mail.debug">true</prop>
<prop key="mail.from">thankyou@spring.com</prop>
</props>
</property>
</bean>
SendOrderConfirm!ationEmailAdvice.java
package org.springframework.samples.jpetstore.domain.logic;
import! java.lang.reflect.Method;
import! javax.mail.Message;
import! javax.mail.internet.InternetAddress;
import! javax.mail.internet.MimeMessage;
import! org.apache.commons.logging.Log;
import! org.apache.commons.logging.LogFactory;
import! org.springframework.aop.AfterReturningAdvice;
import! org.springframework.beans.factory.InitializingBean;
import! org.springframework.mail.MailException;
import! org.springframework.mail.MailSender;
import! org.springframework.mail.javamail.JavaMailSenderImpl;
import! org.springframework.mail.javamail.MimeMessageHelper;
import! org.springframework.mail.SimpleMailMessage;
import! org.springframework.samples.jpetstore.domain.Account;
import! org.springframework.samples.jpetstore.domain.Order;
/**
* AOP advice that sends confirm!ation email after order has been submitted
* @author Dmitriy Kopylenko
*/
public class SendOrderConfirm!ationEmailAdvice implements AfterReturningAdvice, InitializingBean {
private static final String DEFAULT_MAIL_FROM = "thankyou@spring.com";
private static final String DEFAULT_SUBJECT = "Thank you for your order!";
private final Log logger = LogFactory.getLog(getClass());
private JavaMailSenderImpl mailSender;
private String mailFrom = DEFAULT_MAIL_FROM;
private String subject = DEFAULT_SUBJECT;
/**
* @param mailSender
* @uml.property name="mailSender"
*/
public void setMailSender(JavaMailSenderImpl mailSender) {
this.mailSender = mailSender;
}
/**
* @param mailFrom
* @uml.property name="mailFrom"
*/
public void setMailFrom(String mailFrom) {
this.mailFrom = mailFrom;
}
/**
* @param subject
* @uml.property name="subject"
*/
public void setSubject(String subject) {
this.subject = subject;
}
public void afterPropertiesSet() throws Exception {
if (this.mailSender == null) {
throw new IllegalStateException("mailSender is required");
}
}
public void afterReturning(Object returnValue, Method m, Object[] args, Object target) throws Throwable {
Order order = (Order) args[0];
Account account = ((PetStoreFacade) target).getAccount(order.getUsername());
// don't do anything if email address is not set
if (account.getEmail() == null || account.getEmail().length() == 0) {
return;
}
StringBuffer text = new StringBuffer();
text.append("Dear ").append(account.getFirstName()).append(' ').append(account.getLastName());
text.append(", \n\n thank your for your order from JPetStore. \nPlease note that your order number is ");
text.append(order.getOrderId());
// non-SSL
/*
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setTo(account.getEmail());
mailMessage.setFrom(this.mailFrom);
mailMessage.setSubject(this.subject);
mailMessage.setText(text.toString());
*/
// SSL #1 using MimeMessage
/*
MimeMessage mailMessage = this.mailSender.createMimeMessage();
mailMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(account.getEmail()));
mailMessage.setFrom(new InternetAddress(this.mailFrom));
mailMessage.setSubject(this.subject);
mailMessage.setText(text.toString());
*/
// SSL #3 using MimeMessageHelper
MimeMessage mailMessage = this.mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mailMessage);
helper.setTo(account.getEmail());
helper.setFrom(this.mailFrom);
helper.setSubject(this.subject);
helper.setText(text.toString());
try {
this.mailSender.send(mailMessage);
}
catch (MailException ex) {
// just log it and go on
logger.warn("An exception occured when trying to send email", ex);
}
}
}
참고사항: Gmail Hep에서 제시한 메일 클라이언트 설정조건
http://mail.google.com/support/bin/answer.py?hl=en&answer=13287
1) Incoming Mail (POP3) Server - requires SSL: pop.gmail.com
Use SSL: Yes
Port: 995
2) Outgoing Mail (SMTP) Server - requires TLS: smtp.gmail.com (use authentication)
Use Authentication: Yes
Use STARTTLS: Yes (some clients call this SSL)
Port: 465 or 587 (587이 맞음)
3) Account Name: your Gmail username (including @gmail.com)
4) Email Address: your full Gmail email address (username@gmail.com)
5) Password: your Gmail password