티스토리 뷰

Java/Util

java mail HTML메일 발송

Mr.Kang 2008. 7. 26. 13:48
JAVAMAIL API를 사용해서 HTML 이메일 보내기
Arpanet이라고 불리우던 인터넷의 초창기시절, 텍스트기반으로 메일을 보내고자 하면 아무 문제 없이 메일을 주고 받을 수 있었다. Arpanet 시절보다 엄청나게 컴퓨터 기술이 발달한 지금, 하지만 여전히 이메일의 주된 내용은 텍스트 기반이다.

텍스트 이메일은 대인관계에서 일어나는 의사소통에 적합하지만 다른 타입의 이메일을 보냄으로써 이득을 얻을 수 있는 경우가 많다. 예를 들면, 잡지 출판사는 HTML형식의 전자잡지를 이메일로 보내고자 할 수 있다. 그렇지만 HTML형식의 컨텐츠를 이메일로 보낼 경우 몇 가지 문제점이 있을 수 있다. 몇몇 웹 기반 이메일 시스템은 이메일을 텍스트 모드로만 보여 줄 수 있다. 따라서 텍스트 기반 클라이언트를 사용해서 이메일을 읽는 많은 사용자에게는 HTML형식의 이메일이 매우 짜증나는 일이 될 수가 있다.

이 글의 첫번째 팁은 사용자의 이메일 클라이언트에 따라서 이메일을 텍스트 혹은 HTML 형식으로 보내기 위해 JavaMail API을 사용하는 방법을 설명한다. 여기서는 사용자가 HTML 형식의 이메일을 사용하기로 가정하고 텍스트 이메일만 사용가능한 사람들을 지원하는 경우를 설명한다.

MIME 과 Multipart Content Type

예전의 Arpanet 이메일의 표준(RFC 822)은 특별히 텍스트 메시지를 위해 디자인되었다. 당시에는 텍스트 이메일만이 사용가능한 타입이었기 때문이다. 하지만 1990년대 초반에 들어와서 기술적 수준이 발달함에 따라 RFC 822의 한계가 명백하게 드러나기 시작했다. 텍스트가 아닌, 다중 형식 이메일에 대한 지원의 필요성이 커지게 된 것이다. 여러 타입의 이메일을 지원하기 위해 인터넷 엔지니어들은 다중목적 인터넷 메일 확장 메커니즘(Multipurpose Internet Mail Extensions mechanism)인 MIME RFC 1341를 만들었다. MIME은 단일 메시지에 하나 이상의 아이템을 전달하기 위해 이메일 메시지 바디를 구성하는 방법을 정의한다. 재미있는 것은 MIME이 본래 이메일을 위해 디자인 된 것임에도 불구하고, 웹 테크놀로지가 미디어 타입을 다루는 방법은 많은 부분이 이 MIME에 기반하고 있다는 것이다. 오리지널 RFC 1341 MIME은 RFCs 2045-2049에 의해 대체되었다.

MIME는 이메일의 컨텐츠 형식을 여러 부분으로 나눔으로써 하나 이상의 아이템을 포함하는 이메일을 구별해낸다. 그리고 여러 형식을 포함하고 있는 메시지 바디를 찾아내어 이들을 나누는 방법을 이메일 클라이언트에게 설명한다. 나뉘어진 부분들은 각각 서로 다른 컨텐츠 형식으로 이루어져 있다.

The Multipart Alternative Content Type

다중형식 이메일은 하나의 이메일에 HTML버전과 텍스트 버전 모두를 포함할 수 있게 한다. 다시 말하면 다중 형식은 HTML과 텍스트 이메일 사용자, 심지어는 오디오 이메일 사용자까지 지원한다는 것이다. 하지만 여러 버전의 이메일을 다루고자 하는 사용자에게도 방법은 있다. 다행스럽게도 MIME의 연구진들은 이 문제를 미리 알고 MIME Content-type multipart/alternative를 만들었다.

