기본 / 내장 앱을 사용하지 않고 JavaMail API를 사용하여 Android에서 이메일 보내기


653

Android에서 메일 보내기 응용 프로그램을 만들려고합니다.

내가 사용하는 경우 :

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);

내장 된 Android 애플리케이션이 시작됩니다. 이 응용 프로그램 사용 하지 않고 버튼 클릭으로 직접 메일을 보내려고 합니다.


3
사용자 / 암호가 정확하지만 이메일을 보낼 때 javax.mail.AuthenticationFailedException이 발생했습니다. 어떤 해결책?
TD Nguyen

1
1.5.5부터 JavaMail은 Android
artbristol

1
되지 SendGrid 옵션을? 내가 아는 한 당신은 또한 당신이 보내는 emai에 대한 통계를 얻을 수있는 가능성이 있습니다
Stamatis Stiliats

답변:


757

Gmail 인증을 사용하여 JavaMail API를 사용하여 Android에서 이메일을 보냅니다.

샘플 프로젝트를 만드는 단계 :

MailSenderActivity.java :

public class MailSenderActivity extends Activity {

    @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) {
                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 :

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");   
        }   
    }   
}  

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;
            }
        });
    }
}

Android 프로젝트에 대한 다음 링크에서 3 개의 항아리 추가

여기를 클릭하십시오-외부 병을 추가하는 방법

그리고이 줄을 매니페스트에 추가하는 것을 잊지 마십시오.

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

보안이 취약한 앱의 계정 액세스를 변경하려면 아래 링크를 클릭하십시오. https://www.google.com/settings/security/lesssecureapps

프로젝트를 실행하고 메일의 수신자 메일 계정을 확인하십시오. 건배!

추신 그리고 당신은 안드로이드의 모든 활동에서 네트워크 작업을 수행 할 수 없다는 것을 잊지 마십시오. 따라서 메인 스레드 예외에서 네트워크 를 사용 AsyncTask하거나 IntentService피하는 것이 좋습니다 .

jar 파일 : https://code.google.com/archive/p/javamail-android/


52
귀하의 코드는 하드 코딩 된 사용자 이름과 비밀번호를 사용하는 것 같습니다. 이것은 현재 보안 위험입니까 (즉, 시장에 업로드되는 APK가 디 컴파일 되었습니까?)
Rich

11
나를 위해 일하는 !!! 사용 허가 인터넷을 앱 매니페스트에 추가하는 것을 잊지 마십시오
Avi Shukron

15
암호를 코드에 넣지 않고 이메일을 보내려면 어떻습니까? 이메일을 요청하면 사용자가 놀라게 될 것
같습니다

7
코드 감사합니다. 하지만 mailsenderactivity의 GMailSender sender = new GMailSender (...)에서 java.lang.NoClassDefFoundError가 발생했습니다. 모든 항아리를 포함하고 경로를 추가했습니다. 나는 그것을 해결하는 데 약간의 시간을 보냈다. 그러나 나는 해결책을 얻지 못한다. 도와주세요.
MAMurali

53
사용자의 비밀번호를 얻는 방법에 대해 불평하거나 질문하는 사람들에게는 여기가 아닙니다. 이것은 (개발자) 전자 메일 계정과 함께 사용하기위한 것입니다. 사용자의 전자 메일 계정에 의존하려면 다른 게시물에서 널리 논의되는 전자 메일 의도를 사용해야합니다.
Tom

70

소중한 정보 감사합니다. 코드가 제대로 작동합니다. 다음 코드를 추가하여 첨부 파일을 추가 할 수도 있습니다.

private Multipart _multipart; 
_multipart = new MimeMultipart(); 

public void addAttachment(String filename,String subject) throws Exception { 
    BodyPart messageBodyPart = new MimeBodyPart(); 
    DataSource source = new FileDataSource(filename); 
    messageBodyPart.setDataHandler(new DataHandler(source)); 
    messageBodyPart.setFileName(filename); 
    _multipart.addBodyPart(messageBodyPart);

    BodyPart messageBodyPart2 = new MimeBodyPart(); 
    messageBodyPart2.setText(subject); 

    _multipart.addBodyPart(messageBodyPart2); 
} 



message.setContent(_multipart);

6
GmailSender.java에 추가
Garbage

내가 setcontent를 호출하면 내 본문 내용을 덮어 썼습니다. 내가 잘못하고 있습니까? 다른 텍스트 본문 내용으로 첨부 파일을 추가하고 싶습니다
Calvin

1
위해 filename여기에 변수, 당신은 파일 경로를 지정해야합니다. 예 :String path = Environment.getExternalStorageDirectory().getPath() + "/temp_share.jpg";

이 코드는 여러 파일을 추가하는 데 도움이됩니다 stackoverflow.com/a/3177640/2811343 ;) :)
AndroidManifester

54

SMTP 호스트 : smtp.gmail.com, 포트 : 465에 연결할 수 없습니다

매니페스트에이 줄을 추가하십시오.

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

39

JavaMail API를 사용하여 이메일 작업을 처리 할 수 ​​있습니다. JavaMail API는 JavaEE 패키지로 제공되며 해당 jar은 다운로드 할 수 있습니다. 안타깝게도 Android와 완전히 호환되지 않는 AWT 구성 요소를 사용하므로 Android 응용 프로그램에서 직접 사용할 수 없습니다.

다음 위치에서 JavaMail 용 Android 포트를 찾을 수 있습니다. http://code.google.com/p/javamail-android/

항아리를 응용 프로그램에 추가하고 SMTP 방법을 사용하십시오.


1
그것에 대한 maven 저장소가 있습니까?
user1050755

