2007년 12월 27일 목요일

Spring에서 Gmail SMTP서버를 이용하여 메일 보내기

Spring에서 Gmail SMTP서버를 이용한 메일 발송 구현하기

단순 텍스트 메일이 아닌 MIME타입의 메일을 보내기 위해서는 오로지 Spring만으로 구현이 불가능 합니다. 여러가지 문서를 참고한 결과 Java Mail과 Spring을 적절히 활용하면 MIME 타입의 메일을 쉽게 보낼수가 있음을 파악할수 있었습니다.
Spring 클래스들을 살펴보면 JavaMail과의 연동 및 확장가능성을 지원해주기 위하여
JavaMailSenderImplMimeMessageHelper 등과 같은 다양한 클래스들을 지원해주고 있습니다.

일단 AbstractMailSender라는 추상화 메일 센더 클래스를 만듭니다.

import javax.mail.MessagingException;

import org.springframework.mail.javamail.JavaMailSender;

/**
 * @author Leegun
 *
 */
public abstract class AbstractMailSender
{
 protected JavaMailSender sender;
 
 public void setSender(JavaMailSender sender) {
  this.sender = sender;
 }
 
 public abstract void sendMail( String to, String from,
      String subject, String text ) throws MessagingException;
 

}

다음은 메일 인증을 담당하고 있는 JavaMailAuthenticator 클래스를 만듭니다.
기존에 Java에서 지원해주고 있는 메일 인증 모듈을 그대로 사용하기 위하여 JavaMailSenderImpl 클래스를 상속받아서 구현을 시도합니다.

import java.util.Properties;

import org.springframework.mail.javamail.JavaMailSenderImpl;

/**
 * @author Leegun
 *
 */
public class JavaMailAuthenticator extends
JavaMailSenderImpl
{
 public JavaMailAuthenticator()
 {
  super();
  Properties props = new Properties();
  props.put("mail.smtp.starttls.enable", "true");
  props.put("mail.smtp.auth", "true");
  this.setJavaMailProperties(props);
 }
}

마지막으로 실제 전송해야 할 메일 내용및 To, From 과 같은 기본 사항들을 설정해줍니다.
MIME타입의 메일을 보내기 위하여 MimeMessageHelper 클래스를 사용합니다.

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

import org.springframework.mail.javamail.MimeMessageHelper;

/**
 * @author Leegun
 *
 */
public class MimeMailSender extends AbstractMailSender
{
 // 메일 전송시 오류가 발생하면 MessagingException을 던진다.
 public void sendMail( String to, String from,
      String subject, String text ) throws MessagingException
 {
  MimeMessage msg = sender.createMimeMessage();
 
  // true를 세팅함으로써 메일 포맷의 다양화를 지원하겠다는것을 명시적으로 세팅해준다.
  MimeMessageHelper helper = new MimeMessageHelper(msg, true, "utf-8");
 
  helper.setTo(to);
  helper.setFrom(from);
  helper.setSubject(subject);
  helper.setText(text);
 
  sender.send(msg);
 }
}

마지막으로 ApplicationContext 에 관련 빈들을 설정해줍니다.

<beans>
 <bean id="javaMailSender" class="mypackage.JavaMailAuthenticator">
  <property name="host" value="smtp.gmail.com" />
  <property name="port" value="465" />
  <property name="protocol" value="smtps" />
  <property name="username" value="
계정아이디@gmail.com">
  <property name="password" value="비밀번호"/>
 </bean>
 
 <bean id="mimeMailSender" class="mypackage.MimeMailSender">
  <property name="sender">
   <ref bean="javaMailSender"/>
  </property>
 </bean>
</beans>

실제 사용은 아래와 같이 하면 됩니다.

ApplicationContext ctx = new ClassPathXmlApplicationContext( new String[] {"applicationContext.xml"});
MimeMailSender sender = (MimeMailSender) ctx.getBean("mimeMailSender");
 
  try {
   sender.sendMail("받는 사람 메일주소", "보내는 사람 메일 주소", "핼러우 스프링", "핼러우 스프링? 응?");
  } catch (MessagingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

댓글 없음:

댓글 쓰기