본문 바로가기

Java Mail/Paran SMTP

JavaMail with Paran.com SMTP example

paran.com의 안내문에 따르면 다음과 같이 SMTP서버를 공개한다고 공지하고 있다.

안녕하세요. 파란메일 담당자입니다.

이용자 분들께 보다 많은 혜택을 드리고자, 기존 프리미엄 메일 사용자에게만 제공되던
POP3/SMTP 서비스를 전체 사용자 대상으로 무료 제공하게 되었습니다.
* 무료화 적용 : 2010년 2월 11일(목) 오전 11시 기준

POP3/SMTP 서비스란?
    웹 브라우저에 접속하지 않고, 모바일기기(아이폰,스마트폰 등) / 아웃룩과
    같은 PC 메일프로그램 등에서 파란메일을 확인하실 수 있습니다.
 
POP3/SMTP 설정 방법 안내  자세히보기
 
     * POP 서버명 (호스트 이름) : pop3.paran.com
     * POP 포트번호 : 110,  SSL 사용 안함
     * 아이디 (사용자 이름) : 사용자ID@paran.com
     * 암호 : 파란 로그인 비밀번호
 
     * SMTP 서버명 (호스트 이름) : smtpauth.paran.com
     * SMTP 포트번호 : 25, SSL 사용 안함
     * 아이디 (사용자 이름) : 사용자ID@paran.com
     * 암호 : 파란 로그인 비밀번호


JavaMail API 를 이용하면 PARAN.COM에서 공개한 SMTP서버를 경유하여 목적지에 메일을 전송할 수 있다.
여기에서는 일반 텍스트 메일, HTML 메일, HTML을 이용한 이미지출력 메일, 첨부된 이미지 파일을 화면에 출력해 주는 메일, 텍스트 내용에 첨부파일이 있는 메일 등을 테스트한다.
JavaMail 1.4.3:http://java.sun.com/products/javamail/downloads/index.html 


압축파일을 해제하고 mail.jar 를 찾아서 Eclipse Java Project의 Build Path...에서 라이브러리에 포함해 주고 아래의 코드를 테스트한다.

일반 텍스트를 전달하는 메일예제
package paranmail;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import java.io.*;
import java.util.*;
import java.security.Security;

public class ParanSMTP
{
 public static void main(String[] args)
 {
  Properties p = new Properties();
  p.put("mail.smtp.user", "id@paran.com"); // paran.com계정@paran.com으로 설정, 수신측에서는 송신자주소로 보임
  p.put("mail.smtp.host", "smtpauth.paran.com");
  p.put("mail.smtp.port", "25");
  p.put("mail.smtp.starttls.enable","true");
  p.put( "mail.smtp.auth", "true");
  p.put("mail.smtp.debug", "true");
 
  /* GMail SMTP는 SSL를 사용할 때는 다음 3라인을 사용하고,
   * PARAN.COM은 SSL을 사용하지 않는다고 공지하고 있기때문에 주석처리 */
  //p.put("mail.smtp.socketFactory.port", "465");
  //p.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
  //p.put("mail.smtp.socketFactory.fallback", "false");
  try {
   Authenticator auth = new SMTPAuthenticator();
   Session session = Session.getInstance(p, auth);
   session.setDebug(true);
   //session = Session.getDefaultInstance(p);
   MimeMessage msg = new MimeMessage(session);
   msg.setSubject("PARAN.COM SMTP 서버를 이용한 JavaMail 테스트");

   Address fromAddr = new InternetAddress("id@paran.com"); // 보내는 사람의 메일주소
   msg.setFrom(fromAddr);

   Address toAddr = new InternetAddress("id@gmail.com");  // 받는 사람의 메일주소
   msg.addRecipient(Message.RecipientType.TO, toAddr);

   String message = "PARAN.COM SMTP 서버를 이용한 JavaMail 테스트";
   msg.setContent(message, "text/plain;charset=KSC5601");

   System.out.println("Message: " + msg.getContent());
   Transport.send(msg);
   System.out.println("PARAN.COM SMTP서버를 이용한 메일보내기 성공");
  }
  catch (Exception mex) { // 메일전송시 오류가 발생한 경우
   System.out.println("메일전송 오류 ");
   mex.printStackTrace();
  }
 }
 private static class SMTPAuthenticator extends javax.mail.Authenticator {
  public PasswordAuthentication getPasswordAuthentication() {
   return new PasswordAuthentication("paran.com의 아이디@paran.com", "paran.com암호"); // paran.com id, pwd
  }
 }
}


