레이블이 SMTP인 게시물을 표시합니다. 모든 게시물 표시
레이블이 SMTP인 게시물을 표시합니다. 모든 게시물 표시

2009년 5월 12일 화요일

보안 계정으로 설정된(아이디/패스워드가 있는) SMTP 서버를 이용한 자바메일발송

JavaMail API를 이용하여 메일을 발송하는 예제의 대부분은 SMTP 서버를 통해서 단순하게 메일을 보내는 것이다.
하지만 사내에서 SMTP를 사용하여 메일을 전송하거나, 별도의 서비스를 위해서 SMTP 서버를 사용하는 경우에는 SMTP 서버에 계정을 이용하여 발송하기 때문에 계정에 대한 패스워드가 존재한다. 또한 SMTP 서버를 패스워드 없이 오픈해 놓으면 스팸 메일을 발송하는 원인이 될 수 있다.

그래서 SMTP 서버로 메일을 발송할 때 보안설정이 되어 있는 형태로의 자바메일 발송예제가 필요한 것이다.
다음 두 개의 소스 코드가 존재한다.


[MyAuthenticator.java]
package net.wiseant.mail;

import javax.mail.Authenticator;

/**
 * @author SangHyup LEE
 *
 */
public class MyAuthenticator extends Authenticator {

    private String id;
    private String pw;

    public MyAuthenticator(String id, String pw) {
        this.id = id;
        this.pw = pw;
    }

    protected javax.mail.PasswordAuthentication getPasswordAuthentication() {
        return new javax.mail.PasswordAuthentication(id, pw);
    }

}

소스 코드에서 보는 바와 같이 java mail API의 Authenticator 클래스를 extends 하여 구현한 예제이다. 간략하게 생성자의 인자로 id와 password를 받는다. 그러면 해당 서버의 아이디와 패스워드로 인증된 객체를 생성하는 것이다.

[SMTPTest.java]
/**
 * 
 */
package net.wiseant.mail;

import java.util.Properties;

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.MimeMessage;

/**
 * @author SangHyup LEE
 *
 */
public class SMTPTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String host = "mail.wiseant.net";//smtp 서버
        String subject = "메일제목";
        String content = "메일내용";
        String from = "wiseant@wiseant.net"; //보내는 사람
        String to = "korcslewis@gmail.com";
        
        try{
            // 프로퍼티 값 인스턴스 생성과 기본세션(SMTP 서버 호스트 지정)
            Properties props = new Properties();
            
            props.put("mail.smtp.host", host);
            props.put("mail.smtp.auth", "true");
            
            MyAuthenticator auth = new MyAuthenticator("wiseant@wiseant.net", "password");
            
            Session mailSession = Session.getDefaultInstance(props, auth);
            // sess.getPasswordAuthentication(host);
            
            Message msg = new MimeMessage(mailSession);
            msg.setFrom(new InternetAddress(from));//보내는 사람 설정
            InternetAddress[] address = {new InternetAddress(to)};
            
            msg.setRecipients(Message.RecipientType.TO, address);//받는 사람설정
            
            msg.setSubject(subject);// 제목 설정
            msg.setSentDate(new java.util.Date());// 보내는 날짜 설정
            msg.setContent(content,"text/html;charset=euc-kr"); // 내영 설정 (HTML 형식)
            
            Transport.send(msg); // 메일 보내기
            
            System.out.println("메일 발송을 완료하였습니다.");
        } catch ( MessagingException ex ) {
            System.out.println("mail send error : " + ex.getMessage());
        } catch ( Exception e ) {
            System.out.println("error : " + e.getMessage());
        }
    }

}


SMTPTest.java 코드는 SMTP 서버의 인증후, 실제 메일을 발송하는 예제이다. Java Mail API를 사용하여 보내는 예제와 거의 동일하다. 다만 MyAuthenticator 클래스의 인스턴스를 생성하여 보내고자 하는 SMTP 서버로부터 보안 설정을 확인 후, 수행하는 것이 다를 뿐이다.

