Enviando email no Android usando a API JavaMail sem usar o aplicativo padrão / interno

653

Estou tentando criar um aplicativo de envio de email no Android.

Se eu usar:

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

Isso iniciará o aplicativo Android embutido; Estou tentando enviar o email no botão, clique diretamente, sem usar este aplicativo.

Vinayak Bevinakatti
fonte
3
javax.mail.AuthenticationFailedException ao enviar email apesar de o usuário / senha estar correto. Qualquer solução?
TD Nguyen
1
Note-se que a partir de 1.5.5, JavaMail diz apoiar Android
artbristol
1
O SendGrid não é uma opção? Tanto quanto eu sei, você também tem a possibilidade de obter estatísticas sobre o
emai

Respostas:

756

Envie email no Android usando a API JavaMail usando autenticação do Gmail.

Etapas para criar um projeto de amostra:

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("[email protected]", "password");
                    sender.sendMail("This is Subject",   
                            "This is Body",   
                            "[email protected]",   
                            "[email protected]");   
                } 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;
            }
        });
    }
}

ADD 3 frascos encontrados no link a seguir para seu projeto Android

Clique aqui - Como adicionar frascos externos

E não se esqueça de adicionar esta linha no seu manifesto:

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

Basta clicar no link abaixo para alterar o acesso à conta para aplicativos menos seguros https://www.google.com/settings/security/lesssecureapps

Execute o projeto e verifique a conta de email do destinatário. Felicidades!

PS E não esqueça que você não pode fazer operações de rede a partir de nenhuma atividade no android. Portanto, é recomendável usar AsyncTaskou IntentServiceevitar a rede na exceção do encadeamento principal.

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

Vinayak Bevinakatti
fonte
52
Seu código parece usar nome de usuário e senha codificados. No momento, isso representa um risco à segurança (ou seja, os apk enviados para o mercado foram descompilados)?
Rich
11
Trabalhando para mim !!! não se esqueça de adicionar ao seu aplicativo manifesto da Internet usa-permission
Avi Shukron
15
existe uma maneira de receber um email sem inserir a senha no código? Eu acho que os usuários seriam assustado se eu gostaria de pedir-lhes por seu email pw ...
pumpkee
7
Oi Obrigado pelo código. mas eu tenho java.lang.NoClassDefFoundError no remetente GMailSender = new GMailSender (...) em mailsenderactivity. Eu incluí todos os frascos e adicionei para construir o caminho. Passei algum tempo para resolvê-lo. mas não recebo solução. por favor me ajude.
MAMurali
53
Para quem reclama / pergunta sobre como obter a senha do usuário - essa não é a ideia aqui. Isso deve ser usado com a sua conta de email (do desenvolvedor). Se você deseja confiar na conta de e-mail do usuário, use a intenção de e-mail, amplamente discutida em outras postagens.
Tom
70

Obrigado pela sua valiosa informação. Código está funcionando bem. Também consigo adicionar anexo adicionando o código a seguir.

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);
ashok reddy
fonte
6
Adicione isso ao GmailSender.java
Garbage
quando chamei setcontent, ele substituiu o conteúdo do meu corpo. Estou fazendo algo errado. eu quero adicionar anexo com outros conteúdos corpo textual
Calvin
1
para filenamevariável aqui, você deve especificar o caminho do arquivo. Por exemplo:String path = Environment.getExternalStorageDirectory().getPath() + "/temp_share.jpg";
Este código ajuda você a adicionar vários arquivos stackoverflow.com/a/3177640/2811343 ;) :)
AndroidManifester
54

Não foi possível conectar ao host SMTP: smtp.gmail.com, porta: 465

Adicione esta linha no seu manifesto:

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

Você pode usar a API JavaMail para lidar com suas tarefas de email. A API JavaMail está disponível no pacote JavaEE e seu jar está disponível para download. Infelizmente, ele não pode ser usado diretamente em um aplicativo Android, pois usa componentes AWT que são completamente incompatíveis no Android.

Você pode encontrar a porta Android para JavaMail no seguinte local: http://code.google.com/p/javamail-android/

Adicione os jars ao seu aplicativo e use o método SMTP

Kshitij Aggarwal
fonte
1
Algum repositório maven para isso?
user1050755
Desculpe, mas eu não estou ciente de que
Kshitij Aggarwal
6
Eu tenho portado o mais recente JavaMail e está disponível em Maven Central sobeu.ocathain.com.sun.mail:javax.mail:1.5.2
artbristol
29

Para ajudar aqueles que obtêm uma exceção de segmento de rede na principal com um destino SDK> 9. Isso está usando o código do droopie acima, mas funcionará de maneira semelhante para qualquer um.

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