미안하지만 난
몰라

6
나는 최신 JavaMail에 포팅 한 그것은 아래 메이븐 중앙에 사용할 수eu.ocathain.com.sun.mail:javax.mail:1.5.2
artbristol

29

SDK 대상이> 9 인 네트워크에서 메인 스레드 예외가 발생하는 것을 돕기 위해. 이것은 위의 droopie의 코드를 사용하고 있지만 어느 것도 비슷하게 작동합니다.

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

StrictMode.setThreadPolicy(policy); 

android.os.NetworkOnMainThreadException

아래와 같이 AsyncTask를 사용할 수 있습니다

public void onClickMail(View view) {
    new SendEmailAsyncTask().execute();
}

class SendEmailAsyncTask extends AsyncTask <Void, Void, Boolean> {
    Mail m = new Mail("from@gmail.com", "my password");

    public SendEmailAsyncTask() {
        if (BuildConfig.DEBUG) Log.v(SendEmailAsyncTask.class.getName(), "SendEmailAsyncTask()");
        String[] toArr = { "to mail@gmail.com"};
        m.setTo(toArr);
        m.setFrom("from mail@gmail.com");
        m.setSubject("Email from Android");
        m.setBody("body.");
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        if (BuildConfig.DEBUG) Log.v(SendEmailAsyncTask.class.getName(), "doInBackground()");
        try {
            m.send();
            return true;
        } catch (AuthenticationFailedException e) {
            Log.e(SendEmailAsyncTask.class.getName(), "Bad account details");
            e.printStackTrace();
            return false;
        } catch (MessagingException e) {
            Log.e(SendEmailAsyncTask.class.getName(), m.getTo(null) + "failed");
            e.printStackTrace();
            return false;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

이 클래스를 추가 할 장소
Gunaseelan

25

데모를 사용한 100 % 작업 코드이 답변을 사용하여 여러 개의 이메일을 보낼 수도 있습니다.

여기에서 프로젝트 다운로드

1 단계 : 메일, 활성화, 추가 jar 파일을 다운로드 하고 android studio 의 프로젝트 라이브러리 폴더 에 추가하십시오 . 스크린 샷을 추가했습니다. 아래 링크를 참조하십시오.

라이브러리 추가

Gmail로 로그인 ( 메일에서 사용 ) 및 켜기 토글 버튼 LINK

대부분의 사람들은이 단계를 잊어 버립니다.

2 단계 : 이 프로세스를 완료 한 후 이 수업을 복사하여 프로젝트에 붙여 넣습니다.

GMail.java

import android.util.Log;

import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class GMail {

    final String emailPort = "587";// gmail's smtp port
    final String smtpAuth = "true";
    final String starttls = "true";
    final String emailHost = "smtp.gmail.com";


    String fromEmail;
    String fromPassword;
    List<String> toEmailList;
    String emailSubject;
    String emailBody;

    Properties emailProperties;
    Session mailSession;
    MimeMessage emailMessage;

    public GMail() {

    }

    public GMail(String fromEmail, String fromPassword,
            List<String> toEmailList, String emailSubject, String emailBody) {
        this.fromEmail = fromEmail;
        this.fromPassword = fromPassword;
        this.toEmailList = toEmailList;
        this.emailSubject = emailSubject;
        this.emailBody = emailBody;

        emailProperties = System.getProperties();
        emailProperties.put("mail.smtp.port", emailPort);
        emailProperties.put("mail.smtp.auth", smtpAuth);
        emailProperties.put("mail.smtp.starttls.enable", starttls);
        Log.i("GMail", "Mail server properties set.");
    }

    public MimeMessage createEmailMessage() throws AddressException,
            MessagingException, UnsupportedEncodingException {

        mailSession = Session.getDefaultInstance(emailProperties, null);
        emailMessage = new MimeMessage(mailSession);

        emailMessage.setFrom(new InternetAddress(fromEmail, fromEmail));
        for (String toEmail : toEmailList) {
            Log.i("GMail", "toEmail: " + toEmail);
            emailMessage.addRecipient(Message.RecipientType.TO,
                    new InternetAddress(toEmail));
        }

        emailMessage.setSubject(emailSubject);
        emailMessage.setContent(emailBody, "text/html");// for a html email
        // emailMessage.setText(emailBody);// for a text email
        Log.i("GMail", "Email Message created.");
        return emailMessage;
    }

    public void sendEmail() throws AddressException, MessagingException {

        Transport transport = mailSession.getTransport("smtp");
        transport.connect(emailHost, fromEmail, fromPassword);
        Log.i("GMail", "allrecipients: " + emailMessage.getAllRecipients());
        transport.sendMessage(emailMessage, emailMessage.getAllRecipients());
        transport.close();
        Log.i("GMail", "Email sent successfully.");
    }

}

SendMailTask.java

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.util.Log;

import java.util.List;

public class SendMailTask extends AsyncTask {

    private ProgressDialog statusDialog;
    private Activity sendMailActivity;

    public SendMailTask(Activity activity) {
        sendMailActivity = activity;

    }

    protected void onPreExecute() {
        statusDialog = new ProgressDialog(sendMailActivity);
        statusDialog.setMessage("Getting ready...");
        statusDialog.setIndeterminate(false);
        statusDialog.setCancelable(false);
        statusDialog.show();
    }

    @Override
    protected Object doInBackground(Object... args) {
        try {
            Log.i("SendMailTask", "About to instantiate GMail...");
            publishProgress("Processing input....");
            GMail androidEmail = new GMail(args[0].toString(),
                    args[1].toString(), (List) args[2], args[3].toString(),
                    args[4].toString());
            publishProgress("Preparing mail message....");
            androidEmail.createEmailMessage();
            publishProgress("Sending email....");
            androidEmail.sendEmail();
            publishProgress("Email Sent.");
            Log.i("SendMailTask", "Mail Sent.");
        } catch (Exception e) {
            publishProgress(e.getMessage());
            Log.e("SendMailTask", e.getMessage(), e);
        }
        return null;
    }

    @Override
    public void onProgressUpdate(Object... values) {
        statusDialog.setMessage(values[0].toString());

    }

    @Override
    public void onPostExecute(Object result) {
        statusDialog.dismiss();
    }

}

3 단계 : 이제 필요에 따라이 클래스를 변경할 수 있으며이 클래스를 사용하여 여러 메일을 보낼 수도 있습니다. xml과 java 파일을 모두 제공합니다.

activity_mail.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingLeft="20dp"
    android:paddingRight="20dp"
    android:paddingTop="30dp">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="10dp"
        android:text="From Email" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#FFFFFF"
        android:cursorVisible="true"
        android:editable="true"
        android:ems="10"
        android:enabled="true"
        android:inputType="textEmailAddress"
        android:padding="5dp"
        android:textColor="#000000">

        <requestFocus />
    </EditText>

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="10dp"
        android:text="Password (For from email)" />

    <EditText
        android:id="@+id/editText2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#FFFFFF"
        android:ems="10"
        android:inputType="textPassword"
        android:padding="5dp"
        android:textColor="#000000" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="10dp"
        android:text="To Email" />

    <EditText
        android:id="@+id/editText3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#ffffff"
        android:ems="10"
        android:inputType="textEmailAddress"
        android:padding="5dp"
        android:textColor="#000000" />

    <TextView
        android:id="@+id/textView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="10dp"
        android:text="Subject" />

    <EditText
        android:id="@+id/editText4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#ffffff"
        android:ems="10"
        android:padding="5dp"
        android:textColor="#000000" />

    <TextView
        android:id="@+id/textView5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="10dp"
        android:text="Body" />

    <EditText
        android:id="@+id/editText5"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#ffffff"
        android:ems="10"
        android:inputType="textMultiLine"
        android:padding="35dp"
        android:textColor="#000000" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send Email" />

</LinearLayout>

SendMailActivity.java

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

import java.util.Arrays;
import java.util.List;

public class SendMailActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final Button send = (Button) this.findViewById(R.id.button1);

        send.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                Log.i("SendMailActivity", "Send Button Clicked.");

                String fromEmail = ((TextView) findViewById(R.id.editText1))
                        .getText().toString();
                String fromPassword = ((TextView) findViewById(R.id.editText2))
                        .getText().toString();
                String toEmails = ((TextView) findViewById(R.id.editText3))
                        .getText().toString();
                List<String> toEmailList = Arrays.asList(toEmails
                        .split("\\s*,\\s*"));
                Log.i("SendMailActivity", "To List: " + toEmailList);
                String emailSubject = ((TextView) findViewById(R.id.editText4))
                        .getText().toString();
                String emailBody = ((TextView) findViewById(R.id.editText5))
                        .getText().toString();
                new SendMailTask(SendMailActivity.this).execute(fromEmail,
                        fromPassword, toEmailList, emailSubject, emailBody);
            }
        });
    }
}

