Envoi d'e-mails dans Android à l'aide de l'API JavaMail sans utiliser l'application par défaut / intégrée

653

J'essaie de créer une application d'envoi de courrier dans Android.

Si j'utilise:

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

Cela lancera l'application Android intégrée; J'essaie d'envoyer le mail sur le bouton, cliquez directement sans utiliser cette application.

Vinayak Bevinakatti
la source
3
javax.mail.AuthenticationFailedException lors de l'envoi d'un e-mail bien que l'utilisateur / mot de passe soit correct. Toute solution?
TD Nguyen
1
Notez que depuis 1.5.5, JavaMail prétend prendre en charge Android
artbristol
1
SendGrid n'est-il pas une option? Autant que je sache, vous avez également la possibilité d'obtenir des statistiques sur l'emai que vous envoyez
Stamatis Stiliats

Réponses:

756

Envoyez des e-mails dans Android à l'aide de l'API JavaMail à l'aide de l'authentification Gmail.

Étapes pour créer un exemple de projet:

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

AJOUTER 3 pots trouvés dans le lien suivant vers votre projet Android

Cliquez ici - Comment ajouter des pots externes

Et n'oubliez pas d'ajouter cette ligne dans votre manifeste:

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

Cliquez simplement sur le lien ci-dessous pour modifier l'accès au compte pour les applications moins sécurisées https://www.google.com/settings/security/lesssecureapps

Exécutez le projet et vérifiez votre compte de messagerie destinataire pour le courrier. À votre santé!

PS Et n'oubliez pas que vous ne pouvez pas faire d'opération réseau à partir d'une activité dans Android. Par conséquent, il est recommandé d'utiliser AsyncTaskou IntentServiced'éviter le réseau sur l'exception du thread principal.

Fichiers Jar: https://code.google.com/archive/p/javamail-android/

Vinayak Bevinakatti
la source
52
Votre code semble utiliser un nom d'utilisateur et un mot de passe codés en dur. Est-ce actuellement un risque pour la sécurité (ce qui signifie que les apk téléchargés sur le marché ont-ils été décompilés)?
Rich
11
Travailler pour moi !!! n'oubliez pas d'ajouter à votre manifeste d'application l'autorisation d'utilisation INTERNET
Avi Shukron
15
est-il possible de recevoir un e-mail sans mettre le mot de passe dans le code? Je pense que les utilisateurs seraient surpris si je leur demandais leur e-mail pw ...
pumpkee
7
Salut Merci pour le code. mais j'ai eu java.lang.NoClassDefFoundError sur GMailSender sender = new GMailSender (...) sur mailsenderactivity. j'ai inclus tous les pots et ajouté au chemin de construction. j'ai passé du temps à le résoudre, mais je n'obtiens pas de solution. Aidez-moi, s'il vous plaît.
MAMurali
53
Pour ceux qui se plaignent / demandent comment obtenir le mot de passe de l'utilisateur - ce n'est pas l'idée ici. Il est destiné à être utilisé avec votre compte de messagerie (développeur). Si vous souhaitez vous fier au compte de messagerie de l'utilisateur, vous devez utiliser l'intention de messagerie, qui est largement discutée dans d'autres articles.
Tom
70

Merci pour vos précieuses informations. Le code fonctionne bien. Je peux également ajouter une pièce jointe en ajoutant le code suivant.

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
la source
6
Ajoutez ceci à GmailSender.java
Garbage
quand j'ai appelé setcontent, cela a écrasé le contenu de mon corps. est-ce que je fais quelque chose de mal. je veux ajouter une pièce jointe avec un autre contenu textuel
Calvin
1
pour la filenamevariable ici, vous devez spécifier le chemin du fichier. Par exemple:String path = Environment.getExternalStorageDirectory().getPath() + "/temp_share.jpg";
Ce code vous aide à ajouter plusieurs fichiers stackoverflow.com/a/3177640/2811343 ;) :)
AndroidManifester
54

Impossible de se connecter à l'hôte SMTP: smtp.gmail.com, port: 465

Ajoutez cette ligne dans votre manifeste:

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

Vous pouvez utiliser l'API JavaMail pour gérer vos tâches de messagerie. L'API JavaMail est disponible dans le package JavaEE et son pot est disponible en téléchargement. Malheureusement, il ne peut pas être utilisé directement dans une application Android car il utilise des composants AWT qui sont complètement incompatibles dans Android.

Vous pouvez trouver le port Android pour JavaMail à l'emplacement suivant: http://code.google.com/p/javamail-android/

Ajoutez les pots à votre application et utilisez la méthode SMTP