StrictMode.setThreadPolicy(policy); 

android.os.NetworkOnMainThreadException

Você pode usar o AsyncTask como abaixo

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

class SendEmailAsyncTask extends AsyncTask <Void, Void, Boolean> {
    Mail m = new Mail("[email protected]", "my password");

    public SendEmailAsyncTask() {
        if (BuildConfig.DEBUG) Log.v(SendEmailAsyncTask.class.getName(), "SendEmailAsyncTask()");
        String[] toArr = { "to [email protected]"};
        m.setTo(toArr);
        m.setFrom("from [email protected]");
        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;
        }
    }
Ryan Heitner
fonte
Onde adicionar esta classe
Gunaseelan
25

Código 100% funcional com demonstração Você também pode enviar vários emails usando esta resposta.

Faça o download do projeto AQUI

Passo 1: Baixe e-mail, ativação, arquivos jar adicionais e adicione na pasta libs do projeto no android studio. Adicionei uma captura de tela, veja abaixo Download link

libs add

Entre com o gmail ( usando o seu e-mail ) e ative o botão de alternância LINK

A maioria das pessoas esquece esse passo, espero que não.

Etapa 2: Depois de concluir este processo. Copie e cole essas classes no seu projeto.

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

}

Etapa 3: Agora você pode alterar esta classe de acordo com suas necessidades e também pode enviar várias mensagens usando essa classe. eu forneço arquivos xml e 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);
            }
        });
    }
}

Nota Não se esqueça de adicionar permissão à Internet no seu arquivo AndroidManifest.xml

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

Espero que funcione, se não, basta comentar abaixo.

Arpit Patel
fonte
2
Isso é seguro? Se eu substituir "fromEmail" e "fromPassword" por um usuário e uma senha codificados, tenho que me preocupar com problemas de segurança?
Yonah Karp
É possível receber e-mails usando seu método? Quero receber um e-mail
user3051460
1
@ArpitPatel isso funciona muito bem. Mas também estou preocupado com a segurança. Se você usa o Gmail, o Google pode bloquear certos aplicativos que tentam fazer exatamente isso.
Totumus Maximus 29/11
@TotumusMaximus Se você está preocupado com a segurança, pode usar seu e-mail e senha usando a API
Arpit Patel
23

SMTP

Usar o SMTP é um caminho a percorrer, e os outros já apontaram maneiras de fazê-lo. Observe que, ao fazer isso, você evita completamente o aplicativo de correio interno e precisará fornecer o endereço do servidor SMTP, o nome de usuário e a senha desse servidor, estaticamente no seu código, ou consultá-lo com o usuário. .

HTTP

Outra maneira envolveria um script simples do lado do servidor, como php, que pega alguns parâmetros de URL e os usa para enviar um email. Dessa forma, você só precisa fazer uma solicitação HTTP do dispositivo (facilmente possível com as bibliotecas integradas) e não precisa armazenar os dados de login SMTP no dispositivo. Esse é mais um indireto comparado ao uso direto de SMTP, mas como é muito fácil fazer solicitações HTTP e enviar e-mails do PHP, pode até ser mais simples do que o modo direto.

Aplicação de Correio

Se o e-mail for enviado a partir da conta de e-mail padrão do usuário que ele já registrou no telefone, será necessário adotar outra abordagem. Se você tiver tempo e experiência suficientes, verifique o código-fonte do aplicativo Android Email para ver se ele oferece algum ponto de entrada para enviar um email sem a interação do usuário (não sei, mas talvez exista).

Talvez você até encontre uma maneira de consultar os detalhes da conta dos usuários (para que você possa usá-los para SMTP), embora eu duvide que isso seja possível, porque seria um grande risco à segurança e o Android é construído com bastante segurança.

Lena Schimmel
fonte
22

aqui está uma versão alt que também funciona para mim e tem anexos (postados acima, mas versão completa, ao contrário do link de origem, que as pessoas postaram, não podem fazê-lo funcionar devido à falta de dados)

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 ….. 
}

e chamá-lo em uma atividade ...

@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("[email protected]", "password"); 

      String[] toArr = {"[email protected]", "[email protected]"}; 
      m.setTo(toArr); 
      m.setFrom("[email protected]"); 
      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); 
      } 
    } 
  }); 
} 
droopie
fonte
@KeyLimePiePhotonAndroid Adicione permissão de Internet ao seu manifesto
noob
como usar esse código se eu quiser usar outro cliente de email, como o da minha organização? Alterar apenas o nome do host e a porta seria suficiente?
Roger_that 19/03/2014
javax.mail.AuthenticationFailedException qualquer solução para o Android 4.4.4?
TD Nguyen
2
para javax.mail.AuthenticationFailedException, você precisa ativar essa configuração google.com/settings/security/lesssecureapps
Razel Soco
1
Para resolver Could not send email android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetworké necessário para ver esta solução stackoverflow.com/questions/25093546/...
jgrocha
14