수신자에게 HTML  메시지 보내기


HTML포맷된 메시지를 전송하려면 아래와 같이 단지 "text/html;charset=KSC5601" 과 같이 설정해주면 된다.
예를 들어, HTML 메시지에 이미지도 보이게 하려면 다음과 같이 작성하면 된다.

String message = "<font color=\"blue\">남아프리카 공화국의 TableMountain과 석양</font><p/>";
message += "<img src=\"http://photosbymartin.com/images/pcd0365/table-mountain-sunset1-42.3.jpg\"/>";
msg.setContent(message, "text/html;charset=KSC5601");


첨부파일에 이미지를 포함하고 수신자의 화면에 그 이미지를 출력하는 예

만약 위의 방법으로 수신자에게 이미지를 보여줄 수 없다면 이 방법을 사용하면 된다.
수신자에게 보여주고자 하는 이미지를 첨부파일로 첨부하면서 이용자의 화면에 첨부된 이미지 파일을 출력하는 방법이다.
package paranmail;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import java.io.*;
import java.util.*;
import java.security.Security;

public class ParanSMTP
{
 public static void main(String[] args)
 {
  Properties p = new Properties();
  p.put("mail.smtp.user", "cwisky@paran.com"); // paran.com계정@gmail.com으로 설정, 수신측에서는 송신자주소로 보임
  p.put("mail.smtp.host", "smtpauth.paran.com");
  p.put("mail.smtp.port", "25");
  p.put("mail.smtp.starttls.enable","true");
  p.put( "mail.smtp.auth", "true");
  p.put("mail.smtp.debug", "true");
 
  /* GMail SMTP는 SSL를 사용할 때는 다음 3라인을 사용하고,
   * PARAN.COM은 SSL을 사용하지 않는다고 공지하고 있기때문에 주석처리 */
  //p.put("mail.smtp.socketFactory.port", "465");
  //p.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
  //p.put("mail.smtp.socketFactory.fallback", "false");
  try {
   Authenticator auth = new SMTPAuthenticator();
   Session session = Session.getInstance(p, auth);
   session.setDebug(true);

   MimeMessage msg = new MimeMessage(session);

   msg.setSubject("PARAN.COM SMTP 서버를 이용한 JavaMail 테스트");

   Address fromAddr = new InternetAddress("cwisky@paran.com"); // 보내는 사람의 메일주소
   msg.setFrom(fromAddr);

   Address toAddr = new InternetAddress("cwisky@paran.com");  // 받는 사람의 메일주소
   msg.addRecipient(Message.RecipientType.TO, toAddr);

   MimeMultipart multipart = new MimeMultipart();
  
   MimeBodyPart msgPart = new MimeBodyPart();
   String htmlMsg = "<H3>남아프리카공화국 테이블마운틴의 석양</H3><img src=\"cid:my-image\">";
   msgPart.setContent(htmlMsg, "text/html;charset=euc-kr");
   multipart.addBodyPart(msgPart);
  
   MimeBodyPart attachPart = new MimeBodyPart();
   DataSource fds = new FileDataSource("d:/images/table-mountain-sunset.jpg");
   attachPart.setDataHandler(new DataHandler(fds));
   attachPart.setHeader("Content-ID","<my-image>");

   multipart.addBodyPart(attachPart);

   msg.setContent(multipart);
   Transport.send(msg);

   System.out.println("PARAN.COM SMTP서버를 이용한 메일보내기 성공");
  }
  catch (Exception mex) {
   System.out.println("메일전송 오류 ");
   mex.printStackTrace();
  }
 }
 private static class SMTPAuthenticator extends javax.mail.Authenticator {
  public PasswordAuthentication getPasswordAuthentication() {
   return new PasswordAuthentication("paran.com의 아이디@paran.com", "paran.com의 암호"); // paran.com id, pwd
  }
 }
}