2009년 4월 30일 목요일

G-Mail SMTP를 이용한 자바메일 발송

현재 지메일은 POP3, IMAP, SMTP를 지원한다. 때문에 POP3를 이용하여 각 메일 클라이언트를 사용하여 지메일의 메일을 읽어올 수도 있고, SMTP를 사용하여 메일을 보낼 수 있기도 하다. POP3, SMPT등을 기본으로 제공하지 않는 국내 포털들의 메일 계정으로는 많은 일을 하지 못하지만 지메일을 이용해서는 다양한 일을 해 볼 수 있다.

그러면 여기에서는 지메일 SMTP를 이용한 자바 메일 API를 사용하여 메일을 발송해 보자. 여기서 사용되는 소스는 "보안 계정으로 설정된(아이디/패스워드가 있는) SMTP 서버를 이용한 자바메일발송" 글과 동일하게 사용된다. 단지 G-Mail SMTP 설정하는 부분이 다를 뿐이다.

자  이제 G-Mail SMTP를 사용한 자바메일 발송 예제를 살펴보자. 간단한 애플리케이션 형태이다.

/**
 * 
 */
package net.wiseant.mail;

import java.util.Properties;

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.MimeMessage;
import javax.mail.internet.MimeUtility;

/**
 * @author Sang Hyup Lee
 * @version 1.0
 *
 */
public class GMailSender {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        String host = "smtp.gmail.com";//smtp 서버
        String subject = "G-Mail을 이용한 메일발송";
        String from = "gmail-id@gmail.com"; //보내는 메일
        String fromName = "이름";
        String to = "receiver-id@daum.net";
        String content = "G-Mail을 이용한 메일 발송 예제입니다. 감사합니다.";

        try{
            // 프로퍼티 값 인스턴스 생성과 기본세션(SMTP 서버 호스트 지정)
            Properties props = new Properties();
            
            // G-Mail SMTP 사용시
            props.put("mail.smtp.starttls.enable","true");
            props.put("mail.transport.protocol", "smtp");
            props.put("mail.smtp.host", host);
            props.setProperty("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
            props.put("mail.smtp.port", "465");
            // props.put("mail.smtp.user", from);
            props.put("mail.smtp.auth", "true");
            
            MyAuthenticator auth = new MyAuthenticator("gmail-id@gmail.com", "gmail-password");
            
            Session mailSession = Session.getDefaultInstance(props, auth);
            
            Message msg = new MimeMessage(mailSession);
            msg.setFrom(new InternetAddress(from, MimeUtility.encodeText(fromName,"UTF-8","B")));//보내는 사람 설정
            InternetAddress[] address = {new InternetAddress(to)};
            
            msg.setRecipients(Message.RecipientType.TO, address);//받는 사람설정
            
            msg.setSubject(subject);// 제목 설정
            msg.setSentDate(new java.util.Date());// 보내는 날짜 설정
            msg.setContent(content,"text/html;charset=euc-kr"); // 내용 설정 (HTML 형식)
            
            Transport.send(msg); // 메일 보내기
            
            System.out.println("메일 발송을 완료하였습니다.");
        } catch ( MessagingException ex ) {
            System.out.println("mail send error : " + ex.getMessage());
        } catch ( Exception e ) {
            System.out.println("error : " + e.getMessage());
        }
        
    }

}


Properties 클래스의 put 메소드에 들어가는 properties 설정을 G-Mail SMTP에 맞추어주면 된다. 그리고 이전 글에서 살펴본 것처럼 보안계정이 설정된 SMTP 서버를 사용할 경우에는 해당 아이디와 패스워드를 셋팅해 주어야 한다. 따라서 MyAuthenticator 클래스에 아이디와 패스워드를 생성자 properties로 인스턴스를 만들어 사용해 주어야 한다.

