EJB(xml/mail/jms/jdbc)
2018.04.02 / 02:47

JavaMail API¸¦ ÀÌ¿ëÇÑ ¸ÞÀÏ °¡Á®¿À±â

ÀλçÀ̵åÀÚ¹Ù
Ãßõ ¼ö 267

JavaMail API¸¦ ÀÌ¿ëÇÑ ¸ÞÀÏ °¡Á®¿À±â

http://kwaknu.egloos.com/4989978

JDC Tech Tip "Sending Mail With the JavaMail API¿¡¼­´Â JavaMail API¸¦ ÀÌ¿ëÇÑ SMTP¸¦ ÅëÇØ ¸ÞÀÏÀ» º¸³»´Â ¹æ¹ýÀ» º¸¿©ÁØ´Ù. ÀÌ ÆÁÀº POP / IMAP ¼­¹ö¿¡¼­ ¸ÞÀÏÀ» °¡Á®¿À´Â ¹æ¹ýÀ» º¸¿©ÁÙ °ÍÀÌ´Ù.

¸ÞÀÏÀ» °¡Á®¿À´Â °ÍÀº ¸ÞÀÏÀ» º¸³»´Â °Í°ú ºñ½ÁÇÏ´Ù. ¿¹¸¦ µé¸é, ¸ÞÀÏÀ» º¸³¾ ¶§´Â Session, Message, Address, Transport Ŭ·¡½º¸¦ »ç¿ëÇÑ´Ù. ¸ÞÀÏÀ» °¡Á®¿Ã ¶§µµ °°Àº Session, Message Ŭ·¡½º¸¦ »ç¿ëÇÏÁö¸¸, Folder¿Í Store Ŭ·¡½º¸¦ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. ¸ÞÀÏÀ» °¡Á®¿À·Á¸é ¸ÞÀϼ­¹ö¿¡ Á¢¼ÓÇÏ°í ¸Þ½ÃÁö´Â StoreÀÇ Folder¿¡ ÀúÀåÀÌ µÈ´Ù.

¸ÞÀÏÀ» °¡Á®¿À±â À§ÇÏ¿© óÀ½ ÇÒ ÀÏÀº ¸ÞÀϼ­¹ö¿Í ¿¬°áÀ» ÇÏ´Â °ÍÀε¥, ¸ÞÀÏÀ» º¸³¾ ¶§¿Í °°Àº ¹æ¹ýÀÌ´Ù. ±×·¯³ª Á¢¼ÓÇÏ´Â ¸ÞÀϼ­¹ö´Â ´Ù¸£´Ù. ¸ÞÀÏÀ» º¸³¾ ¶§´Â SMTP(Simple Mail Transfer Protocol)¸¦ Áö¿øÇÏ´Â ¼­¹ö¿¡ ¿¬°áÇØ¾ß ÇÕ´Ï´Ù. SMTP´Â ¸ÞÀÏÀ» º¸³»±â À§ÇÑ ÇÁ·ÎÅäÄÝÀÔ´Ï´Ù. ¸ÞÀÏÀ» °¡Á®¿À±â À§Çؼ­´Â POP3(Post Office Protocol, Version 3)³ª IMAP4(Internet Message Access Protocol, Version 4)¸¦ Áö¿øÇÏ´Â ¼­¹ö¿¡ ¿¬°áÇØ¾ß ÇÑ´Ù. À̵é ÇÁ·ÎÅäÄÝÀº ¸ÞÀÏÀ» °¡Á®¿À±â À§ÇØ ¼³°èµÇ¾ú´Ù. POP3´Â ´Ü¼øÇÑ ÇÁ·ÎÅäÄÝÀÌ´Ù. ¸ÞÀÏÀ» °¡Á®¿Ã ¼ö¸¸ ÀÖ°í »õ·Î¿î ¸ÞÀÏÀ» ±¸º°ÇÒ ¼ö ÀÖ´Â ±â´ÉÀº ¾ø´Ù. ±×¿¡ ºñÇØ IMAPÀº »ó´çÈ÷ º¹ÀâÇÏ´Ù.