참고 AndroidManifest.xml 파일에 인터넷 권한 을 추가하는 것을 잊지 마십시오

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

그것이 아래에 주석을 달지 않으면 효과가 있기를 바랍니다.


2
안전한가요? "fromEmail"및 "fromPassword"를 하드 코드 된 사용자 및 비밀번호로 바꾸면 보안 문제에 대해 걱정해야합니까?
Yonah Karp

방법을 사용하여 이메일을받을 수 있습니까? 이메일을 받고 싶습니다
user3051460

1
@ArpitPatel 이것은 꽤 깔끔하게 작동합니다. 그러나 나는 또한 보안에 대해 걱정하고 있습니다. Gmail을 사용하는 경우 Google은이를 수행하려는 특정 앱을 차단할 수 있습니다.
Totumus Maximus

@TotumusMaximus 당신이 당신의 이메일과 비밀번호를 사용하여 API를 사용할 수있는 것보다 당신은 보안에 대해 걱정하는 경우
Arpit 파텔

23

SMTP

SMTP를 사용하는 것이 한 가지 방법이며 다른 방법은 이미 SMTP를 사용하는 방법을 지적했습니다. 이 작업을 수행하는 동안 기본 제공 메일 앱을 완전히 우회하고 SMTP 서버 주소, 해당 서버의 사용자 이름 및 비밀번호를 코드에 정적으로 입력하거나 사용자에게 쿼리해야합니다. .

HTTP

또 다른 방법은 php와 같은 간단한 서버 측 스크립트를 사용하는 것입니다.이 스크립트는 URL 매개 변수를 사용하여 메일을 보내는 데 사용합니다. 이렇게하면 장치에서 HTTP 요청 만하면되고 (내장 라이브러리를 사용하여 쉽게 가능) 장치에 SMTP 로그인 데이터를 저장할 필요가 없습니다. 이는 직접 SMTP 사용과 비교하여 한 가지 더 간접적 인 방법이지만 HTTP 요청을 작성하고 PHP에서 메일을 보내는 것이 매우 간단하기 때문에 직접 방법보다 간단 할 수도 있습니다.

메일 신청

이미 전화로 등록한 사용자 기본 메일 계정에서 메일을 보내려면 다른 방법을 사용해야합니다. 시간과 경험이 충분하면 Android 전자 메일 응용 프로그램의 소스 코드를 확인하여 사용자 상호 작용없이 메일을 보낼 수있는 진입 점이 있는지 확인할 수 있습니다 (모르지만 모르겠습니다).

