package org.fastcatsearch.common; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeUtility; public class EmailSender { ///////////////////////////////////// // START OF PROPERTIES ///////////////////////////////////// public static class MailProperties { protected Properties properties; protected EmailPasswordAuthenticator emailPasswordAuthenticator; public MailProperties() { properties = new Properties(); } public MailProperties(Properties properties){ this.properties = properties; } public void add(String key, String value) { properties.put(key, value); } public Properties properties() { return properties; } public Authenticator authenticator() { return emailPasswordAuthenticator; } public void setAuthentication(String id, String password) { emailPasswordAuthenticator = new EmailPasswordAuthenticator(id, password); } class EmailPasswordAuthenticator extends Authenticator { private String id; private String pw; public EmailPasswordAuthenticator(String id, String pw) { this.id = id; this.pw = pw; } protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(id, pw); } } } public static class GmailProperties extends MailProperties { public GmailProperties(){ this(false); } public GmailProperties(boolean debug) { properties.put("mail.smtp.port", "587"); properties.put("mail.smtp.host", "smtp.gmail.com"); properties.put("mail.smtp.starttls.enable", "true"); properties.put("mail.smtp.auth", "true"); properties.put("mail.smtp.ssl.trust", "smtp.gmail.com"); properties.put("mail.debug", debug); } } // /////////////////////////////////// // END OF PROPERTIES // /////////////////////////////////// private final MailProperties mailProperties; public EmailSender(MailProperties mailProperties) { this.mailProperties = mailProperties; } public void sendHTML(String fromAddress, List<String> recipientToList, String subject, String text) throws IOException { send(fromAddress, recipientToList, null, null, subject, text, "text/html", null); } public void sendText(String fromAddress, List<String> recipientToList, String subject, String text) throws IOException { send(fromAddress, recipientToList, null, null, subject, text, "text/plain", null); } public void send(String fromAddress, List<String> recipientToList, String subject, String text, String mimeType) throws IOException { send(fromAddress, recipientToList, null, null, subject, text, mimeType, null); } public void send(String fromAddress, List<String> recipientToList, List<String> recipientCCList, List<String> recipientBCCList, String subject, String text, String mimeType, List<File> files) throws IOException { Session session = Session.getInstance(mailProperties.properties(), mailProperties.authenticator()); try { MimeMessage msg = new MimeMessage(session); MimeMultipart mmp = new MimeMultipart(); MimeBodyPart mbp = new MimeBodyPart(); mbp.setContent(text, mimeType+";\n\tcharset=\"UTF-8\""); mbp.setHeader("Content-Transfer-Encoding", "base64"); mmp.addBodyPart(mbp); if (files != null) { for (int i = 0; i < files.size(); i++) { mbp = new MimeBodyPart(); File addFile = (File) files.get(i); if (addFile.exists()) { FileDataSource fds = new FileDataSource(addFile); mbp.setDataHandler(new DataHandler(fds)); mbp.setFileName(MimeUtility.encodeText(addFile.getName(), "UTF-8", "Q")); mmp.addBodyPart(mbp); } else { throw new IOException("첨부파일을 찾을 수 없습니다. " + addFile.getAbsolutePath()); } } } msg.setContent(mmp); msg.setFrom(fromAddress); if(recipientToList != null){ for (int i = 0; i < recipientToList.size(); i++) { msg.addRecipients(Message.RecipientType.TO, recipientToList.get(i)); } } if(recipientCCList != null){ for (int i = 0; i < recipientCCList.size(); i++) { msg.addRecipients(Message.RecipientType.CC, recipientCCList.get(i)); } } if(recipientBCCList != null){ for (int i = 0; i < recipientBCCList.size(); i++) { msg.addRecipients(Message.RecipientType.BCC, recipientBCCList.get(i)); } } msg.setSubject(MimeUtility.encodeText(subject, "UTF-8", "Q")); msg.setSentDate(new Date()); Transport.send(msg); } catch (Exception e) { throw new IOException("메일전송실패", e); } } }