Session Ŭ·¡½ºÀÇ getDefaultInstance()³ª getInstance() ¸Þ¼Òµå¸¦ È£ÃâÇؼ­ ¸ÞÀÏ ¼¼¼ÇÀ» °¡Á®¿Ã ¼ö ÀÖ´Ù. getDefaultInstance() ¸Þ¼Òµå¸¦ È£ÃâÇÏ¸é °øÀ¯ ¼¼¼Ç ÀνºÅϽº°¡ ¹ÝȯµÈ´Ù. Áï, ¸Þ¼Òµå¸¦ È£ÃâÇÒ ¶§¸¶´Ù µ¿ÀÏÇÑ ¼¼¼ÇÀÌ ¹ÝȯµÈ´Ù. ¹Ý¸é¿¡ getInstance() ¸Þ¼Òµå¸¦ È£ÃâÇÏ¸é ±×¶§¸¶´Ù »õ·Î¿î ¼¼¼Ç ÀνºÅϽº°¡ ¹ÝȯµÈ´Ù. »õ·Î¿î ¼¼¼ÇÀº ´Ù¸¥ ¾²·¹µå°¡ µ¿½Ã¿¡ °øÀ¯¼¼¼Ç°ú ÀÛ¾÷Çϱ⸦ À§ÇÏÁö ¾ÊÀ» ¶§ »ç¿ëÇϸé À¯¿ëÇÏ´Ù.

¼¼¼ÇÀ» ¾òÀ» ¶§ Properties ÀνºÅϽº¸¦ ¸Þ¼Òµå Àμö·Î ³Ñ°Ü¾ß ÇÑ´Ù. ÀÌ°ÍÀº ¿¬°áÇÏ°íÀÚ ÇÏ´Â ¸ÞÀϼ­¹öÀÇ ¼Ó¼ºÀ» °¡Áö°í ÀÖ´Ù. ¿¬°áÇÏ°íÀÚ ÇÏ´Â ¸ÞÀϼ­¹ö·Î "mail.pop3.host" (¶Ç´Â "mail.imap.host")¸¦ ÁöÁ¤ÇØ¾ß ÇÑ´Ù.(¿¹, pop.example.com)
  // Setup properties
Properties props = System.getProperties();
props.put("mail.pop3.host", host);




¸ÞÀÏÀ» °¡Á®¿Ã ¶§ ¿¬°áÀ» À§ÇÑ ÀÎÁõ°úÁ¤À» °ÅÃÄ¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î »ç¿ëÀÚÀ̸§°ú Æнº¿öµå¸¦ ÀÔ·ÂÇØ¾ß ÇÑ´Ù. JavaMailÀÇ Authenticator Ŭ·¡½º¸¦ È®ÀåÇؼ­ »ç¿ëÇÏ¸é µÈ´Ù. ¿¹·Î PopupAuthenticator Ŭ·¡½º´Â »ç¿ëÀÚÀ̸§°ú Æнº¿öµå¸¦ ÀÔ·ÂÇϱâ À§Çؼ­ SwingÀÇ JOptionPane¸¦ »ç¿ëÇÏ°í ÀÖ´Ù. ÀÌ ¿¹Á¦´Â »ç¿ëÀÚ°¡ ÄÞ¸¶·Î ±¸ºÐµÈ »ç¿ëÀÚÀ̸§°ú Æнº¿öµå¸¦ ÀÔ·ÂÇÏ°Ô µÇ¾î ÀÖ´Ù. getPasswordAuthentication() ¸Þ¼Òµå´Â »ç¿ëÀÚÀ̸§°ú Æнº¿öµå¸¦ ¹ÝȯÇÏ°í ÀÖ´Ù.(Æнº¿öµå ÀÔ·ÂÀ» À§ÇØ JPasswordField¸¦ »ç¿ëÇØ º¸ÀÚ)

import javax.mail.*;
import javax.swing.*;
import java.util.*;