multipart/alternative content 타입은 사용자의 이메일 클라이언트에 메시지의 어떤 부분이 alternative버전이라는 것을 말해준다. 이는 이메일 클라이언트가 그것의 특성과 사용자의 선호도에 따라 어떤 버전의 이메일을 디스플레이할 것인지 결정하게 하는 역할을 한다.

하나의 이메일 타입만 볼 수 있다면, 여러 형식의 이메일을 각각의 버전에 맞게 보내는 것이 속도도 느리고 비경제적이지 않은가? 이 물음에 대한 답은 사용자의 환경을 따르는 한 몇 가지 요인에 달려있다. 이메일 커뮤니케이션 시스템을 디자인할 때에는 시스템 로드나 메시지 사이즈 그리고 사용자 커넥션 스피드와 같은 요인들을 기억하고 있는 것이 중요하다. 하지만 이 팁에서는 이와 같은 사실을 이미 고려하고 HTML 이메일을 사용하고자 하는 것으로 가정하고 있다는 것을 기억하자.

이메일을 보낼 때 MIME을 사용하고자 한다면 적어도 2가지 방법이 있다. 첫번째는 RFC 1341를 읽고 프로토콜을 혼자서 구현해보는 것이다. 다른 방법은 JavaMail APIs를 이용해서 자바 플랫폼이 이후의 모든 사항을 처리하도록 하는 것이다.

JavaMail를 사용하여 다중형식 이메일 보내기

이 팁의 샘플 애플리케이션은 지정된 이메일 주소로 multipart/alternative 메시지를 보내고 있다. 이 애플리케이션은 java.util.Properties 파일에 정의된 구성 정보를 이용해서 이메일을 전송한다. JavaMail 인터페이스는 다양한 기능을 갖고 있기 때문에 모든 옵션을 직접 인터페이스에 넣는 것은 대용량의 API를 초래한다. 또한 많은 set 메소드를 호출함으로써 이메일을 설정하는 것은 엄청난 코딩을 처리해야 하는 결과를 낳는다. 때문에 JavaMail디자이너는 파일로부터 읽혀지거나 다른 방법으로 생성되는 Properties 객체를 사용해서 JavaMail을 구성하게 한다.

"샘플코드 실행하기"의 샘플(ttapr2004.jar)을 위한 JAR파일을 다운로드 받고 압축을 푸는 방법에 대한 방법은 다음과 같다.

먼저, Properties 파일(apr2004.props)의 내용을 확인하는데, 이 내용이 바로 프로그램에 입력되는 값을 구성한다. 커멘트 자체가 이를 설명하고 있다.

    # The hostname or IP address of your SMTP server
    mail.smtp.host=smtp.duke.java.sun.com

    # You get lots of debugging information if
    # this is turned on. Comment this line to turn
    # it off.
    mail.debug=true

    # The To email address
    ttapr2004.to=duke@duke.java.sun.com

    # The From email address
    ttapr2004.from=duke@j2ee_fanclub.java.sun.com

    # The subject of the email
    ttapr2004.subject=Declaration of Independence

    # The name of the TEXT file to send
    # This file is included in the distribution
    ttapr2004.txtfile=declaration.txt

    # The name of the HTML file to send
    # This file is included in the distribution
    ttapr2004.htmlfile=declaration.html

사용자의 환경에 적합하도록 Properties 파일내 SMTP 서버의 호스트이름과 IP 주소를 변경한다. 또한 필요하다면 디버그와 라인도 변경한다.

프로그램을 실행하려면 mail.jar(JavaMail), activation.jar(the Java Activation Framework) 라이브러리뿐만 아니라 CLASSPATH내의 JAR 파일 샘플코드를 확인해야 한다. JAR 파일은http://java.sun.com/products/javamail/와 http://java.sun.com/products/javabeans/glasgow/jaf.html에서 다운로드 받을 수 있다. 그리고 나서 인수로 프로퍼티 파일을 사용하여 TwoKindsOfEmail 클래스를 실행시키자.

    $ # Set classpath...
    $ java TwoKindsOfEmail apr2004.props