어쩌면 사용자 계정 세부 정보를 쿼리하는 방법을 찾을 수도 있습니다 (SMTP에 사용할 수 있음). 큰 보안 위험이 있으며 Android가 다소 안전하게 구축되어 있기 때문에 이것이 가능할 것입니다.


22

여기 나에게도 도움이되고 첨부 파일이있는 alt 버전이 있습니다 (이미 게시되었지만 소스 링크와 달리 완전한 버전은 누락 된 데이터 이후로 작동하지 않습니다)

import java.util.Date; 
import java.util.Properties; 
import javax.activation.CommandMap; 
import javax.activation.DataHandler; 
import javax.activation.DataSource; 
import javax.activation.FileDataSource; 
import javax.activation.MailcapCommandMap; 
import javax.mail.BodyPart; 
import javax.mail.Multipart; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart; 


public class Mail extends javax.mail.Authenticator { 
  private String _user; 
  private String _pass; 

  private String[] _to; 
  private String _from; 

  private String _port; 
  private String _sport; 

  private String _host; 

  private String _subject; 
  private String _body; 

  private boolean _auth; 

  private boolean _debuggable; 

  private Multipart _multipart; 


  public Mail() { 
    _host = "smtp.gmail.com"; // default smtp server 
    _port = "465"; // default smtp port 
    _sport = "465"; // default socketfactory port 

    _user = ""; // username 
    _pass = ""; // password 
    _from = ""; // email sent from 
    _subject = ""; // email subject 
    _body = ""; // email body 

    _debuggable = false; // debug mode on or off - default off 
    _auth = true; // smtp authentication - default on 

    _multipart = new MimeMultipart(); 

    // There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added. 
    MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); 
    mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); 
    mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); 
    mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); 
    mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); 
    mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822"); 
    CommandMap.setDefaultCommandMap(mc); 
  } 

  public Mail(String user, String pass) { 
    this(); 

    _user = user; 
    _pass = pass; 
  } 

  public boolean send() throws Exception { 
    Properties props = _setProperties(); 

    if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) { 
      Session session = Session.getInstance(props, this); 

      MimeMessage msg = new MimeMessage(session); 

      msg.setFrom(new InternetAddress(_from)); 

      InternetAddress[] addressTo = new InternetAddress[_to.length]; 
      for (int i = 0; i < _to.length; i++) { 
        addressTo[i] = new InternetAddress(_to[i]); 
      } 
        msg.setRecipients(MimeMessage.RecipientType.TO, addressTo); 

      msg.setSubject(_subject); 
      msg.setSentDate(new Date()); 

      // setup message body 
      BodyPart messageBodyPart = new MimeBodyPart(); 
      messageBodyPart.setText(_body); 
      _multipart.addBodyPart(messageBodyPart); 

      // Put parts in message 
      msg.setContent(_multipart); 

      // send email 
      Transport.send(msg); 

      return true; 
    } else { 
      return false; 
    } 
  } 

  public void addAttachment(String filename) throws Exception { 
    BodyPart messageBodyPart = new MimeBodyPart(); 
    DataSource source = new FileDataSource(filename); 
    messageBodyPart.setDataHandler(new DataHandler(source)); 
    messageBodyPart.setFileName(filename); 

    _multipart.addBodyPart(messageBodyPart); 
  } 

  @Override 
  public PasswordAuthentication getPasswordAuthentication() { 
    return new PasswordAuthentication(_user, _pass); 
  } 

  private Properties _setProperties() { 
    Properties props = new Properties(); 

    props.put("mail.smtp.host", _host); 

    if(_debuggable) { 
      props.put("mail.debug", "true"); 
    } 

    if(_auth) { 
      props.put("mail.smtp.auth", "true"); 
    } 

    props.put("mail.smtp.port", _port); 
    props.put("mail.smtp.socketFactory.port", _sport); 
    props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
    props.put("mail.smtp.socketFactory.fallback", "false"); 

    return props; 
  } 

  // the getters and setters 
  public String getBody() { 
    return _body; 
  } 

  public void setBody(String _body) { 
    this._body = _body; 
  }

  public void setTo(String[] toArr) {
      // TODO Auto-generated method stub
      this._to=toArr;
  }

  public void setFrom(String string) {
      // TODO Auto-generated method stub
      this._from=string;
  }

  public void setSubject(String string) {
      // TODO Auto-generated method stub
      this._subject=string;
  }  

  // more of the getters and setters ….. 
}

그리고 활동에서 그것을 부르기 위해 ...

@Override 
public void onCreate(Bundle icicle) { 
  super.onCreate(icicle); 
  setContentView(R.layout.main); 

  Button addImage = (Button) findViewById(R.id.send_email); 
  addImage.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View view) { 
      Mail m = new Mail("gmailusername@gmail.com", "password"); 

      String[] toArr = {"bla@bla.com", "lala@lala.com"}; 
      m.setTo(toArr); 
      m.setFrom("wooo@wooo.com"); 
      m.setSubject("This is an email sent using my Mail JavaMail wrapper from an Android device."); 
      m.setBody("Email body."); 

      try { 
        m.addAttachment("/sdcard/filelocation"); 

        if(m.send()) { 
          Toast.makeText(MailApp.this, "Email was sent successfully.", Toast.LENGTH_LONG).show(); 
        } else { 
          Toast.makeText(MailApp.this, "Email was not sent.", Toast.LENGTH_LONG).show(); 
        } 
      } catch(Exception e) { 
        //Toast.makeText(MailApp.this, "There was a problem sending the email.", Toast.LENGTH_LONG).show(); 
        Log.e("MailApp", "Could not send email", e); 
      } 
    } 
  }); 
} 