Kshitij Aggarwal
la source
1
Un référentiel maven pour ça?
user1050755
Désolé mais je ne suis pas au courant
Kshitij Aggarwal
6
J'ai porté le dernier JavaMail et il est disponible sur Maven Central souseu.ocathain.com.sun.mail:javax.mail:1.5.2
artbristol
29

Afin d'aider ceux qui obtiennent une exception Network On Main Thread avec une cible SDK> 9. Ceci utilise le code de droopie ci-dessus mais fonctionnera de la même manière pour tous.

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

StrictMode.setThreadPolicy(policy); 

android.os.NetworkOnMainThreadException

Vous pouvez utiliser AsyncTask comme ci-dessous

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
la source
Où ajouter cette classe
Gunaseelan
25

Code de travail à 100% avec démo Vous pouvez également envoyer plusieurs e-mails en utilisant cette réponse.

Téléchargez le projet ICI

Étape 1: Téléchargez le courrier, l'activation, les fichiers jar supplémentaires et ajoutez votre dossier de bibliothèques de projet dans Android Studio. J'ai ajouté une capture d'écran voir ci-dessous Lien de téléchargement

libs add

Connectez - vous avec gmail ( en utilisant votre messagerie à partir ) et ALLUME bouton à bascule LINK

La plupart des gens oublient cette étape j'espère que vous ne le ferez pas.

Étape 2: Après avoir terminé ce processus. Copiez et collez ces cours dans votre projet.

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

}

Étape 3: Maintenant, vous pouvez modifier cette classe en fonction de vos besoins, vous pouvez également envoyer plusieurs courriers en utilisant cette classe. je fournis les fichiers xml et java à la fois.

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

Remarque N'oubliez pas d'ajouter une autorisation Internet dans votre fichier AndroidManifest.xml

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

J'espère que cela fonctionne si ce n'est pas le cas, alors commentez ci-dessous.

Arpit Patel
la source
2
Est-ce sécurisé? Si je remplace «fromEmail» et «fromPassword» par un utilisateur et un mot de passe codés en dur, dois-je m'inquiéter des problèmes de sécurité?
Yonah Karp
Est-il possible de recevoir des e-mails en utilisant votre méthode? Je souhaite recevoir un e
user3051460
1
@ArpitPatel cela fonctionne assez bien. Mais je m'inquiète aussi pour la sécurité. Si vous utilisez gmail, Google peut bloquer certaines applications qui tentent de faire exactement cela.
Totumus Maximus
@TotumusMaximus Si vous vous inquiétez pour la sécurité, vous pouvez utiliser votre e-mail et votre mot de passe en utilisant l'API
Arpit Patel
23

SMTP

L'utilisation de SMTP est une façon de procéder, et les autres ont déjà indiqué comment procéder. Notez simplement qu'en faisant cela, vous contournez complètement l'application de messagerie intégrée et vous devrez fournir l'adresse du serveur SMTP, le nom d'utilisateur et le mot de passe de ce serveur, soit statiquement dans votre code, soit l'interroger auprès de l'utilisateur .

HTTP

Une autre façon impliquerait un simple script côté serveur, comme php, qui prend certains paramètres d'URL et les utilise pour envoyer un courrier. De cette façon, vous avez seulement besoin de faire une demande HTTP à partir de l'appareil (facilement possible avec les bibliothèques intégrées) et vous n'avez pas besoin de stocker les données de connexion SMTP sur l'appareil. C'est une indirection de plus par rapport à l'utilisation directe de SMTP, mais comme il est très facile de faire des requêtes HTTP et d'envoyer des mails depuis PHP, cela pourrait même être plus simple que la manière directe.

Application de messagerie

Si le courrier doit être envoyé à partir du compte de messagerie par défaut de l'utilisateur qu'il a déjà enregistré avec le téléphone, vous devrez adopter une autre approche. Si vous avez suffisamment de temps et d'expérience, vous voudrez peut-être vérifier le code source de l'application de messagerie Android pour voir si elle offre un point d'entrée pour envoyer un courrier sans interaction avec l'utilisateur (je ne sais pas, mais il y en a peut-être un).

Peut-être que vous trouvez même un moyen d'interroger les détails du compte des utilisateurs (afin que vous puissiez les utiliser pour SMTP), bien que je doute fortement que cela soit possible, car ce serait un énorme risque pour la sécurité et Android est construit de manière plutôt sécurisée.

Lena Schimmel
la source
22

voici une version alt qui fonctionne aussi pour moi et a des pièces jointes (publiée déjà ci-dessus mais version complète contrairement au lien source, que les gens ont posté, ils ne peuvent pas le faire fonctionner depuis ses données manquantes)

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

et l'appeler dans une activité ...