O GmailBackground é uma pequena biblioteca para enviar um email em segundo plano sem a interação do usuário:

Uso:

    BackgroundMail.newBuilder(this)
            .withUsername("[email protected]")
            .withPassword("password12345")
            .withMailto("[email protected]")
            .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();

Configuração:

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

Permissões:

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

Também para anexos, você precisa definir a permissão READ_EXTERNAL_STORAGE:

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

Fonte

(Eu mesmo testei)

SR
fonte
Eu usá-lo e funciona perfeito. Mas fiz algumas modificações para usá-lo com outro provedor de e-mail e, quando envia um e-mail para o Gmail, ele retorna o cabeçalho "De" ausente ... Como resolvê-lo?
Erich García
Olá, eu estou usando esta api em meu aplicativo, mas ele não está funcionando e sempre chamando onfailcallback
Jawad Malik
13

Palavra de aviso se estiver usando "smtp.gmail.com" como o servidor smtp padrão.

O Google forçará você a alterar a senha da sua conta de e-mail vinculada com frequência devido às políticas zelosas de "atividade suspeita". Em essência, trata solicitações SMTP repetidas de diferentes países em um curto espaço de tempo como "atividade suspeita". Como eles assumem que você (o titular da conta de e-mail) pode estar apenas em um país por vez.

Quando os sistemas do Google detectam "atividades suspeitas", eles impedem mais emails até você alterar a senha. Como você terá codificado a senha no aplicativo, precisará liberá-lo novamente sempre que isso acontecer, o que não é o ideal. Isso aconteceu três vezes em uma semana comigo, eu até armazenei a senha em outro servidor e a busquei dinamicamente sempre que o Google me forçou a alterá-la.

Portanto, recomendo usar um dos muitos provedores de smtp gratuitos em vez de "smtp.gmail.com" para evitar esse problema de segurança. Use o mesmo código, mas altere "smtp.gmail.com" para seu novo host de encaminhamento de smtp.

Marca
fonte
2
Essa é uma boa opinião. Mas você pode dar um exemplo de provedor de e-mail alternativo que funcionou com código (substituindo apenas smtp e detalhes de login). Eu tentei com hushmail e email.com, mas sem sucesso. Continuará tentando com os outros.
Paulo Matuki 11/11
@PauloMatuki, @Mark, Olá, vocês resolveram o suspicioud activityproblema?
Wesley
7

Edit: O JavaMail 1.5.5 alega suporte ao Android , então você não precisa de mais nada.

Portamos o JavaMail (1.5.4) mais recente para o Android. Está disponível no Maven Central, basta adicionar o seguinte a build.gradle~~

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

Você pode seguir o tutorial oficial .

O código fonte está disponível aqui: https://bitbucket.org/artbristol/javamail-forked-android

artbristol
fonte
essa linha maven / gradle não funcionou para mim. o download da versão 1.5.4 do seu bitbucket também não funcionou para mim. ele falhou na mesma linha que o javamail não Android normal, que é MimeMessage.setText (texto).
Wrapperapps
@wrapperapps desculpa ouvir isso. "funciona para mim!". Sinta-se livre para abrir um problema no repo bitbucket
artbristol
7

Encontrei uma alternativa mais curta para outros que precisam de ajuda. O código é:

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 = "[email protected]";
        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("[email protected]"));
            message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse("[email protected]"));
            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);
        }
    }
}

Fonte: Envio de email via API JavaMail

Espero que isto ajude! Boa sorte!

Shreshth Kharbanda
fonte
5

Aqueles que estão ClassDefNotFoundErrortentando mover esses três arquivos jar para a pasta lib do seu projeto, funcionou para mim !!

Omkar Gokhale
fonte
4

Para enviar um email com anexo ..

public class SendAttachment{
                    public static void main(String [] args){ 
             //to address
                    String to="[email protected]";//change accordingly
                    //from address
                    final String user="[email protected]";//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();}
                  }
                }
