안드로이드에서 앱에 내장되있는 라이브러리 없이 JavaMail API를 사용해서 이메일 보내려면 어떻게 해야하죠?

조회수 5195회

메일 보내주는 앱을 만드려고하는데요.

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 만약 이렇게하면 이건 안드로이드 앱에 내장되있는걸로 메일을 보내게 되는데 이렇게 말고 버튼을 눌렀을 때 바로 메일을 보내게 하려면 어떻게 해야할까요?

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    Gmail authentication의 JavaMail API를 사용하면 안드로이드로 이메일을 보낼수 있습니다.

    아래 예제 코드를 따라해보세요.

    MailSenderActivity.java

    //여기에 프로젝트 패키지 이름 넣으세요
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    
    public class MailSenderActivity extends Activity {
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            final Button send = (Button) this.findViewById(R.id.send);
            send.setOnClickListener(new View.OnClickListener() {
    
                public void onClick(View v) {
                    // TODO Auto-generated method stub
    
                    try {   
                        GMailSender sender = new GMailSender("username@gmail.com", "password");
                        sender.sendMail("This is Subject",   
                                "This is Body",   
                                "user@gmail.com",   
                                "user@yahoo.com");   
                    } catch (Exception e) {   
                        Log.e("SendMail", e.getMessage(), e);   
                    } 
    
                }
            });
    
        }
    }
    

    GMailSender.java

    //여기에 프로젝트 패키지 이름 넣으세요
    
    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;   
    import java.io.ByteArrayInputStream;   
    import java.io.IOException;   
    import java.io.InputStream;   
    import java.io.OutputStream;   
    import java.security.Security;   
    import java.util.Properties;   
    
    public class GMailSender extends javax.mail.Authenticator {   
        private String mailhost = "smtp.gmail.com";   
        private String user;   
        private String password;   
        private Session session;   
    
        static {   
            Security.addProvider(new com.provider.JSSEProvider());   
        }  
    
        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 {   
            try{
            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);   
            }catch(Exception e){
    
            }
        }   
    
        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");   
            }   
        }   
    }  
    

    JSSE Provider

    JSSEProvider.java

    /*
     *  Licensed to the Apache Software Foundation (ASF) under one or more
     *  contributor license agreements.  See the NOTICE file distributed with
     *  this work for additional information regarding copyright ownership.
     *  The ASF licenses this file to You under the Apache License, Version 2.0
     *  (the "License"); you may not use this file except in compliance with
     *  the License.  You may obtain a copy of the License at
     *
     *     http://www.apache.org/licenses/LICENSE-2.0
     *
     *  Unless required by applicable law or agreed to in writing, software
     *  distributed under the License is distributed on an "AS IS" BASIS,
     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     *  See the License for the specific language governing permissions and
     *  limitations under the License.
     */
    
    /**
     * @author Alexander Y. Kleymenov
     * @version $Revision$
     */
    
    
    import java.security.AccessController;
    import java.security.Provider;
    
    public final class JSSEProvider extends Provider {
    
        public JSSEProvider() {
            super("HarmonyJSSE", 1.0, "Harmony JSSE Provider");
            AccessController.doPrivileged(new java.security.PrivilegedAction<Void>() {
                public Void run() {
                    put("SSLContext.TLS",
                            "org.apache.harmony.xnet.provider.jsse.SSLContextImpl");
                    put("Alg.Alias.SSLContext.TLSv1", "TLS");
                    put("KeyManagerFactory.X509",
                            "org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl");
                    put("TrustManagerFactory.X509",
                            "org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl");
                    return null;
                }
            });
        }
    }
    

    정상적으로 동작하려면 아래 세 개의 jar파일을 안드로이드 프로젝트에 포함시켜야 됩니다.

    mail.jar
    activation.jar
    additionnal.jar
    

    jar파일을 포함하는 방법은 프로젝트의 루트폴더로 가서 libs라는 폴더를 생성 후에 jar파일을 넣어줍니다.

    그후 프로젝트의 build.gradle에 가서 dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') } 를 추가해줍니다.

    안드로이드 매니페스트 파일에가서 퍼미션 추가하는것도 잊으면 안됩니다.

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

    도움이 되었으면 좋겠네요.

    P.S. 안드로이드에서는 메인쓰레드에서 네트워크 연산이 불가하므로 AsyncTask나 IntentService를 사용해 main thread Exception을 피하시갈 바랍니다.

    Jar files : https://code.google.com/p/javamail-android/ jar파일은 위 주소로 가서 구할수있습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)