@KeyLimePiePhotonAndroid 매니페스트에 인터넷 권한 추가
멍청한 놈

내 조직과 같은 다른 이메일 클라이언트를 사용하려는 경우이 코드를 사용하는 방법은 무엇입니까? 호스트 이름과 포트만 변경하면 충분합니까?
roger_that

javax.mail.AuthenticationFailedException 안드로이드 4.4.4에 대한 솔루션?
TD Nguyen

2
javax.mail.AuthenticationFailedException의 경우이 설정을 켜야합니다. google.com/settings/security/lesssecureapps
Razel Soco

1
해결하려면 Could not send email android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork이 솔루션을 확인해야합니다. stackoverflow.com/questions/25093546/…
jgrocha

14

GmailBackground는 사용자 상호 작용없이 백그라운드에서 이메일을 보낼 수있는 작은 라이브러리입니다.

용법:

    BackgroundMail.newBuilder(this)
            .withUsername("username@gmail.com")
            .withPassword("password12345")
            .withMailto("toemail@gmail.com")
            .withType(BackgroundMail.TYPE_PLAIN)
            .withSubject("this is the subject")
            .withBody("this is the body")
            .withOnSuccessCallback(new BackgroundMail.OnSuccessCallback() {
                @Override
                public void onSuccess() {
                    //do some magic
                }
            })
            .withOnFailCallback(new BackgroundMail.OnFailCallback() {
                @Override
                public void onFail() {
                    //do some magic
                }
            })
            .send();

구성 :

repositories {
    // ...
    maven { url "https://jitpack.io" }
 }
 dependencies {
            compile 'com.github.yesidlazaro:GmailBackground:1.2.0'
    }

권한 :

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

또한 첨부 파일의 경우 READ_EXTERNAL_STORAGE 권한을 설정해야합니다.

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

출처

(나는 그것을 직접 테스트했습니다)


나는 그것을 사용하고 완벽하게 작동합니다. 그러나 다른 이메일 제공 업체와 함께 사용하도록 일부를 수정했으며 Gmail로 이메일을 보낼 때 "보낸 사람"헤더가 없습니다 ... 어떻게 해결합니까?
Erich García

안녕하세요, 난 내 응용 프로그램에서이 API를 사용하고 있지만, 작업을 항상 onfailcallback 전화 아니에요
자 와드 말리크

13

"smtp.gmail.com"을 기본 smtp 서버로 사용하는 경우 경고 메시지.

Google은 열성적인 "의심스러운 활동"정책으로 인해 연결된 이메일 계정 비밀번호를 자주 변경하도록합니다. 본질적으로 단기간 내에 여러 국가의 반복 된 SMTP 요청을 "의심스러운 활동"으로 취급합니다. 그들이 당신 (전자 메일 계정 보유자)은 한 번에 한 국가에만있을 수 있다고 가정합니다.

Google 시스템이 '의심스러운 활동'을 감지하면 비밀번호를 변경할 때까지 추가 이메일을 차단합니다. 암호를 앱에 하드 코딩 했으므로 이러한 상황이 발생할 때마다 앱을 다시 릴리스해야합니다 (이상적이지 않음). 이것은 일주일에 3 번 나에게 일어 났으며, 다른 서버에 비밀번호를 저장하고 Google이 강제로 비밀번호를 변경할 때마다 동적으로 비밀번호를 가져 왔습니다.

따라서이 보안 문제를 피하려면 "smtp.gmail.com"대신 많은 무료 smtp 공급자 중 하나를 사용하는 것이 좋습니다. 동일한 코드를 사용하지만 "smtp.gmail.com"을 새 smtp 전달 호스트로 변경하십시오.


2
좋은 지적입니다. 그러나 코드로 작동하는 대체 이메일 제공 업체 (smtp 및 로그인 세부 사항 만 대체)의 예를 제공 할 수 있습니다. hushmail과 email.com으로 시도했지만 성공하지 못했습니다. 다른 사람들과 계속 노력할 것입니다.
Paulo Matuki

@PauloMatuki, @Mark, Hi, suspicioud activity문제를 해결 했습니까?
웨슬리

7

편집 : JavaMail 1.5.5 는 Android를 지원한다고 주장 하므로 다른 것은 필요하지 않습니다.

최신 JavaMail (1.5.4)을 Android로 이식했습니다. Maven Central에서 사용할 수 있습니다. build.gradle~~에 다음을 추가하십시오.

compile 'eu.ocathain.com.sun.mail:javax.mail:1.5.4'

그런 다음 공식 튜토리얼 을 따를 수 있습니다 .

소스 코드는 여기에 있습니다 : https://bitbucket.org/artbristol/javamail-forked-android


그 maven / gradle 라인이 나를 위해 작동하지 않았습니다. 비트 버킷에서 1.5.4 다운로드도 작동하지 않았습니다. 안드로이드가 아닌 일반 자바 메일과 같은 줄에서 실패했습니다. MimeMessage.setText (text)입니다.
wrapperapps

@wrapperapps는 유감입니다. "그것은 나를 위해 일한다!". bitbucket repo
artbristol

7

도움이 필요한 다른 사람들을위한 더 짧은 대안을 찾았습니다. 코드는 다음과 같습니다