public class PopupAuthenticator 
    extends Authenticator {

  public PasswordAuthentication 
      getPasswordAuthentication() {
    String username, password;

    String result = JOptionPane.showInputDialog(
      "Enter 'username,password'");

    StringTokenizer st = 
      new StringTokenizer(result, ",");
    username = st.nextToken();
    password = st.nextToken();

    return new PasswordAuthentication(
      username, password);
  }
}



Properties¿Í Authenticator¸¦ »ý¼ºÇÑ ÀÌÈÄ ¼¼¼ÇÀ» ¾ò¾î ¿Ã ¼ö ÀÖ´Ù.

// Setup authentication, get session
Authenticator auth = new PopupAuthenticator();
Session session = 
  Session.getDefaultInstance(props, auth);



´ÙÀ½À¸·Î getStore() ¸Þ¼Òµå¸¦ È£ÃâÇؼ­ Store¿¡ ¿¬°áÇÒ ¼ö Àִµ¥, À̶§ "pop3"³ª "imap"°ú °°ÀÌ ÇÁ·ÎÅäÄÝ À̸§À» Àμö·Î ³Ñ°Ü¾ß ÇÑ´Ù. ´ÙÀ½Àº POP3 ¼­¹ö¿¡ ¿¬°áÇÏ´Â ¹æ¹ýÀ» º¸¿©ÁØ´Ù.

// Get the store
Store store = session.getStore("pop3");
store.connect();


StoreÀÇ connect() ¸Þ¼Òµå´Â PopupAuthenticator¸¦ È£ÃâÇÏ°Ô µÈ´Ù. À§Çؼ­ ¾ð±ÞÇßµíÀÌ PopupAuthenticator´Â »ç¿ëÀÚÀ̸§°ú Æнº¿öµå¸¦ ÀԷ¹޴´Ù. ¸¸ÀÏ »ç¿ëÀÚÀ̸§°ú Æнº¿öµå°¡ ¸ÞÀÏ°èÁ¤°ú ÀÏÄ¡ÇÏ¸é ¸ÞÀϼ­¹ö¿Í ¿¬°áÀÌ µÇ°í ¸ÞÀÏÀ» ÀÐÀ» ¼ö ÀÖ´Ù. ¸ðµç ¸ÞÀÏÀº Folder ÀνºÅϽº¿¡ ÀúÀåÀÌ µÇ´Âµ¥ ¸ÞÀÏÀ» Àбâ À§Çؼ­ ¸ÕÀú Folder¿Í ¿¬°áÇØ¾ß ÇÑ´Ù. POP ¸ÞÀÏÀÏ °æ¿ì¿£ ¿ÀÁ÷ ÇÑ°³ÀÇ INBOX¶ó´Â Folder°¡ ÀÖ´Ù. ±×¸®°í, IMAP°æ¿ì¿¡´Â INBOX³ª »ç¿ëÀÚ°¡ ¸¸µç Folder°¡ Á¸ÀçÇÑ´Ù. ¸¸ÀÏ INBOX¿¡¼­ ¸ÞÀÏÀ» ÀÐÀ¸·Á¸é StoreÀÇ getFolder() ¸Þ¼Òµå¸¦ È£ÃâÇؼ­ Folder¿Í ¿¬°áÇÏ¸é µÈ´Ù.
¡¡

// Get folder
Folder folder = store.getFolder("INBOX");


´ÙÀ½À¸·Î open() ¸Þ¼Òµå¸¦ ÀÌ¿ëÇؼ­ Folder¸¦ ¿¬´Ù. Folder¸¦ ¿­ ¶§¿¡´Â Folder.READ_WRITE³ª Folder.READ_ONLY ¸ðµå·Î ¿­ ¼ö ÀÖ´Ù. ¸ÞÀÏÀ» Àб⸸ ÇÒ ¶§´Â Folder.READ_ONLY·Î, »èÁ¦¸¦ ÇÏ°í ½ÍÀ¸¸é Folder.READ_WRITE ¿­¸é µÈ´Ù.
¡¡

folder.open(Folder.READ_ONLY);