@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
la source
@KeyLimePiePhotonAndroid Ajouter une autorisation Internet à votre manifeste
noob
comment utiliser ce code si je veux utiliser un autre client de messagerie comme celui de mon organisation? La modification du nom d'hôte et du port serait-elle suffisante?
roger_that
javax.mail.AuthenticationFailedException toute solution pour android 4.4.4?
TD Nguyen
2
pour javax.mail.AuthenticationFailedException, vous devez activer ce paramètre google.com/settings/security/lesssecureapps
Razel Soco
1
Pour résoudre, Could not send email android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetworkil est nécessaire de voir cette solution stackoverflow.com/questions/25093546/…
jgrocha
14

GmailBackground est une petite bibliothèque pour envoyer un e-mail en arrière-plan sans interaction avec l'utilisateur:

Usage:

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

Configuration:

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

Autorisations:

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

Pour les pièces jointes également, vous devez définir l'autorisation READ_EXTERNAL_STORAGE:

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

La source

(Je l'ai testé moi-même)

SR
la source
Je l'utilise et fonctionne parfaitement. Mais j'ai fait quelques modifications pour l'utiliser avec un autre fournisseur de messagerie et lorsque j'envoie un e-mail à Gmail, il me renvoie l'en-tête "De" manquant ... Comment le résoudre?
Erich García
Bonjour, j'utilise cette API dans mon application, mais elle ne fonctionne pas et appelle toujours onfailcallback
Jawad Malik
13

Mot d'avertissement si vous utilisez "smtp.gmail.com" comme serveur smtp par défaut.

Google vous obligera à modifier fréquemment le mot de passe de votre compte de messagerie associé en raison de ses politiques trop zélées "d'activité suspecte". En substance, il traite les demandes répétées de smtp de différents pays dans un court laps de temps comme une "activité suspecte". Comme ils supposent que vous (le titulaire du compte de messagerie) ne pouvez être que dans un seul pays à la fois.

Lorsque les systèmes google détectent une "activité suspecte", cela empêchera la réception d'e-mails supplémentaires jusqu'à ce que vous changiez le mot de passe. Comme vous aurez codé en dur le mot de passe dans l'application, vous devez relancer l'application chaque fois que cela se produit, ce n'est pas idéal. Cela m'est arrivé 3 fois en une semaine, j'ai même stocké le mot de passe sur un autre serveur et récupéré dynamiquement le mot de passe chaque fois que Google m'a forcé à le changer.

Je recommande donc d'utiliser l'un des nombreux fournisseurs de smtp gratuits au lieu de "smtp.gmail.com" pour éviter ce problème de sécurité. Utilisez le même code mais remplacez "smtp.gmail.com" par votre nouvel hôte de transfert smtp.

marque
la source
2
C'est un bon point. Mais pouvez-vous donner un exemple de fournisseur de messagerie alternatif qui a travaillé avec le code (en remplaçant uniquement smtp et les informations de connexion). Je l'ai essayé avec hushmail et email.com mais sans succès. Continuera à essayer avec les autres.
Paulo Matuki
@PauloMatuki, @Mark, Salut, avez-vous résolu le suspicioud activityproblème?
Wesley
7

Edit: JavaMail 1.5.5 prétend prendre en charge Android , vous ne devriez donc pas avoir besoin d'autre chose.

J'ai porté le dernier JavaMail (1.5.4) sur Android. Il est disponible dans Maven Central, ajoutez simplement ce qui suit à build.gradle~~

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

Vous pouvez ensuite suivre le tutoriel officiel .

Le code source est disponible ici: https://bitbucket.org/artbristol/javamail-forked-android

artbristol
la source
cette ligne maven / gradle ne fonctionnait pas pour moi. le téléchargement 1.5.4 de votre bitbucket ne fonctionnait pas non plus pour moi. il a échoué sur la même ligne que le javamail ordinaire non Android, qui est MimeMessage.setText (texte).
wrapperapps
@wrapperapps désolé d'entendre cela. "ça marche pour moi!". N'hésitez pas à ouvrir un problème sur le dépôt de bitbucket
artbristol
7

J'ai trouvé une alternative plus courte pour ceux qui ont besoin d'aide. Le code est:

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

Source: envoi d'e-mails via l'API JavaMail

J'espère que cela t'aides! Bonne chance!

Shreshth Kharbanda
la source
5

Ceux qui ClassDefNotFoundErroressaient de déplacer ces trois fichiers jar dans le dossier lib de votre projet, cela a fonctionné pour moi !!

Omkar Gokhale
la source
4

Pour envoyer un mail avec pièce jointe ..

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
la source
Ajouter les fichiers jar activation.jar, additionnal.jar, javax.mail.jar
Rashid
1
J'obtiens l'erreur suivante lors de l'essai de votre méthode: 05-13 11: 51: 50.454: E / AndroidRuntime (4273): android.os.NetworkOnMainThreadException 05-13 11: 51: 50.454: E / AndroidRuntime (4273): sur android. os.StrictMode $ AndroidBlockGuardPolicy.onNetwork (StrictMode.java:1156). J'ai des autorisations Internet. Aucun conseil?
kodartcha
1
Essayez d'appeler la méthode à l'intérieur d'un thread ... C'est un processus qui prend du temps ... il ne peut pas s'exécuter sur le thread principal ...
Rashid
J'utilise exactement ce code dans mon projet Android. Le courrier fonctionne bien pour moi. Mais la pièce jointe ne fonctionne pas. J'essaie de joindre un fichier .txt, mais le courrier que je reçois consiste en un type de fichier inconnu qui ne peut pas s'ouvrir. Veuillez aider.
Syamantak Basu
@Rashid ofcourse je l'ai fait. Lorsque j'utilisais Intent auparavant, mon fichier joint arrivait à droite.
Syamantak Basu
4

Je ne parviens pas à exécuter le code de Vinayak B. Enfin, j'ai résolu ce problème en suivant:

1.Utiliser ceci

2.Application de AsyncTask.

3.Changement du problème de sécurité du compte gmail de l'expéditeur (passez à "TURN ON") dans ce

Patriotique
la source
3

Sans intervention de l'utilisateur, vous pouvez envoyer comme suit:

  1. Envoyer un e-mail depuis le client apk. Ici mail.jar, activation.jar est requis pour envoyer un email java. Si ces pots sont ajoutés, cela pourrait augmenter la taille de l'APK.

  2. Alternativement, vous pouvez utiliser un service Web sur le code côté serveur, qui utilisera les mêmes mail.jar et activation.jar pour envoyer des e-mails. Vous pouvez appeler le service Web via asynctask et envoyer un e-mail. Référez-vous au même lien.

(Mais, vous devrez connaître les informations d'identification du compte de messagerie)

Nishanthi Grashia
la source
2

Dans le cas où il vous est demandé de conserver la bibliothèque jar aussi petite que possible, vous pouvez inclure la fonction SMTP / POP3 / IMAP séparément pour éviter le problème «trop de méthodes dans le dex».

Vous pouvez choisir les bibliothèques de fichiers jar souhaitées sur la page Web javanet , par exemple, mailapi.jar + imap.jar peut vous permettre d'accéder à icloud, serveur de messagerie hotmail dans le protocole IMAP. (avec l'aide de additional.jar et activation.jar)

Zéphyr
la source
2

J'ai essayé d'utiliser le code soumis par @Vinayak B. Cependant, je reçois une erreur disant: pas de fournisseur pour smtp

J'ai créé une nouvelle question pour cela avec plus d'informations ICI

J'ai pu le réparer moi-même après tout. Je devais utiliser un autre mail.jar et je devais m'assurer que mon " accès aux applications moins sécurisées " était activé.

J'espère que cela aide toute personne ayant le même problème. Cela fait, ce morceau de code fonctionne également sur la vitre Google.

NoSixties
la source
2

Tout le code fourni dans les autres réponses est correct et fonctionne bien, mais un peu compliqué, j'ai donc décidé de publier une bibliothèque (toujours en développement) pour l'utiliser plus facilement: AndroidMail .

Il vous suffit de créer un MailSender, de construire un mail et de l'envoyer (déjà géré en arrière-plan avec une 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);

Vous pouvez recevoir une notification pour l'e-mail envoyé et il prend également en charge différents types de destinataires (TO, CC et BCC), pièces jointes et 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 :(
    }
});

Vous pouvez l'obtenir via Gradle ou Maven:

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

S'il vous plaît laissez-moi savoir si vous avez un problème avec elle! :)

Enrichman
la source
1

Voici beaucoup de solutions. Cependant, je pense que nous devons changer la configuration du GMail pour permettre l'accès à partir d'appareils moins sécurisés. Accédez au lien ci-dessous et activez-le. Ça marche pour moi

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

Nguyen Minh Hien
la source
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
la source
0

Envoi d'e-mails par programme avec Kotlin.

  • envoi d'email simple, pas toutes les autres fonctionnalités (comme les pièces jointes).
  • TLS est toujours activé
  • Une seule dépendance par e-mail est également requise.

J'ai également trouvé cette liste de services de messagerie POP très utile:

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

Comment utiliser:

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

Le code:

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
la source
-3

Pour ajouter une pièce jointe, n'oubliez pas d'ajouter.

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
la source