구글에서 GMail 계정을 이용해 SMTP 로 안드로이드 메일보내기

 

개발환경 : JDK 1.5, eclipse-Galieo, window XP, Google APIs 2.1

 

구글의 GMail POP3, IMAP, SMTP 를 지원한다. POP3 가 된다는 말은 클라이언트에서

메일을 읽어올수 있으며, SMTP 를 사용하여 메일을 보낼수 있다. 그래서 아래에 설명될

안드로이드에서 메일을 보내기는 GMail SMTP 를 이용해 보내는 예제이다.

 

전제조건이 있다. 먼저 GMail 계정이 있어야 한다. 가입하고 등록된 계정으로 테스트

하도록 한다. 그리고 메일보내기 기능은 안드로이드 SDK 로는 해결이 안되므로 필요한

3가지 jar 파일이 필요하다.

 

1. 자바메일을 보내기 위한 jar 다운로드와 패스설정

 

위에서 말했듯이 기본적으로 제공되는 jar 에서는 메일 보내기를 할수 없다.

그래서 다음 3가지를 다운받아야 한다.

Download them from :

http://javamail-android.googlecode.com/files/mail.jar

http://javamail-android.googlecode.com/files/activation.jar

http://javamail-android.googlecode.com/files/additionnal.jar

 

다운받은 파일을 프로젝트내에 적당한 폴더를 만들고 복사한다.

그리고 Build path 를 걸어주기 위해 eclipse > Preferences > Java Build Path  화면으로

이동한다. Libraries 탭을 클릭해서 화면을 열고 다운받아 복사한 폴더에 있는 3 가지 jar

링크하면 된다. path 를 걸어 주는 방법은 몇가지가 있다. 간단하게 Add External JARS…

메뉴를 통해 바로 파일을 선택하고 링크하는 방법이 있다.

설정이 끝나고 나서 왼쪽 Explorer 창을 보게 되면 Referenced Libraries 폴더가 생긴 것을

볼수 있다. 이것은 외부 라이브러리를 참조하려고 위와 같이 패스를 설정하면 자동으로

생기게 된다. 기본 구글 API 로 해결하지 못하는 기능이나 개발 패키지를 jar로 묶어

사용하고자 할 때 유용하게 쓰일수 있다

Build path 를 설정하는 방법은 이외에도 Add Library.. 버튼을 클릭해 사용자 정의

라이브러리를 등록할수도 있다

2. AndroidManifest.xml permission 등록

 

인터넷사용을 위한 permission android.permission.INTERNET 을 등록한다.

<uses-permission android:name="android.permission.INTERNET" ></uses-permission>

 

3. 간략한 소스 분석

 

메일 소스는 gamil smtp를 이용해 보내기 때문에 gmail 로그인 계정이 필요하다. 이것을

넣는 소스가 있다. 상속받은 javax.mail.Authenticator 클래스의 함수를 오버로딩해서

유저와 패스워드를 셋팅하고 넘겨준다

protected PasswordAuthentication getPasswordAuthentication() {  
        return new PasswordAuthentication(user, password);  
}

클래스는 2개이며 Activity 화면을 구현한 것과 메일 보내기 기능만 있는 클래스 하나다.

일반 java 메일 보내기와 거의 동일하므로 소스 분석하는 일은 그렇게 어렵지 않을 것이다.

아직 다양하게 방법들을 테스트 해보지 않았다. 내가 당장 하고 싶은건 이미지 파일을 동봉해서

보내는 것인데 아직 구현하지 못했다.

 

환경설정을 위한 정보는 Properties 클래스를 사용하였다. 그리고 그 Properties session

에 저장하고 공통적으로 사용한다
Properties props = new Properties();  
props.setProperty("mail.transport.protocol", "smtp");  
props.setProperty("mail.host", mailhost);  
props.put("mail.smtp.auth", "true");  
props.put("mail.smtp.port", "465");  
props.put("mail.smtp.socketFactory.port", "465");

4. 결과 확인

 

Activity 를 실행하고 화면에서 메일 보내기를 클릭한다. 그러면 설정해 놓은 GMail 계정으로

메일을 보냈다.

메일 사이트로 가 결과를 확인한다.

5. 전체 소스


/* ============================= */ 

/*          send_mail.xml          */ 