Folder¿¡ ¿¬°áµÇ¸é °³°³ÀÇ Message °´Ã¼¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. getMessage() ¸Þ¼Òµå¸¦ È£ÃâÇÔÀ¸·Î½á °³°³ÀÇ Message¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½Àº getMessage() ¸Þ¼Òµå¸¦ ÀÌ¿ëÇؼ­ ¸ðµç Message¿¡ °¡Á®¿À´Â ¿¹Á¦ÀÌ´Ù.
¡¡

// Get directory
Message message[] = folder.getMessages();


Folder Ŭ·¡½ºÀÇ getNewMessageCount() ¸Þ¼Òµå´Â FolderÀÇ »õ·Î¿î ¸Þ½ÃÁö ¼ö¸¦ ¹ÝȯÇÏ´Ù. ±×·¯³ª, POP ¼­¹ö¸¦ »ç¿ëÇÒ °æ¿ì¿¡´Â ÀÌ°ÍÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù. POP¿¡¼­´Â »õ·Î¿î Message °³³äÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù´Â °ÍÀ» ±â¾ïÇÏÀÚ. Message¸¦ °¡Á®¿Ã ¶§ ¸î °¡Áö ¿É¼ÇÀÌ ÀÖ´Ù. ¿¹¸¦ µé¾î getFrom()Àº º¸³½»ç¶÷ÀÇ ¸ÞÀÏÁÖ¼Ò, getSubject()´Â ¸ÞÀÏÀ» Á¦¸ñÀ» °¡Á®¿Ã ¼ö ÀÖ´Ù.
¡¡

// Display from (only first) and subject of messages
for (int i=0, n=message.length; i<n; i++) {
  System.out.println(i + ": " 
    + message[i].getFrom()[0] 
    + "\t" + message[i].getSubject());
}


¸¸ÀÏ ¸Þ½ÃÁö ³»¿ëÀ» º¸·Á¸é getContent() ¸Þ¼Òµå¸¦ »ç¿ëÇÏ¸é µÈ´Ù.
  System.out.println(message[i].getContent());


¶ÇÇÑ, writeTo() ¸Þ¼Òµå¸¦ ÀÌ¿ëÇؼ­ Çì´õ¸¦ Æ÷ÇÔÇÑ Message ³»¿ëÀ» ½ºÆ®¸²À¸·Î ÀúÀåÇÒ ¼ö ÀÖ´Ù. ¸ÞÀÏÀ» ÀÐÀº ÈÄ¿¡ Folder¿Í Store´Â ¹Ýµå½Ã ´Ý¾Æ¾ßÇÑ´Ù. FolderÀÇ °æ¿ì¿¡´Â close()¸¦ È£ÃâÇÒ ¶§ Message¸¦ Áö¿ïÁö ¾È Áö¿ïÁö¸¦ Àμö·Ñ ³Ñ°Ü¾ß ÇÏ°í, StoreÀÇ close()´Â Àμö°¡ ÇÊ¿ä¾ø´Ù.
  // Close connection 
folder.close(false);
store.close();


´ÙÀ½Àº Fetch ÇÁ·Î±×·¥ ÄÚµå·Î À§¿¡¼­ ¼³¸íÇÑ ¸ÞÀÏÀ» °¡Á®¿À´Â ¿¹Á¦ÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥À» ½ÇÇà½ÃÅ°±â À§Çؼ­´Â JavaMail API°¡ ¼³Ä¡µÇ¾î ÀÖ¾î¾ß Çϸç, ¶ÇÇÑ JavaBeansTM Activation Frameworkµµ ¼³Ä¡ÇØ¾ß ÇÑ´Ù. ´Ù¿î·Îµå Á¤º¸´Â ¾Æ·¡¿¡ ÀÖ´Ù. Fetch ÇÁ·Î±×·¥Àº INBOX¿¡ ÀúÀåµÇ¾î ÀÖ´Â ¸Þ½ÃÁöÀÇ ÃÖÃÊ 200ÀÚÀÇ ¹®ÀÚ¸¦ Ãâ·ÂÇÕ´Ï´Ù. ¸¸ÀÏ ¸ÞÀÏ ¼­¹ö°¡ POPÀ» Áö¿øÇÏÁö ¾Ê°í, IMAPÀ» Áö¿øÇϸé Äڵ忡¼­ "pop"À» "imap"À¸·Î ¹Ù²Ù¸é µÈ´Ù. ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇϱâ Àü¿¡ À§¿¡¼­ ¼Ò°³ÇÑ PopupAuthenticator¸¦ ¸ÕÀú ÄÄÆÄÀÏÇÏÀÚ. Ä¿¸Çµå¶óÀο¡¼­ ´ÙÀ½°ú °°ÀÌ Fetch ÇÁ·Î±×·¥À» ½ÇÇàÇÏÀÚ.
¡¡

