본문 바로가기
Development/Java

JAVA를 이용한 메일 보내기

by 버들도령 2019. 6. 16.
728x90




[JAVA] [javamail] JAVA를 이용한 메일 보내기

=== 추가 ===
 
보안접속이 필요하지 않은 메일(PlainMailHandler)과 보안접속이 필요한 메일(SecureMailHandler)로 구분하여 처리
 
PlainMailHandler - 사내 메일 테스트 완료
SecureMailHandler - 네이버메일, G메일 테스트 완료
 
 

 
Javamail의 Properties 설정용 정보 => http://www.websina.com/bugzero/kb/javamail-properties.html
 
 
메일전송용 프로토콜은 SMTP이고, 메일 서버에서 메일을 가져오는 프로토콜은 POP과 IMAP로 구분된다.
POP은 메일서버에서 메일을 가져오면서 해당메일을 삭제하고, IMAP은 메일서버에서 메일을 가져오기만 한다.
IMAP은 모바일과 일반 데스크탑 연동을 위해 사용할 수 있다.
 
==========
 
일단 메일을 보내기 위해서는 SMTP 를 구현해야 한다.
 
일단 오라클에서 제공하는 API를 이용하면 간단하게 구현이 가능하다.
 
JavaMail API 다운로드 : http://www.oracle.com/technetwork/java/index-138643.html
 
보안접속이 필요하지 않은 경우 다음과 같이 API를 이용해서 구현이 가능하다.
 
==== 테스트 예제 ===
 
package sdk.mail;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Properties;
import java.util.StringTokenizer;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
/**
 * 기본적인 메일 전송 
 * UTF-8로 메일을 전송 하므로 한글도 처리 가능
 * 
 * @author sdk
 *
 */
public class PlainMail {
 private String mailServer = null; // E-MAIL 서버 주소
 private Message message = null;  // 보내는 메일 메시지
 
 private String sender = null; // 보내는 사람 이메일 주소
 private String senderNmae = null; // 보내는 사람 표시 이름
 private String subject = null; // 제목
 private String content = null; // 본문
 private String receiver = null; // 받는 사람 리스트
 
 private Address senderAddress = null;  // 보내는 사람 주소
 private Address[] receiverAddress = null; // 받는 사람 주소
 
 public PlainMail() {}
 
 public PlainMail(String mailServer){
  setMailServer(mailServer);
 }
 
 public void SendMail() throws UnsupportedEncodingException, MessagingException
 {
  if(sender == null || subject == null || content == null || receiver == null)
   throw new NullPointerException("sender, subject, content, receiver is null.");
  
  initializeMailServer();
  initializeSender();
  initializeReceiver();
  
  Send();
 }
 
 
 /**
  * 메일 서버 초기화
  * Message 객체 생성
  * 
  */
 private void initializeMailServer(){
  Properties properties = new Properties();
  properties.put("mail.smtp.host", mailServer);
  Session s = Session.getDefaultInstance(properties);
  message = new MimeMessage(s);
 }
 
 
 /**
  * 보내는 사람 초기화
  * 
  * @throws UnsupportedEncodingException 표시 이름이 인식할 수 없는 문자(Base 64 기준)일때 발생
  */
 private void initializeSender() throws UnsupportedEncodingException {
  if(senderNmae == null)  // 보내는 사람 표시 이름을 초기화 하지 않으면 메일주소로 초기화
   senderNmae = sender;
  
  senderAddress = new InternetAddress(sender, MimeUtility.encodeText(senderNmae, "UTF-8", "B")); // 표시 이름은 인코딩해서 표현
 }
 /**
  * 받는 사람 초기화
  * 
  * @throws AddressException 받는 사람이 인식 할 수 없는 이름일 때 발생
  */
 private void initializeReceiver() throws AddressException {
  ArrayList<String> receiverList = new ArrayList<String>();
  StringTokenizer stMailAddress = new StringTokenizer(receiver, ";");
  while (stMailAddress.hasMoreTokens()) {
   receiverList.add(stMailAddress.nextToken());
  }
  
  receiverAddress = new Address[receiverList.size()];
  for (int i = 0; i < receiverList.size(); i++) {
   receiverAddress[i] = new InternetAddress(receiverList.get(i));
  }
 }
 /**
  * 메일 전송
  * 
  * @throws MessagingException 메시지 초기화중 오류 발생
  * @throws UnsupportedEncodingException 메일 제목이 인식할 수 없는 문자일 때 발생
  */
 private void Send() throws MessagingException, UnsupportedEncodingException{
  message.setHeader("content-type", "text/html;charset=UTF-8");
  message.setFrom(senderAddress);
  message.setRecipients(Message.RecipientType.TO, receiverAddress); // 받는 사람 타입 (TO, CC, BCC)
  message.setSubject(MimeUtility.encodeText(subject, "UTF-8", "B"));
  message.setContent(content, "text/html;charset=UTF-8");
  message.setSentDate(new java.util.Date());
  
  Transport.send(message);
 }
 
 /**
  * 메일 서버
  * 
  * @param mailServer
  */
 public void setMailServer(String mailServer){
  this.mailServer = mailServer;
 }
 
 /**
  * 보내는 사람 주소
  * 
  * @param sender
  */
 public void setSender(String sender){
  this.sender = sender;
 }
 
 /**
  * 보내는 사람 표시 이름
  * 
  * @param senderName
  */
 public void setSenderName(String senderName){
  this.senderNmae = senderName;
 }
 
 /**
  * 메일 제목
  * 
  * @param subject
  */
 public void setSubject(String subject){
  this.subject = subject;
 }
 
 /**
  * 메일 내용
  * 
  * @param content
  */
 public void setContent(String content){
  this.content = content;
 }
 
 /**
  * 받는 사람 리스트
  * 세미콜론(';')으로 구분
  * 
  * @param receiver
  */
 public void setReceiver(String receiver){
  this.receiver = receiver;
 }
 
 public static void main(String[] args){
  PlainMail mail = new PlainMail();
  mail.setMailServer("메일 서버 주소");
  mail.setSender("보내는 사람");
  mail.setSenderName("테스터");
  mail.setReceiver("받는 사람");
  mail.setSubject("제목 - 자바메일 테스트");
  mail.setContent("자바메일 테스트용 메일입니다.\nThis is javamail test.\n2010-12-13");
  
  try {
   mail.SendMail();
  } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
  } catch (MessagingException e) {
   e.printStackTrace();
  }
 }
}
728x90

댓글