package com.example.mail;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendMailTLS {

    public static void main(String[] args) {

        final String username = "username@gmail.com";
        final String password = "password";

        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.port", "587");

        Session session = Session.getInstance(props,
          new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("username", "password");
            }
          });

        try {

            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress("from-email@gmail.com"));
            message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse("to-email@gmail.com"));
            message.setSubject("Testing Subject");
            message.setText("Dear Mail Crawler,"
                + "\n\n No spam to my email, please!");

            Transport.send(message);

            System.out.println("Done");

        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }
}

출처 : JavaMail API를 통해 이메일 보내기

도움이 되었기를 바랍니다! 행운을 빕니다!


5

ClassDefNotFoundErrorjar 파일을 프로젝트의 lib 폴더로 옮기려고 하는 사람들은 나를 위해 일했습니다!


4

첨부 파일이 포함 된 메일을 발송합니다.

public class SendAttachment{
                    public static void main(String [] args){ 
             //to address
                    String to="abc@abc.com";//change accordingly
                    //from address
                    final String user="efg@efg.com";//change accordingly
                    final String password="password";//change accordingly 
                     MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
                   mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
                  mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
                  mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
                  mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
                  mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
                  CommandMap.setDefaultCommandMap(mc); 
                  //1) get the session object   
                  Properties properties = System.getProperties();
                  properties.put("mail.smtp.port", "465"); 
                  properties.put("mail.smtp.host", "smtp.gmail.com");
                    properties.put("mail.smtp.socketFactory.port", "465");
                    properties.put("mail.smtp.socketFactory.class",
                            "javax.net.ssl.SSLSocketFactory");
                    properties.put("mail.smtp.auth", "true");
                    properties.put("mail.smtp.port", "465");

                  Session session = Session.getDefaultInstance(properties,
                   new javax.mail.Authenticator() {
                   protected PasswordAuthentication getPasswordAuthentication() {
                   return new PasswordAuthentication(user,password);
                   }
                  });

                  //2) compose message   
                  try{ 
                    MimeMessage message = new MimeMessage(session);
                    message.setFrom(new InternetAddress(user));
                    message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
                    message.setSubject("Hii"); 
                    //3) create MimeBodyPart object and set your message content    
                    BodyPart messageBodyPart1 = new MimeBodyPart();
                    messageBodyPart1.setText("How is This"); 
                    //4) create new MimeBodyPart object and set DataHandler object to this object    
                    MimeBodyPart messageBodyPart2 = new MimeBodyPart();
                //Location of file to be attached
                    String filename = Environment.getExternalStorageDirectory().getPath()+"/R2832.zip";//change accordingly
                    DataSource source = new FileDataSource(filename);
                    messageBodyPart2.setDataHandler(new DataHandler(source));
                    messageBodyPart2.setFileName("Hello"); 
                    //5) create Multipart object and add MimeBodyPart objects to this object    
                    Multipart multipart = new MimeMultipart();
                    multipart.addBodyPart(messageBodyPart1);
                    multipart.addBodyPart(messageBodyPart2); 
                    //6) set the multiplart object to the message object
                    message.setContent(multipart ); 
                    //7) send message 
                    Transport.send(message); 
                   System.out.println("MESSAGE SENT....");
                   }catch (MessagingException ex) {ex.printStackTrace();}
                  }
                }

jar 파일 activation.jar, additionnal.jar, javax.mail.jar 추가
Rashid

1
메서드를 시도 할 때 다음 오류가 발생합니다. 05-13 11 : 51 : 50.454 : E / AndroidRuntime (4273) : android.os.NetworkOnMainThreadException 05-13 11 : 51 : 50.454 : E / AndroidRuntime (4273) : Android에서. os.StrictMode $ AndroidBlockGuardPolicy.onNetwork (StrictMode.java:1156). 인터넷 권한이 있습니다. 어떤 충고?
kodartcha

1
스레드 내부에서 메소드를 호출하십시오 ... 시간이 많이 걸리는 프로세스입니다 ... 메인 스레드에서 실행할 수 없습니다 ...
Rashid

내 안드로이드 프로젝트 에서이 코드를 정확하게 사용하고 있습니다. 메일이 제대로 작동합니다. 그러나 부착 부분이 작동하지 않습니다. .txt 파일을 첨부하려고하는데 수신중인 메일이 열 수없는 알 수없는 유형의 파일로 구성되어 있습니다. 도와주세요.
Syamantak Basu

@ 라시드 물론 내가 그랬어. 이전에 Intent를 사용하고 있었을 때 첨부 파일이 제대로 작동했습니다.
Syamantak Basu

4

Vinayak B의 코드를 실행할 수 없습니다. 마지막으로 다음과 같이 하여이 문제를 해결했습니다.

1. 이것을 사용하여

2. AsyncTask 적용

보낸 사람의 Gmail 계정의 보안 문제를 템플릿 3..의 (변경 "전원 켜짐"으로)



3

사용자 개입없이 다음과 같이 보낼 수 있습니다.

  1. 클라이언트 APK에서 이메일을 보내십시오. 여기에서 mail.jar, activation.jar은 Java 전자 우편을 보내야합니다. 이러한 항아리가 추가되면 APK 크기가 증가 할 수 있습니다.

  2. 또는 서버 측 코드에서 웹 서비스를 사용하여 동일한 mail.jar 및 activation.jar을 사용하여 전자 메일을 보낼 수 있습니다. asynctask를 통해 웹 서비스를 호출하고 이메일을 보낼 수 있습니다. 동일한 링크를 참조하십시오.

그러나 메일 계정의 자격 증명을 알아야합니다.


2

jar 라이브러리를 가능한 한 작게 유지해야하는 경우 SMTP / POP3 / IMAP 기능을 별도로 포함시켜 "덱스에 너무 많은 방법"문제를 피할 수 있습니다.