MyAuthenticator 클래스도 소스를 살펴보자.

package net.wiseant.mail;

import javax.mail.Authenticator;

/**
 * @author Administrator
 *
 */
public class MyAuthenticator extends Authenticator {

    private String id;
    private String pw;

    public MyAuthenticator(String id, String pw) {
        this.id = id;
        this.pw = pw;
    }

    protected javax.mail.PasswordAuthentication getPasswordAuthentication() {
        return new javax.mail.PasswordAuthentication(id, pw);
    }

}

POP3를 콘솔(명령 프롬프트)에서 확인하는 방법

메일과 관련된 가장 중요한 두 가지의 프로토콜은 POP3와 SMTP이다.
보통 javamail API를 이용하는 경우 보내는 서버인 SMTP만을 이용하는 것이 대부분이다. javamail API를 이용하여 메일을 보내는 것은 다른 세션이나 글을 통해서 알아보면 좋겠다.
여기서는 POP3를 콘솔(윈도우이면 명령 프롬프트) 상에서 커맨드를 통한 간단한 예를 보여주고자 한다.

먼저, POP3의 포트는 110, SMTP 포트는 25라는 것은 기본적으로 알고 있을 필요가 있다. 대부분은 알고 있으리라 생각된다.

다음은 콘솔의 telnet 명령어를 통해서 POP3에 접속하여 로그인 한 후, 메시지의 리스트 갯수를 얻어오는 과정을 설명한 것이다. 참고로 "파란색"은 클라이언트(콘솔)에서 입력하는 것이고 "주황색"은 서버의 응답을 표시한다.

console>telnet mail.wiseant.net 110

그러면 콘솔이 telnet 으로 바뀌면서 다음과 같은 POP3 서버가 보내는 메시지를 볼 수 있다.

+OK Welcome to POP3 Server

즉, 접속은 POP3 서버에 정상적으로 접속을 했다는 말이다. 이제부터 POP3와의 대화를 시도한다고 생각하면 된다.

대화의 첫 시도에서는 사용자 아이디와 패스워드를 입력하여 인증을 받아야 한다.

USER wiseant
+OK
PASS user-password
+OK

해당하는 POP3 서버가 OK 메시지를 보낸 것을 확인할 수 있다. 이제 내 메일 계정의 상태를 알아보자.

STATE
+OK 45 23788250

총 45개의 메시지를 보관하고 있는데, 용량이 23788250 byte 라고 응답한다. 다음은 LIST 명령어를 내려보자.

LIST
+OK 45 messages:
1 134268
2 2522
3 15290277
4 185246
5 64591
6 3425
7 9285
8 1658899
9 4447
10 3107
11 37775
12 11400
13 199801
14 39669
15 4404
16 58860
17 5568
18 6572
19 2532742
20 36726
21 8345
22 485500
23 10774
24 2349
25 919516
26 7470
27 1327001
28 126218
29 19088
30 3028
31 2756
32 3585
33 15647
34 4574
35 2682
36 1383
37 1033
38 2568
39 5214
40 173646
41 158514
42 160119
43 43596
44 13259
45 801

45개의 메시지에 대해서 각각의 용량을 알려준다. 이제 실제로 메시지(메일)의 내용을 살펴보자.

RETR 1
.
..
...
------=_NextPart_000_0003_01C8497C.77820080--

번호에 해당하는 메시지를 쭈욱 보여준다. 그렇다면 삭제는 어떻게 할까? 다음과 같이 해 주면 된다.

DELE 1
+OK message 1 deleted

보통은 메일 클라이언트를 이용하여 POP3 설정을 하여 메일을 읽기 때문에 이와 같은 방법은 잘 사용하지 않는다. command 시대의 전유물이라고 생각하는 경우가 있기도 한데, 메일에 대한 RFC 문서나 메일 솔루션의 개발, 디버깅 시에는 유용한 방법이 될 것이다.