구글에서 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 */
/* ============================= */
<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); } } }); } }
'안드로이드 개발' 카테고리의 다른 글
안드로이드에서 단위테스트를 위한 Junit 사용하기 (1) (5) | 2010.08.07 |
---|---|
안드로이드에서 단위테스트를 위한 Junit 사용하기 (2) (0) | 2010.08.07 |
안드로이드에서 단위테스트를 위한 Junit 사용하기 (1) (1) | 2010.08.07 |
안드로이드 (android) 플러그인과 SDK 가 업데이트 에러 날 때 (1) | 2010.08.04 |
Android(안드로이드) 에서 터치이벤트와 트랙볼 이벤트 처리 (7) | 2010.08.02 |
안드로이드 SDK 버전에 따른 전세계 사용자 분석(2.1 사용자 4/1 이상) (0) | 2010.08.02 |
안드로이드(Android) - 저장된 이미지를 불러와 갤러리 기능 구현 (84) | 2010.08.02 |
안드로이드 OS VMWare 설치하기 (8) | 2010.08.02 |