/* ============================= */

 <?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical" 

    android:layout_width="fill_parent" 

    android:layout_height="fill_parent"  > 

       <TextView   

           android:layout_width="fill_parent"  

           android:layout_height="wrap_content"  

           android:text="안녕하세요 "/>        

     <Button 

        android:id="@+id/send"       

        android:layout_width="wrap_content" 

        android:layout_height="wrap_content" 

        android:layout_gravity="center_horizontal"   

        android:text="메일 보내기" /> 

</LinearLayout> 

 
////    GMailSender.class 
package com.success.sample;

import java.io.ByteArrayInputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.OutputStream;  
import java.security.Security;  
import java.util.Properties;  
  
import javax.activation.DataHandler;  
import javax.activation.DataSource;  
import javax.mail.Message;  
import javax.mail.PasswordAuthentication;  
import javax.mail.Session;  
import javax.mail.Transport;  
import javax.mail.internet.InternetAddress;  
import javax.mail.internet.MimeMessage;  
  
public class GMailSender extends javax.mail.Authenticator {  
    private String mailhost = "smtp.gmail.com";  
    private String user;  
    private String password;  
    private Session session;  
  
    public GMailSender(String user, String password) {  
        this.user = user;  
        this.password = password;  
  
        Properties props = new Properties();  
        props.setProperty("mail.transport.protocol", "smtp");  
        props.setProperty("mail.host", mailhost);  
        props.put("mail.smtp.auth", "true");  
        props.put("mail.smtp.port", "465");  
        props.put("mail.smtp.socketFactory.port", "465");  
        props.put("mail.smtp.socketFactory.class",  
                "javax.net.ssl.SSLSocketFactory");  
        props.put("mail.smtp.socketFactory.fallback", "false");  
        props.setProperty("mail.smtp.quitwait", "false");  
  
        session = Session.getDefaultInstance(props, this);  
    }  

    protected PasswordAuthentication getPasswordAuthentication() {  
        return new PasswordAuthentication(user, password);  
    }  
  
    public synchronized void sendMail(String subject, String body, String sender, String recipients) throws Exception {  
        MimeMessage message = new MimeMessage(session);  
        DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain"));  
        message.setSender(new InternetAddress(sender));  
        message.setSubject(subject);  
        message.setDataHandler(handler);  
        if (recipients.indexOf(',') > 0)  
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients));  
        else  
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));  
        Transport.send(message);  
    }  
  
    public class ByteArrayDataSource implements DataSource {  
        private byte[] data;  
        private String type;  
  
        public ByteArrayDataSource(byte[] data, String type) {  
            super();  
            this.data = data;  
            this.type = type;  
        }  
  
        public ByteArrayDataSource(byte[] data) {  
            super();  
            this.data = data;  
        }  
  
        public void setType(String type) {  
            this.type = type;  
        }  
  
        public String getContentType() {  
            if (type == null)  
                return "application/octet-stream";  
            else  
                return type;  
        }  
  
        public InputStream getInputStream() throws IOException {  
            return new ByteArrayInputStream(data);  
        }  
  
        public String getName() {  
            return "ByteArrayDataSource";  
        }  
  
        public OutputStream getOutputStream() throws IOException {  
            throw new IOException("Not Supported");  
        }  
    }  
}


////////       MailSend.class           

package com.success.sample;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.success.R;
  
public class SendMail extends Activity {  
    /** 
     * Called with the activity is first created. 
     */  
    @Override  
    public void onCreate(Bundle icicle) {  
        super.onCreate(icicle);  
        setContentView(R.layout.send_mail);  
        final Button send = (Button) this.findViewById(R.id.send);  
          
        send.setOnClickListener(new View.OnClickListener() {  
            public void onClick(View view) {  
            GMailSender sender = new GMailSender("id@gmail.com","storm200"); // SUBSTITUTE HERE                    
                try {  
                    sender.sendMail(  
                            "메일제목 !!",   //subject.getText().toString(),   
                            "메일 본문입니다..~~ ",           //body.getText().toString(),   
                            "id@gmail.com",          //from.getText().toString(),  
                            "id@naver.com"            //to.getText().toString()  
                            );  
                } catch (Exception e) {  
                    Log.e("SendMail", e.getMessage(), e);  
                }  
            }  
        });  
    }  
}

Posted by 녹두장군