프로그램은 텍스트와 HTML파일 모두를 포함하는 이메일을 생성하고 이를 '보내는 주소'로 보내게 된다. HTML을 지원하는 이메일 시스템으로 이를 확인하면 HTML로 포맷된 메시지를 보게 될 것이다. 반면 텍스트 기반 이메일 클라이언트에서 확인하면 텍스트만 보게 될 것이다.

부분적이긴 하지만, HTML를 지원하는 이메일 클라이언트에서 보여지는 메시지의 예가 있다.



샘플 코드를 보자. TwoKindsOfEmail 클래스에서 sendmail()메소드가 실질적으로 모든 일을 하고 있다. 코드의 첫부분이 프로퍼티 파일을 로드하고 새로운 MimeMessage를 생성, 초기화한다.

     Properties props = new Properties();
     props.load(new FileInputStream(propfile));

     Session session = Session.getInstance(props, null);
     MimeMessage msg = new MimeMessage(session);

     InternetAddress from =
        new InternetAddress((String)props.get
                 ("ttapr2004.from"));

      InternetAddress to =
         new InternetAddress((String)props.get
                 ("ttapr2004.to"));

      msg.setFrom(from);
      msg.addRecipient(Message.RecipientType.TO, to);
      msg.setSubject((String)props.get
              ("ttapr2004.subject"));

다음 라인은 다중 형식의 메시지를 생성한다. 다중 형식 메시지는 명시적으로 "alternative"라고 표시되어 있다. "alternative"표시가 없다면 HTML이나 텍스트 형식 이메일 모두를 이메일 브라우저에서 볼 수 있다.

    // Create an "Alternative" Multipart message
    Multipart mp = new MimeMultipart("alternative");

코드의 다음 부분은 텍스트 파일을 메모리로 로드한다. 이는 텍스트 파일 컨텐츠로 java.mail.BodyPart 객체를 생성하고 "text/plain"형식의 컨텐츠 타입을 만들어낸다. (이 때 파일의 내용을 읽어들이고, BodyPart 객체를 구성하며 컨텐츠와 컨텐츠 타입을 설정하는 getFileBodyPart() 메소드를 사용하게 된다.)

    // Read text file, load it into a BodyPart, and add it to the
    // message.
    String textfile = (String)props.get
            ("ttapr2004.txtfile");
    BodyPart bp1 = getFileBodyPart
            (textfile, "text/plain");
    mp.addBodyPart(bp1);

다음 코드는 HTML 바디 부분을 위해 동일한 동작을 한다.

    // Do the same with the HTML part
    String htmlfile = (String)props.get
            ("ttapr2004.htmlfile");
    BodyPart bp2 = getFileBodyPart
            (htmlfile, "text/html");
    mp.addBodyPart(bp2);

마지막으로, 이 메소드는 메시지의 내용을 다중형식(multipart) 객체로 설정하고 이를 전송하도록 Transport 객체에 명령한다.

    // Set the content for the message and transmit
    msg.setContent(mp);
    Transport.send(msg);

텍스트 부분이 먼저 설정된다는 것을 기억하자. multipart/alternative를 위한 MIME정의는 덜 복잡한 것에서부터 많이 복잡한 것의 순으로 alternatives의 순서를 정하도록 권장하고 있다. 이러한 변환은 각각의 클라이언트가 alternative 메시지 타입의 리스트를 훑어보고 그 중에서 가장 복잡한 것을 디스플레이하도록 한다. 많은 텍스트기반의 이메일 클라이언트는 multipart/alternative의 첫번째 부분을 보여준다. 간단한 컨텐츠를 먼저 삽입하는 것이 이메일의 수령자가 보다 적합한 형태의 이메일을 받을 수 있도록 한다.

'Java > Util' 카테고리의 다른 글

Java Date 관련 유틸  (0) 2008.07.26
JAXP - SAX와 DOM 파서를 이용한 XML문서 파싱  (0) 2008.07.26
JAVAMAIL로 ssl메일 보내기 1  (0) 2008.07.26
캐릭터셋 확인  (0) 2008.07.26
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함