java Fetch mailserver


¸ÞÀϼ­¹öÀÇ À̸§Àº ´ç½ÅÀÇ ¸ÞÀϼ­¹ö À̸§À¸·Î ¹Ù²ÙÀÚ. ½ÇÇà½ÃŲ ÈÄ »ç¿ëÀÚÀ̸§°ú Æнº¿öµå¸¦ ÀÔ·ÂÇØ¾ß ÇÑ´Ù.
¡¡

import java.io.*;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;

public class Fetch {
  public static void main (String args[]) 
      throws Exception {
    String host = args[0];

    // Get system properties
    Properties props = System.getProperties();
    props.put("mail.pop3.host", host);

    // Setup authentication, get session
    Authenticator auth = new PopupAuthenticator();
    Session session = 
      Session.getDefaultInstance(props, auth);

    // Get the store
    Store store = session.getStore("pop3");
    store.connect();

    // Get folder
    Folder folder = store.getFolder("INBOX");
    folder.open(Folder.READ_ONLY);

    // Get directory
    Message message[] = folder.getMessages();
    for (int i=0, n=message.length; i<n; i++) {

       System.out.println(i + ": " 
         + message[i].getFrom()[0] 
         + "\t" + message[i].getSubject());
       String content = 
         message[i].getContent().toString();
       if (content.length() > 200) {
         content = content.substring(0, 200);
       }
       System.out.print(content);
    }

    // Close connection 
    folder.close(false);
    store.close();
    System.exit(0);
  }
}


ÃֽŹöÀüÀÇ JavaMail API¸¦ JavaMail API page¿¡¼­ ´Ù¿î¹ÞÀ» ¼ö ÀÖ´Ù. JavaMail API¸¦ »ç¿ëÇϱâ À§Çؼ­´Â JavaBeans Activation FrameworkÀÌ ¼³Ä¡µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. JavaBeans Activation FrameworkÀº JavaBeans Activation Framework page¿¡¼­ ´Ù¿î¹ÞÀ» ¼ö ÀÖ´Ù. ¶ÇÇÑ, À̵éÀº Java 2 Platform, Enterprise Edition 1.3 download¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Ù. JavaMail ¼Ò½ºÄÚµå´Â J2EE 1.3 Sun Community Source Licensing (SCSL) program¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ ÄÚµå´Â ÀÌÀü Äڵ忡¼­ ¾à°£ º¯°æµÈ °ÍÀÌ´Ù. ¸¸ÀÏ Authenticator¸¦ »ç¿ëÇÏÁö ¾ÊÀ¸·Á¸é Properties ÁöÁ¤µÇÁö ¾ÊÀº SessionÀ» ¾òÀ¸¸é µÈ´Ù. ±×¸®°í È£½ºÆ®À̸§, »ç¿ëÀÚÀ̸§, Æнº¿öµå¸¦ Àμö·Î Çؼ­ connect() ¸Þ¼Òµå¸¦ È£ÃâÇÏÀÚ. ´ÙÀ½Àº º¯°æµÈ ÄÚµåÀÇ ÀϺÎÀÌ´Ù.
  // Setup empty properties
Properties props = new Properties();

// Get session
Session session = Session.getDefaultInstance(props, null);

// Get the store
Store store = session.getStore("pop3");
store.connect(host, username, password);