파일첨부의 예 (첨부된 이미지를 화면에 보여주지 않고 그냥 첨부한 상태로 수신자에게 전달하는 예)
package paranmail;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import java.io.*;
import java.util.*;
import java.security.Security;

public class ParanSMTP
{
 public static void main(String[] args)
 {
  Properties p = new Properties();
  p.put("mail.smtp.user", "cwisky@paran.com"); // paran.com계정@gmail.com으로 설정, 수신측에서는 송신자주소로 보임
  p.put("mail.smtp.host", "smtpauth.paran.com");
  p.put("mail.smtp.port", "25");
  p.put("mail.smtp.starttls.enable","true");
  p.put( "mail.smtp.auth", "true");
  p.put("mail.smtp.debug", "true");
 
  /* GMail SMTP는 SSL를 사용할 때는 다음 3라인을 사용하고,
   * PARAN.COM은 SSL을 사용하지 않는다고 공지하고 있기때문에 주석처리 */
  //p.put("mail.smtp.socketFactory.port", "465");
  //p.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
  //p.put("mail.smtp.socketFactory.fallback", "false");
  try {
   Authenticator auth = new SMTPAuthenticator();
   Session session = Session.getInstance(p, auth);
   session.setDebug(true);

   MimeMessage msg = new MimeMessage(session);

   msg.setSubject("PARAN.COM SMTP 서버를 이용한 JavaMail 테스트");

   Address fromAddr = new InternetAddress("cwisky@paran.com"); // 보내는 사람의 메일주소
   msg.setFrom(fromAddr);

   Address toAddr = new InternetAddress("cwisky@paran.com");  // 받는 사람의 메일주소
   msg.addRecipient(Message.RecipientType.TO, toAddr);

   MimeMultipart multipart = new MimeMultipart();
  
   MimeBodyPart msgPart = new MimeBodyPart();
   String htmlMsg = "<H3>남아프리카공화국 테이블마운틴의 석양</H3>첨부참조<br/>";
   msgPart.setContent(htmlMsg, "text/html;charset=euc-kr");

   multipart.addBodyPart(msgPart);
  
   MimeBodyPart attachPart = new MimeBodyPart();
   DataSource fds = new FileDataSource("d:/images/테이블마운틴석양.jpg");
   attachPart.setDataHandler(new DataHandler(fds));
   /* 첨부파일을 수신자 화면에 출력하지 않고 그냥 첨부하려면 다음 라인을 주석처리한다 */
   //attachPart.setHeader("Content-ID","<my-image>");

  
   /* 한글파일명은 영문으로 인코딩하여 첨부해야 한다 */
   String filename = "테이블마운틴석양.jpg";
   filename = new String(filename.getBytes("euc-kr"), "8859_1");
   attachPart.setFileName(filename);
  
   multipart.addBodyPart(attachPart);

   msg.setContent(multipart);

   Transport.send(msg);

   System.out.println("PARAN.COM SMTP서버를 이용한 메일보내기 성공");
  }
  catch (Exception mex) {
   System.out.println("메일전송 오류 ");
   mex.printStackTrace();
  }
 }
 private static class SMTPAuthenticator extends javax.mail.Authenticator {
  public PasswordAuthentication getPasswordAuthentication() {
   return new PasswordAuthentication("paran.com의 아이디@paran.com", "paran.com의 암호"); // paran.com id, pwd
  }
 }
}