javanet 웹 페이지 에서 원하는 jar 라이브러리를 선택할 수 있습니다. 예를 들어 mailapi.jar + imap.jar을 사용하면 IMAP 프로토콜로 imail, 핫메일 메일 서버에 액세스 할 수 있습니다. (additional.jar 및 activation.jar의 도움으로)


2

@Vinayak B가 제출 한 코드를 사용해 보았습니다. 그러나 smtp에 대한 공급자가 없습니다.라는 오류가 발생합니다.

여기에 더 많은 정보가 담긴 새로운 질문을 만들었습니다.

결국 스스로 고칠 수있었습니다. 다른 mail.jar 을 사용해야 했고 " 보안 수준이 낮은 앱에 대한 액세스 "가 켜져 있는지 확인해야 했습니다.

나는 이것이 같은 문제를 가진 사람에게 도움이되기를 바랍니다. 이 작업을 수행하면이 코드 조각이 Google 유리에서도 작동합니다.


2

다른 답변에서 제공하는 모든 코드는 정확하고 잘 작동하지만, 조금 지저분한, 나는 쉬운 방법에서 사용하는 (개발하지만 여전히) 라이브러리를 게시하기로 결정 그래서 : AndroidMail .

MailSender를 만들고 메일을 작성하여 보내면됩니다 (이미 백그라운드에서 AsyncTask로 처리됨).

MailSender mailSender = new MailSender(email, password);

Mail.MailBuilder builder = new Mail.MailBuilder();
Mail mail = builder
    .setSender(senderMail)
    .addRecipient(new Recipient(recipient))
    .setText("Hello")
    .build();

mailSender.sendMail(mail);

전송 된 이메일에 대한 알림을받을 수 있으며 다양한 수신자 유형 (TO, CC 및 BCC), 첨부 파일 및 html도 지원합니다.

MailSender mailSender = new MailSender(email, password);

Mail.MailBuilder builder = new Mail.MailBuilder();
Mail mail = builder
    .setSender(senderMail)
    .addRecipient(new Recipient(recipient))
    .addRecipient(new Recipient(Recipient.TYPE.CC, recipientCC))
    .setText("Hello")
    .setHtml("<h1 style=\"color:red;\">Hello</h1>")
    .addAttachment(new Attachment(filePath, fileName))
    .build();

mailSender.sendMail(mail, new MailSender.OnMailSentListener() {

    @Override
    public void onSuccess() {
        // mail sent!
    }

    @Override
    public void onError(Exception error) {
        // something bad happened :(
    }
});

Gradle 또는 Maven을 통해 얻을 수 있습니다.

compile 'it.enricocandino:androidmail:1.0.0-SNAPSHOT'

문제가 있으면 알려주세요! :)



0
 Add jar files mail.jar,activation.jar,additionnal.jar

 String sub="Thank you for your online registration" ; 
 Mail m = new Mail("emailid", "password"); 

 String[] toArr = {"ekkatrainfo@gmail.com",sEmailId};
 m.setFrom("ekkatrainfo@gmail.com"); 

     m.setTo(toArr);
     m.setSubject(sub);
    m.setBody(msg);



                     try{


                            if(m.send()) { 

                            } else { 

                            } 
                          } catch(Exception e) { 

                            Log.e("MailApp", "Could not send email", e); 
                          } 

  package com.example.ekktra;

   import java.util.Date;
   import java.util.Properties;

   import javax.activation.CommandMap;
   import javax.activation.DataHandler;
   import javax.activation.DataSource;
   import javax.activation.FileDataSource;
   import javax.activation.MailcapCommandMap;
   import javax.mail.BodyPart;
   import javax.mail.Multipart;
   import javax.mail.PasswordAuthentication;
   import javax.mail.Session;
   import javax.mail.Transport;
   import javax.mail.internet.InternetAddress;
   import javax.mail.internet.MimeBodyPart;
   import javax.mail.internet.MimeMessage;
   import javax.mail.internet.MimeMultipart;

   public class Mail extends javax.mail.Authenticator { 
     private String _user; 
     private String _pass; 

     private String[] _to; 

     private String _from; 

     private String _port; 
     private String _sport; 

     private String _host; 

     private String _subject; 
     private String _body; 

     private boolean _auth; 

     private boolean _debuggable; 

     private Multipart _multipart; 


   public Mail() { 
      _host = "smtp.gmail.com"; // default smtp server 
      _port = "465"; // default smtp port 
      _sport = "465"; // default socketfactory port 

      _user = ""; // username 
      _pass = ""; // password 
      _from = ""; // email sent from 
      _subject = ""; // email subject 
      _body = ""; // email body 

      _debuggable = false; // debug mode on or off - default off 
      _auth = true; // smtp authentication - default on 

      _multipart = new MimeMultipart(); 

      // There is something wrong with MailCap, javamail can not find a handler for the        multipart/mixed part, so this bit needs to be added. 
      MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); 
   mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); 
   mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); 
   mc.addMailcap("text/plain;; x-java-content-  handler=com.sun.mail.handlers.text_plain"); 
   mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); 
   mc.addMailcap("message/rfc822;; x-java-content- handler=com.sun.mail.handlers.message_rfc822"); 
    CommandMap.setDefaultCommandMap(mc); 
   } 

 public Mail(String user, String pass) { 
  this(); 

  _user = user; 
   _pass = pass; 
 } 

