본문 바로가기
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/

반응형

'Dev > ETC' 카테고리의 다른 글

My Sql 계정 생성 방법 및 1045 오류  (0) 2009.04.06
메일 Open 확인  (0) 2008.12.24
PDA에서 PDF파일 보기  (0) 2008.11.24
이클립스 단축키  (0) 2008.11.23
CMMI  (0) 2008.09.10