219 votes

Comment puis-je envoyer un e-mail par application Java en utilisant GMail, Yahoo ou Hotmail ?

Est-il possible d'envoyer un e-mail depuis mon application Java en utilisant un compte GMail ? J'ai configuré mon serveur de messagerie d'entreprise avec l'application Java pour envoyer des e-mails, mais cela ne suffira pas lorsque je distribuerai l'application. Les réponses avec l'utilisation de Hotmail, Yahoo ou GMail sont acceptables.

200voto

Bill the Lizard Points 147311

Téléchargez d'abord l'API JavaMail et assurez-vous que les fichiers jar pertinents sont dans votre classpath.

Voici un exemple de travail complet en utilisant GMail.

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

public class Main {

    private static String USER_NAME = "*****";  // Nom d'utilisateur GMail (juste la partie avant "@gmail.com")
    private static String PASSWORD = "********"; // Mot de passe GMail
    private static String RECIPIENT = "lizard.bill@myschool.edu";

    public static void main(String[] args) {
        String from = USER_NAME;
        String pass = PASSWORD;
        String[] to = { RECIPIENT }; // liste des adresses e-mail des destinataires
        String subject = "Exemple d'envoi de courrier Java";
        String body = "Bienvenue dans JavaMail!";

        sendFromGMail(from, pass, to, subject, body);
    }

    private static void sendFromGMail(String from, String pass, String[] to, String subject, String body) {
        Properties props = System.getProperties();
        String host = "smtp.gmail.com";
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.user", from);
        props.put("mail.smtp.password", pass);
        props.put("mail.smtp.port", "587");
        props.put("mail.smtp.auth", "true");

        Session session = Session.getDefaultInstance(props);
        MimeMessage message = new MimeMessage(session);

        try {
            message.setFrom(new InternetAddress(from));
            InternetAddress[] toAddress = new InternetAddress[to.length];

            // Pour obtenir le tableau des adresses
            for( int i = 0; i < to.length; i++ ) {
                toAddress[i] = new InternetAddress(to[i]);
            }

            for( int i = 0; i < toAddress.length; i++) {
                message.addRecipient(Message.RecipientType.TO, toAddress[i]);
            }

            message.setSubject(subject);
            message.setText(body);
            Transport transport = session.getTransport("smtp");
            transport.connect(host, from, pass);
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();
        }
        catch (AddressException ae) {
            ae.printStackTrace();
        }
        catch (MessagingException me) {
            me.printStackTrace();
        }
    }
}

Évidemment, vous voudrez faire plus dans les blocs catch que d'imprimer la pile d'appels comme je l'ai fait dans le code d'exemple ci-dessus. (Supprimez les blocs catch pour voir quelles appels de méthode de l'API JavaMail lèvent des exceptions afin de mieux comprendre comment les gérer correctement.)


Merci à @jodonnel et à tous ceux qui ont répondu. Je lui donne une prime car sa réponse m'a mené à environ 95% du chemin vers une réponse complète.

0 votes

Le lézard - avons-nous besoin de rediriger un port pour cela ??? props.put("mail.smtp.port", "587"); ce port doit-il être ouvert ??

1 votes

@varun: C'est le port sur le serveur de messagerie sortant, smtp.gmail.com. Voir Configuration d'autres clients de messagerie pour plus de détails.

1 votes

Suis-je le seul à obtenir une AuthenticationFailedException ici props.put("mail.smtp.auth", "true"); si le true est une chaîne de caractères. C'est bon si c'est un booléen.

115voto

jodonnell Points 14999

Quelque chose comme ceci (semble que vous devez simplement changer votre serveur SMTP):

String host = "smtp.gmail.com";
String from = "nom d'utilisateur";
Properties props = System.getProperties();
props.put("mail.smtp.host", host);
props.put("mail.smtp.user", from);
props.put("mail.smtp.password", "asdfgh");
props.put("mail.smtp.port", "587"); // 587 est le numéro de port de yahoo mail
props.put("mail.smtp.auth", "true");

Session session = Session.getDefaultInstance(props, null);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));

InternetAddress[] to_address = new InternetAddress[to.length];
int i = 0;
// Pour obtenir le tableau d'adresses
while (to[i] != null) {
    to_address[i] = new InternetAddress(to[i]);
    i++;
}
System.out.println(Message.RecipientType.TO);
i = 0;
while (to_address[i] != null) {

    message.addRecipient(Message.RecipientType.TO, to_address[i]);
    i++;
}
message.setSubject("envoi en groupe");
message.setText("Bienvenue à JavaMail");
// alternativement, pour envoyer un courrier HTML:
// message.setContent("Bienvenue à JavaMail", "text/html");
Transport transport = session.getTransport("smtp");
transport.connect("smtp.mail.yahoo.co.in", "nom d'utilisateur", "asdfgh");
transport.sendMessage(message, message.getAllRecipients());
transport.close();

0 votes

Est-il possible d'envoyer le contenu en tant qu'html? Si j'essaie d'écrire du code html et de l'envoyer, mais à la réception, le contenu de l'e-mail n'est que du code html.

4 votes

Pour envoyer un corps html au lieu de texte brut, changez cette ligne : message.setText("Welcome to JavaMail"); avec cette ligne : `message.setContent("

Bonjour tout le monde

", "text/html");`

4 votes

Celui-ci est manquant ("mail.smtp.starttls.enable", "true")

23voto

Jason Thrasher Points 398