public boolean send() throws Exception { 
   Properties props = _setProperties(); 

  if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") &&   !_subject.equals("") /*&& !_body.equals("")*/) { 
    Session session = Session.getInstance(props, this); 

    MimeMessage msg = new MimeMessage(session); 

     msg.setFrom(new InternetAddress(_from)); 

    InternetAddress[] addressTo = new InternetAddress[_to.length]; 
     for (int i = 0; i < _to.length; i++) { 
      addressTo[i] = new InternetAddress(_to[i]); 
    } 
      msg.setRecipients(MimeMessage.RecipientType.TO, addressTo); 

    msg.setSubject(_subject); 
    msg.setSentDate(new Date()); 

  // setup message body 
  BodyPart messageBodyPart = new MimeBodyPart(); 
    messageBodyPart.setText(_body); 
    _multipart.addBodyPart(messageBodyPart); 

     // Put parts in message 
    msg.setContent(_multipart); 

    // send email 
    Transport.send(msg); 

    return true; 
   } else { 
     return false; 
   } 
  } 

   public void addAttachment(String filename) throws Exception { 
    BodyPart messageBodyPart = new MimeBodyPart(); 
    DataSource source = new FileDataSource(filename); 
      messageBodyPart.setDataHandler(new DataHandler(source)); 
    messageBodyPart.setFileName(filename); 

   _multipart.addBodyPart(messageBodyPart); 
 } 

  @Override 
  public PasswordAuthentication getPasswordAuthentication() { 
     return new PasswordAuthentication(_user, _pass); 
  } 

   private Properties _setProperties() { 
   Properties props = new Properties(); 

    props.put("mail.smtp.host", _host); 

  if(_debuggable) { 
    props.put("mail.debug", "true"); 
  } 

  if(_auth) { 
    props.put("mail.smtp.auth", "true"); 
   } 

    props.put("mail.smtp.port", _port); 
    props.put("mail.smtp.socketFactory.port", _sport); 
    props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
    props.put("mail.smtp.socketFactory.fallback", "false"); 

    return props; 
   } 

   // the getters and setters 
  public String getBody() { 
   return _body; 
 } 

 public void setBody(String _body) { 
  this._body = _body; 
 }

  public void setTo(String[] toArr) {
     // TODO Auto-generated method stub
    this._to=toArr;
 }

public void setFrom(String string) {
    // TODO Auto-generated method stub
    this._from=string;
}

 public void setSubject(String string) {
    // TODO Auto-generated method stub
    this._subject=string;
  }  


   }

0

Kotlin으로 프로그래밍 방식으로 이메일 보내기

  • 첨부 파일과 같은 다른 모든 기능이 아닌 간단한 이메일 전송
  • TLS는 항상 켜져 있습니다
  • 하나의 gradle 전자 메일 종속성도 필요했습니다.

또한이 이메일 POP 서비스 목록이 정말 유용하다는 것을 알았습니다.

https://support.office.com/en-gb/article/pop-and-imap-email-settings-for-outlook-8361e398-8af4-4e97-b147-6c6c4ac95353

사용하는 방법:

    val auth = EmailService.UserPassAuthenticator("you@gmail.com", "yourPassword")
    val to = listOf(InternetAddress("to@email.com"))
    val from = InternetAddress("you@gmail.com")
    val email = EmailService.Email(auth, to, from, "Test Subject", "Hello Body World")
    val emailService = EmailService("smtp.gmail.com", 465)

    GlobalScope.launch { // or however you do background threads
        emailService.send(email)
    }

코드:

import java.util.*
import javax.mail.*
import javax.mail.internet.InternetAddress
import javax.mail.internet.MimeBodyPart
import javax.mail.internet.MimeMessage
import javax.mail.internet.MimeMultipart

class EmailService(private val server: String, private val port: Int) {

    data class Email(
        val auth: Authenticator,
        val toList: List<InternetAddress>,
        val from: Address,
        val subject: String,
        val body: String
    )

    class UserPassAuthenticator(private val username: String, private val password: String) : Authenticator() {
        override fun getPasswordAuthentication(): PasswordAuthentication {
            return PasswordAuthentication(username, password)
        }
    }

    fun send(email: Email) {
        val props = Properties()
        props["mail.smtp.auth"] = "true"
        props["mail.user"] = email.from
        props["mail.smtp.host"] = server
        props["mail.smtp.port"] = port
        props["mail.smtp.starttls.enable"] = "true"
        props["mail.smtp.ssl.trust"] = server
        props["mail.mime.charset"] = "UTF-8"
        val msg: Message = MimeMessage(Session.getDefaultInstance(props, email.auth))
        msg.setFrom(email.from)
        msg.sentDate = Calendar.getInstance().time
        msg.setRecipients(Message.RecipientType.TO, email.toList.toTypedArray())
//      msg.setRecipients(Message.RecipientType.CC, email.ccList.toTypedArray())
//      msg.setRecipients(Message.RecipientType.BCC, email.bccList.toTypedArray())
        msg.replyTo = arrayOf(email.from)

        msg.addHeader("X-Mailer", CLIENT_NAME)
        msg.addHeader("Precedence", "bulk")
        msg.subject = email.subject

        msg.setContent(MimeMultipart().apply {
            addBodyPart(MimeBodyPart().apply {
                setText(email.body, "iso-8859-1")
                //setContent(email.htmlBody, "text/html; charset=UTF-8")
            })
        })
        Transport.send(msg)
    }

    companion object {
        const val CLIENT_NAME = "Android StackOverflow programmatic email"
    }
}

그레들 :

dependencies {
    implementation 'com.sun.mail:android-mail:1.6.4'
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3"
}

안드로이드

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

-3

첨부 파일을 추가하려면 반드시 추가해야합니다.

MailcapCommandMap mc = (MailcapCommandMap) CommandMap
            .getDefaultCommandMap();
    mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
    mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
    mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
    mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
    mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
    CommandMap.setDefaultCommandMap(mc);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.