1. MailSender와 JavaMailSender 메일 발송
- 메일 발송 기능을 위한 MailSender 인터페이스 제공
- SimpleMailMessage(메일 제목, 단순 텍스트 내용)를 전달받아 메일을 발송하는 기능을 정의
package org.springframework.mail; public interface MailSender { void send(SimpleMailMessage simpleMessage) throws MailException; void send(SimpleMailMessage[] simpleMessages) throws MailException; }
- MailSender 인터페이스를 상속받은 JavaMailSender는 Java Mail API의 MimeMessage를 이용해서 메일을 발송하는 추가적인 기능 정의
package org.springframework.mail.javamail; import java.io.InputStream; import javax.mail.internet.MimeMessage; import org.springframework.mail.MailException; import org.springframework.mail.MailSender; public interface JavaMailSender extends MailSender { MimeMessage createMimeMessage(); MimeMessage createMimeMessage(InputStream contentStream) throws MailException; void send(MimeMessage mimeMessage) throws MailException; void send(MimeMessage[] mimeMessages) throws MailException; void send(MimeMessagePreparator mimeMessagePreparator) throws MailException; void send(MimeMessagePreparator[] mimeMessagePreparators) throws MailException; }
- MailException은 RuntimeException이므로 예외 처리가 필요한 경우에 처리
- JavaMailSender 인터페이스의 구현체로 JavaMailSenderImpl 클래스를 제공
1.1. JavaMailSender 빈 설정
- JavaMailSenderImpl 클래스는 Java Mail API를 이용, SMTP 프로토콜 사용
- SMTP 서버 주소와 포트 번호 필요
- host 프로퍼티 : 서버 주소
- port 프로퍼티 : 포트 번호, 기본 값 25
- defalutEncoding 프로퍼티 : 기본 인코딩 설정
- username 프로퍼티 : 인증을 위한 사용자명
- password 프로퍼티 : 인증을 위한 사용자 비밀번호
1.2. SimpleMailmessage 이용 메일 발송
- 단순 텍스트 구성 메일 메시지 생성할 때 이용
메서드 |
설명 |
setFrom(String from) |
발신자 설정 |
setReplyTo(String replyTo) |
응답 주소 설정 |
setTo(String to) |
수신자 설정 |
setTo(String[] to) |
수신자 목록 설정 |
setCc(String cc) |
참조자 설정 |
setCc(String[] cc) |
참조자 목록 설정 |
setBcc(String bcc) |
숨은 참조자 설정 |
setBcc(String[] bcc) |
숨은 참조자 목록 설정 |
setSentDate(Date sentDate) |
메일 발송일 설정 |
setSubject(String subject) |
메일 제목 설정 |
setText(String text) |
메일 내용 설정 |
// Member.java package com.tistory.gangzzang; public class Member { private String id; private String name; private String email; public Member() { super(); } public Member(String id, String name, String email) { super(); this.id = id; this.name = name; this.email = email; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } } // Member
// SendMailService.java package com.tistory.gangzzang; public interface SendMailService { public void sendEmail(Member member); } // SendMailService
// SimpleMailMessageTest.java package com.tistory.gangzzang; import org.springframework.mail.MailException; import org.springframework.mail.MailSender; import org.springframework.mail.SimpleMailMessage; public class SimpleMailMessageTest implements SendMailService { private MailSender mailSender; public void setMailSender(MailSender mailSender) { this.mailSender = mailSender; } @Override public void sendEmail(Member member) { SimpleMailMessage message = new SimpleMailMessage(); message.setSubject("[공지] 회원 가입 안내"); message.setText("회원 가입을 축하합니다."); message.setFrom("kyung_ho@naver.com"); message.setTo(member.getEmail()); try { mailSender.send(message); } catch (MailException e) { e.printStackTrace(); } } // sendEmail } // SimpleMailMessageTest
1.3. SimpleMailmessage 재사용
- SimpleMailMessage 클래스는 다른 SimpleMailMessage 클래스로부터 내용을 복사해서 사용하는 기능을 제공
- 생성자를 통해 객체를 전달하면 설정 정보를 모두 복사
- simpleMailMessage를 스프링 설정파일에서 설정하고 필요로 하는 빈에서 재사용 가능
// SimpleMailMessageTest2.java package com.tistory.gangzzang; import org.springframework.mail.MailException; import org.springframework.mail.MailSender; import org.springframework.mail.SimpleMailMessage; public class SimpleMailMessageTest2 implements SendMailService { private MailSender mailSender; private SimpleMailMessage templateMailMessage; public void setMailSender(MailSender mailSender) { this.mailSender = mailSender; } public void setTemplateMailMessage(SimpleMailMessage templateMailMessage) { this.templateMailMessage = templateMailMessage; } @Override public void sendEmail(Member member) { SimpleMailMessage message = new SimpleMailMessage(templateMailMessage); message.setText("회원 가입을 축하합니다."); message.setTo(member.getEmail()); try { mailSender.send(message); } catch (MailException e) { e.printStackTrace(); } } // sendEmail } // SimpleMailMessageTest2
1.4. Java Mail API - MimeMessage 이용 메시지 생성
- 파일 첨부 또는 HTML로 구성되어 있는 경우 MimeMessage를 이용
- JavaMailSender 인터페이스는 MimeMessage 객체를 생성해주는 createMimeMessage() 메서드를 제공
- 이 메서드가 리턴한 MimeMessage 객체를 이용해서 메시지를 구성한 뒤 메일 발송
// MimeMessageTest.java package com.tistory.gangzzang; import javax.mail.MessagingException; import javax.mail.Message.RecipientType; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import org.springframework.mail.MailException; import org.springframework.mail.javamail.JavaMailSender; public class MimeMessageTest implements SendMailService { private JavaMailSender mailSender; public void setMailSender(JavaMailSender mailSender) { this.mailSender = mailSender; } @Override public void sendEmail(Member member) { MimeMessage message = mailSender.createMimeMessage(); try { message.setSubject("[공지] 회원 가입 안내", "UTF-8"); String htmlContent = "안녕하세요, 반갑습니다."; message.setText(htmlContent, "UTF-8", "html"); message.setFrom(new InternetAddress("gz.kyungho@gmail.com")); message.addRecipient(RecipientType.TO, new InternetAddress(member.getEmail())); mailSender.send(message); } catch (MessagingException e) { e.printStackTrace(); return; } catch (MailException e) { e.printStackTrace(); return; } // try - catch } } // MimeMessageTest
2. MimeMessageHelper 이용 파일 첨부
- MimeMessage를 이용하여 파일 첨부를 할 수 있지만 복잡하므로, 스프링이 제공하는 MimeMessageHelper 클래스를 사용
2.1. MimeMessageHelper 이용 첨부 파일 추가
- 생성자의 첫번째 파라미터는 메일 메시지를 구성할 때 사용 될 MimeMessage 객체를 전달
- 두번째 파라미터는 MultiPart 여부를 설정 (true 이면 첨부 파일 추가)
- 파일 정보를 제공할 javax.activation.DataSource를 생성
- FileDataSource 클래스를 사용, MimeMessageHelper.addAttachment() 메서드로 파일을 메일에 첨부
- MimeUtilty 클래스는 Java Mail API에서 제공하는 클래스, ASCII 이외의 문자로 구성된 문장을 알맞게 인코딩
// MimeMessageHelperFileTest.java package com.tistory.gangzzang; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeUtility; import org.springframework.mail.MailException; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; public class MimeMessageHelperFileTest implements SendMailService { private JavaMailSender mailSender; public void setMailSender(JavaMailSender mailSender) { this.mailSender = mailSender; } @Override public void sendEmail(Member member) { MimeMessage message = mailSender.createMimeMessage(); try { MimeMessageHelper messageHelper = new MimeMessageHelper(message, true, "UTF-8"); messageHelper.setSubject("[공지] 회원 가입 안내"); String htmlContent = "안녕하세요, 반갑습니다."; messageHelper.setText(htmlContent, true); messageHelper.setFrom("gz.kyungho@gmail.com", "갱짱"); messageHelper.setTo(new InternetAddress(member.getEmail(), member.getName(), "UTF-8")); DataSource dataSource = new FileDataSource("c:\\책목록.xlsx"); messageHelper.addAttachment(MimeUtility.encodeText("책목록.xlsx", "UTF-8", "B"), dataSource); mailSender.send(message); } catch (MailException e) { e.printStackTrace(); return; } catch (Throwable e) { e.printStackTrace(); return; } } } // MimeMessageHelperFileTest
2.2. MimeMessageHelper 이용 인라인 자원 추가
- MimeMessageHelper.addInline() 메서드를 사용, 메일 내용에 이미지나 파일 등을 삽입
- setText() 메서드를 호출한 이후, addInline() 메서드를 호출
// MimeMessageInlineTest.java package com.tistory.gangzzang; import javax.activation.FileDataSource; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import org.springframework.mail.MailException; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; public class MimeMessageInlineTest implements SendMailService { private JavaMailSender mailSender; public void setMailSender(JavaMailSender mailSender) { this.mailSender = mailSender; } @Override public void sendEmail(Member member) { MimeMessage message = mailSender.createMimeMessage(); try { MimeMessageHelper messageHelper = new MimeMessageHelper(message, true, "UTF-8"); messageHelper.setSubject("[공지] 회원 가입 안내"); String htmlContent = "안녕하세요, 반갑습니다." + ""; messageHelper.setText(htmlContent, true); messageHelper.setFrom("gz.kyungho@gmail.com", "갱짱"); messageHelper.setTo(new InternetAddress(member.getEmail(), member.getName(), "UTF-8")); messageHelper.addInline("abc", new FileDataSource("abc.jpg")); mailSender.send(message); } catch (MailException e) { e.printStackTrace(); return; } catch (Throwable e) { e.printStackTrace(); return; } } } // MimeMessageInlineTest
'Web > Spring' 카테고리의 다른 글
스프링(Spring) MVC 프레임워크(Model View Controller Framework) (17) | 2013.11.06 |
---|---|
스프링(Spring) DI(Dependency Injection) - #2 (0) | 2013.11.02 |
스프링(Spring) DI(Dependency Injection) - #1 (0) | 2013.10.30 |
스프링(Spring) IoC 컨테이너(Inversion of Control Container) (0) | 2013.10.30 |
스프링(Spring) 파일 다운로드(File Download) (6) | 2013.10.23 |