/** * */ package net.agilejava.members.service; import java.security.Security; import java.util.ArrayList; import java.util.List; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.URLName; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import org.springframework.mail.javamail.MimeMessageHelper; import com.sun.mail.smtp.SMTPSSLTransport; import com.sun.net.ssl.internal.ssl.Provider; /** * @author keesun * */ public class GmailSender { private String id; private String password; private String title; private String text; private List emails = new ArrayList(); /** * @param id Gmail 계정(@gmail.com은 제외합니다.) * @param password Gmail 계정 비밀번호 */ public void setAccount(String id, String password) { this.id = id; this.password = password; } /** * @param title 이메일 제목 */ public void setTitle(String title) { this.title = title; } /** * @param text 이메일 본문 */ public void setText(String text) { this.text = text; } /** * @param email 메일을 보낼 이메일 주소 */ public void setEmail(String email) { emails.add(email); } /** * @param emails 메일을 보낼 이메일 주소 리스트 */ public void setEmails(List emails) { this.emails = emails; } /** * 이메일을 보냅니다. */ public void send() { checkSettings(); URLName urln = getUrlName(); Properties props = getProperties(); Authenticator auth = getAutheticator(); Session session = getSession(props, auth); SMTPSSLTransport trans = getSmtpSslTransport(urln, session); try { MimeMessage message = getMimeMessage(session); trans.send(message); trans.close(); } catch (MessagingException e) { e.printStackTrace(); } } /** * @param session session을 사용합니다. * @return MimeMessage를 반환합니다. * @throws MessagingException */ private MimeMessage getMimeMessage(Session session) throws MessagingException { //메시지 설정 MimeMessage message = new MimeMessage(session); MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8"); helper.setSubject(title); helper.setText(text); //받을 사람 설정 InternetAddress[] addressTo = new InternetAddress[emails.size()]; for(int i = 0; i < emails.size() ; i++){ addressTo[i] = new InternetAddress(emails.get(i)); } message.setRecipients(Message.RecipientType.TO, addressTo); return message; } /** * @param urln URLName을 사용합니다. * @param session Session을 사용합니다. * @return SMTPSSLTransport를 반환합니다. */ private SMTPSSLTransport getSmtpSslTransport(URLName urln, Session session) { SMTPSSLTransport trans = new SMTPSSLTransport(session, urln); trans.setStartTLS(true); return trans; } /** * @param props Properties로 SMTP 설정 정보를 받습니다. * @param auth Authenticator로 계정 정보를 받습니다. * @return Session을 반환합니다. */ private Session getSession(Properties props, Authenticator auth) { Session session = Session.getDefaultInstance(props, auth); return session; } /** * @return Authenticator를 반환합니다. */ private Authenticator getAutheticator() { Authenticator auth = new SMTPAuthenticator(); Security.addProvider(new Provider()); return auth; } /** * @return URLName을 반환합니다. */ private URLName getUrlName() { URLName urln = new URLName("smtp", "smtp.gmail.com", 587, "", "", ""); return urln; } /** * @return SMTP 설정 내용(Properties)을 반환합니다. */ private Properties getProperties() { Properties props = new Properties(); props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.starttls.enable","true"); props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.auth", "true"); return props; } /** * 필수 요소가 설정 됐는지 확인합니다. */ private void checkSettings() { if(id == null || password == null) System.out.println("계정 설정이 잘 못 되었습니다."); if(emails.size() == 0) System.out.println("이메일을 보낼 주소를 입력하지 않았습니다."); } private class SMTPAuthenticator extends Authenticator { public PasswordAuthentication getPasswordAuthentication() { String username = "아이디"; String password = "비번"; return new PasswordAuthentication(username, password); } } }