Dev/ETC
Java 메일 보내기
by nakanara
2008. 12. 23.
Java에서 메일 보내는 기능이 필요하여 작성하게 되었습니다. 소스 파일은 따로 파일 첨부를 하겠습니다. 그 외 제가 기억할 수 있도록 간단한 주석 및 설명을 적어 두려고 합니다.
※ SMTP메일 서버가 존재하여야 합니다. 윈도우의 경우 IIS의 SMTP를 설치하셔도 무방합니다.
자바로 메일을 보내려면 우선 다음의 라이브러리가 필요합니다. 다운을 내려 받아서 경로(Path)를 잡아 주셔야 합니다.
JavaBeans Activation Framework JAF [다운받기]
JavaMail JavaMail [다운받기]
압축을 풀면 여러 개의 *.jar 파일이 보이는데 그 중 activation.jar, mailapi.jar, smtp.jar 파일을 필요합니다. 이 두 파일을 소스를 개발할 때 편한 곳으로 복사하신 후 (저는 보통 java 설치 폴더의 lib 에 넣어 둡니다. 다른 곳에 둘 경우 JAVAHOME 경로 설정을 잡듯이 경로를 잡아 주셔야 합니다.)
SendMail.java – 메일 작성 및 전송 |
import java.io.UnsupportedEncodingException; import java.util.Date; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeUtility; public class SendMail { private String mailHost = "127.0.0.1"; // Smtp 호스트 주소 (메일 보내려는 Host 주소) private String mailAccId = "admin"; // 로그인 ID private String mailAccPwd = "1234"; // pass private String sendMailAdd = nakanara@naver.com; // 보내는 메일 주소. /** * @param mailTo 보낼 사용자 * @param mailSubject 제목 * @param mailContent 내용. * @param addFileNm 첨부 파일 list (없을 경우 null) */ public void send(String mailTo, String mailSubject, String mailContent, String[] addFileNm){ // smtp 서버 인증해야 할 경우 Authenticator auth = new MailAuth(mailAccId, mailAccPwd); Properties props = new Properties(); props.put("mail.smtp.host", mailHost); // smtp host 설정. props.put("mail.smtp.auth", "true"); // 인증을 요하는 경우. Session session = Session.getInstance(props, auth); // 인증 // Session session = Session.getInstance(props, null); // 인증 안 할 경우 // 필요할 경우 true로 설정 debug session.setDebug(false); // 기본 false // 메세지 만들기.. try { // 메세지 생성. MimeMessage msg = new MimeMessage(session); // 보내는 사용 msg.setFrom(new InternetAddress(sendMailAdd, sendMailAdd)); //msg.setHeader("content-type", "text/html;charset=utf-8"); msg.setHeader("content-type", "text/html;charset=euc-kr"); // 받는 사람 구분은 < 구분 자는 , > InternetAddress[] toAddress = InternetAddress.parse(mailTo); msg.setRecipients(Message.RecipientType.TO, toAddress); msg.setSubject(mailSubject, "EUC-KR"); msg.setSentDate(new Date()); MimeMultipart mp = new MimeMultipart(); //++ 내용 MimeBodyPart mbp1 = new MimeBodyPart(); mbp1.setContent(mailContent, "text/html; charset=euc-kr"); mp.addBodyPart(mbp1); //—내용 /** * 첨부 파일이 존재할 경우 첨부 파일 추가. * *.txt 파일일 경우 문제 발생. */ if ((addFileNm != null) && (addFileNm.length > 0)) { if (!addFileList(mp, addFileNm)) { System.out.println("첨부 파일 error"); } } msg.setContent(mp); Transport transport = session.getTransport("smtp"); Transport.send(msg); // 메일 전송 transport.close(); } catch (Exception e) { e.printStackTrace(); } return; } |
MailAuth.java - 메일 서버 인증. |
import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; public class MailAuth extends Authenticator { private PasswordAuthentication pa; public MailAuth(String id, String pwd){ // 로그인 시 사용할 ID, 패스 워드 pa = new PasswordAuthentication(id, pwd); } // 아래의 메소드는 시스템 측에서 사용하는 메소드이며 // 패스 워드 인증이 필요한 경우 호출 됩니다. public PasswordAuthentication getPasswordAuthentication() { return pa; } } |
※ 테스트를 하던 중 첨부 파일에 *.txt가 포함 될 경우 메일 내용이 사라지고
*.txt의 내용이 메세지 내용으로 나타나는 현상이 발생하였습니다.
오류를 잡으려고 했는데 다른 일이 있어서 우선 그 부분은 잡지 못하였습니다. 해결 방안이나 이 소스의 잘못된 점 지적해 주시면 감사하겠습니다.
글 작성시 참고한 글 (감사합니다.)
1. http://okjsp.pe.kr/lecture/lec02/javamail01.htm
2. http://java.sun.com/javase/technologies/desktop/javabeans/glasgow/jaf.html
3. http://java.sun.com/products/javamail/index.jsp
4. http://java.sun.com/reference/api/