Rashid
fonte
Adicione os arquivos jar ativação.jar, adição.nal.jar, javax.mail.jar
Rashid
1
Eu recebo o seguinte erro ao tentar seu método: 05-13 11: 51: 50.454: E / AndroidRuntime (4273): android.os.NetworkOnMainThreadException 05-13 11: 51: 50.454: E / AndroidRuntime (4273): no android. os.StrictMode $ AndroidBlockGuardPolicy.onNetwork (StrictMode.java:1156). Eu tenho permissões de internet. Algum conselho?
Kodartcha
1
Tente chamar o método dentro de um fio ... Seu processo demorado ... ele não pode ser executado no thread principal ...
Rashid
Estou usando exatamente esse código no meu Android Project.O email está funcionando bem para mim. Mas a parte do anexo não está funcionando. Estou tentando anexar um arquivo .txt. Mas o email que estou recebendo consiste em um tipo desconhecido de arquivo que não pode ser aberto. Por favor ajude.
Syamantak Basu
@Rashid é claro que eu fiz isso. Quando eu estava usando o Intent anteriormente, meu arquivo anexado estava funcionando corretamente.
Syamantak Basu
4

Não consigo executar o código de Vinayak B. Finalmente, resolvi esse problema da seguinte maneira:

1.Usando isso

2.Aplicando o AsyncTask.

3.Alterar o problema de segurança da conta do remetente do Gmail. (Altere para "LIGAR") neste

Patriótico
fonte
3

Sem intervenção do usuário, você pode enviar da seguinte maneira:

  1. Enviar e-mail do cliente apk. Aqui mail.jar, activation.jar é necessário para enviar email em java. Se esses jarros forem adicionados, poderá aumentar o tamanho do APK.

  2. Como alternativa, você pode usar um serviço da Web no código do servidor, que usará o mesmo mail.jar e activation.jar para enviar email. Você pode ligar para o serviço da Web via asynctask e enviar e-mail. Consulte o mesmo link.

(Mas você precisará conhecer as credenciais da conta de email)

Nishanthi Grashia
fonte
2

Caso seja solicitado que você mantenha a biblioteca jar o menor possível, você pode incluir a função SMTP / POP3 / IMAP separadamente para evitar o problema "muitos métodos no dex".

Você pode escolher as bibliotecas jar desejadas na página da web do javanet , por exemplo, mailapi.jar + imap.jar pode permitir que você acesse o servidor de correio do icloud, hotmail no protocolo IMAP. (com a ajuda de additional.jar e activation.jar)

Zephyr
fonte
2

Tentei usar o código que o @Vinayak B enviou. No entanto, estou recebendo um erro dizendo: Nenhum provedor para smtp

Criei uma nova pergunta para isso com mais informações AQUI

Eu fui capaz de consertar isso sozinho depois de tudo. Eu tive que usar outro mail.jar e tive que garantir que meu " acesso a aplicativos menos seguros " estivesse ativado.

Espero que isso ajude quem tem o mesmo problema. Com isso feito, esse código também funciona no google glass.

NoSixties
fonte
2

Todo o código fornecido nas outras respostas está correto e está funcionando bem, mas um pouco confuso, então decidi publicar uma biblioteca (ainda em desenvolvimento) para usá-la de uma maneira mais fácil: AndroidMail .

Você precisa apenas criar um MailSender, criar um e-mail e enviá-lo (já tratado em segundo plano com um 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);

Você pode receber uma notificação pelo email enviado e também possui suporte para diferentes tipos de destinatários (TO, CC e BCC), anexos e 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 :(
    }
});

Você pode obtê-lo via Gradle ou Maven:

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

Entre em contato se tiver algum problema com ele! :)

Enrichman
fonte
1

Aqui estão muitas soluções. No entanto, acho que devemos alterar a configuração do GMail para permitir o acesso a partir de dispositivos menos seguros. Vá para o link abaixo e ative-o. Funciona para mim

https://myaccount.google.com/lesssecureapps?pli=1

Nguyen Minh Hien
fonte
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 = {"[email protected]",sEmailId};
 m.setFrom("[email protected]"); 

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


   }
dhiraj kakran
fonte
0

Enviando email programaticamente com o Kotlin.

  • envio simples de e-mail, nem todos os outros recursos (como anexos).
  • O TLS está sempre ativado
  • Apenas uma dependência de e-mail gradle também é necessária.

Eu também achei esta lista de serviços POP de email realmente útil:

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

Como usar:

    val auth = EmailService.UserPassAuthenticator("[email protected]", "yourPassword")
    val to = listOf(InternetAddress("[email protected]"))
    val from = InternetAddress("[email protected]")
    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)
    }

O código:

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

Gradle:

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

AndroidManifest:

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

Para adicionar anexo, não se esqueça de adicionar.

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);
della pramukti raharjo
fonte