D'autres personnes ont de bonnes réponses ci-dessus, mais je voulais ajouter une note sur mon expérience ici. J'ai trouvé que lorsque j'utilise Gmail comme serveur SMTP sortant pour mon application web, Gmail me permet d'envoyer seulement ~10 messages environ avant de répondre avec une réponse anti-spam que je dois parcourir manuellement pour réactiver l'accès SMTP. Les emails que j'envoyais n'étaient pas du spam, mais étaient des emails de bienvenue du site Web lorsque les utilisateurs se sont inscrits avec mon système. Donc, votre expérience peut varier, et je ne compterais pas sur Gmail pour une application web en production. Si vous envoyez des emails au nom d'un utilisateur, comme une application de bureau installée (où l'utilisateur entre ses propres identifiants Gmail), vous devriez être bien.

Aussi, si vous utilisez Spring, voici une configuration fonctionnelle pour utiliser Gmail pour SMTP sortant :

            mail.debug=true
            mail.smtp.auth=true
            mail.smtp.socketFactory.class=java.net.SocketFactory
            mail.smtp.socketFactory.fallback=false

0 votes

Merci Jason, pour l'exemple de paramètres de configuration et pour l'avertissement sur les limites d'envoi de courrier sortant. Je n'ai jamais atteint la limite auparavant, mais je suis sûr que d'autres personnes trouveront ces informations utiles.

0 votes

Je voudrais en savoir plus sur cette limite de spam... Je dois envoyer plusieurs e-mails, devrais-je les diviser en groupes ? attendre un laps de temps spécifié ? Est-ce que quelqu'un connaît les détails des limitations de Google Mails ?

13voto

user109771 Points 141

Même si cette question est close, j'aimerais poster une solution alternative, mais en utilisant maintenant Simple Java Mail (wrapper JavaMail smtp Open Source) :

final Email email = new Email();

String host = "smtp.gmail.com";
Integer port = 587;
String from = "username";
String pass = "password";
String[] to = {"to@gmail.com"};

email.setFromAddress("", from);
email.setSubject("sending in a group");
for( int i=0; i < to.length; i++ ) {
    email.addRecipient("", to[i], RecipientType.TO);
}
email.setText("Bienvenue à JavaMail");

new Mailer(host, port, from, pass).sendMail(email);
// vous pourriez aussi toujours utiliser votre session de messagerie au lieu
new Mailer(session).sendMail(email);

2 votes

Je reçois une erreur avec ce code : "Message: Erreur générique : 530 5.7.0 Doit d'abord émettre une commande STARTTLS" - comment activer starttls avec vesijama?

1 votes

J'ai reçu l'erreur "Must issue a STARTTLS command first" car dans la ligne ci-dessous, j'avais la variable isStartTlsEnabled en tant que boolean, au lieu d'une chaîne de caractères : props.put("mail.smtp.starttls.enable", isStartTlsEnabled);

0 votes

De cette réponse : Pour utiliser TLS, vous pouvez faire quelque chose comme new Mailer(votre login / votre session, TransportStrategy.SMTP_TLS).sendMail(email);

3voto

vishnu Points 31
//set CLASSPATH=%CLASSPATH%;activation.jar;mail.jar
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;

public class Mail
{
    String  d_email = "iamdvr@gmail.com",
            d_password = "****",
            d_host = "smtp.gmail.com",
            d_port  = "465",
            m_to = "iamdvr@yahoo.com",
            m_subject = "Testing",
            m_text = "Hey, this is the testing email using smtp.gmail.com.";
    public static void main(String[] args)
    {
        String[] to={"XXX@yahoo.com"};
        String[] cc={"XXX@yahoo.com"};
        String[] bcc={"XXX@yahoo.com"};
        //Ceci est pour Google
        Mail.sendMail("venkatesh@dfdf.com", "password", "smtp.gmail.com", 
                      "465", "true", "true", 
                      true, "javax.net.ssl.SSLSocketFactory", "false", 
                      to, cc, bcc, 
                      "hi baba ne pas envoyer de mails contenant des virus..", 
                      "Ceci est ma façon de répondre..Si vous envoyez des mails avec des virus..");
    }

    public synchronized static boolean sendMail(
        String userName, String passWord, String host, 
        String port, String starttls, String auth, 
        boolean debug, String socketFactoryClass, String fallback, 
        String[] to, String[] cc, String[] bcc, 
        String subject, String text) 
    {
        Properties props = new Properties();
        //Properties props=System.getProperties();
        props.put("mail.smtp.user", userName);
        props.put("mail.smtp.host", host);
        if(!"".equals(port))
            props.put("mail.smtp.port", port);
        if(!"".equals(starttls))
            props.put("mail.smtp.starttls.enable",starttls);
        props.put("mail.smtp.auth", auth);
        if(debug) {
            props.put("mail.smtp.debug", "true");
        } else {
            props.put("mail.smtp.debug", "false");         
        }
        if(!"".equals(port))
            props.put("mail.smtp.socketFactory.port", port);
        if(!"".equals(socketFactoryClass))
            props.put("mail.smtp.socketFactory.class",socketFactoryClass);
        if(!"".equals(fallback))
            props.put("mail.smtp.socketFactory.fallback", fallback);

        try
        {
            Session session = Session.getDefaultInstance(props, null);
            session.setDebug(debug);
            MimeMessage msg = new MimeMessage(session);
            msg.setText(text);
            msg.setSubject(subject);
            msg.setFrom(new InternetAddress("p_sambasivarao@sutyam.com"));
            for(int i=0;i

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X