web-dev-qa-db-fra.com

Envoi d'e-mail via un serveur smtp gmail en JAVA

Quel est le problème avec ce code? D'une manière ou d'une autre, il s'agit d'entrer dans une boucle infinie à la ligne Transport.send(message); line, pas de message d'erreur, pas d'exception, juste une boucle infinie peut-être (je ne sais pas parce que je n'attends pas plus de 5 à 10 minutes)

final String username = "<mail_name>";
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", "465");

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("<mail_from>@gmail.com"));
    message.setRecipients(Message.RecipientType.TO,
            InternetAddress.parse("<mail_to>@gmail.com"));
    message.setSubject("Test Subject");
    message.setText("Test");

    Transport.send(message);

    System.out.println("Done");

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

Ici, je suis en train de donner quelques modifications qui fonctionnent bien pour moi:

Session session = Session.getInstance(props,null);

Vous instanciez l'objet du message comme vous l'avez fait. Et enfin:

Transport transport = session.getTransport("smtp");
String mfrom = "yourGmailUsernameWithout@"// example laabidiraissi 
transport.connect("smtp.gmail.com", mfrom, "thepassword");
transport.sendMessage(message, message.getAllRecipients());

Edit, pourriez-vous s'il vous plaît me donner une faveur et copier/coller et essayer cet exemple et montrer ce qu'il affiche

package com.test;

import Java.util.Properties;

import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import org.junit.Test;

public class EmailService {

@Test
public void test(){
    Properties props = System.getProperties();
    props.put("mail.smtp.starttls.enable", true); // added this line
    props.put("mail.smtp.Host", "smtp.gmail.com");
    props.put("mail.smtp.user", "username");
    props.put("mail.smtp.password", "password");
    props.put("mail.smtp.port", "587");
    props.put("mail.smtp.auth", true);



    Session session = Session.getInstance(props,null);
    MimeMessage message = new MimeMessage(session);

    System.out.println("Port: "+session.getProperty("mail.smtp.port"));

    // Create the email addresses involved
    try {
        InternetAddress from = new InternetAddress("username");
        message.setSubject("Yes we can");
        message.setFrom(from);
        message.addRecipients(Message.RecipientType.TO, InternetAddress.parse("receivermail"));

        // Create a multi-part to combine the parts
        Multipart multipart = new MimeMultipart("alternative");

        // Create your text message part
        BodyPart messageBodyPart = new MimeBodyPart();
        messageBodyPart.setText("some text to send");

        // Add the text part to the multipart
        multipart.addBodyPart(messageBodyPart);

        // Create the html part
        messageBodyPart = new MimeBodyPart();
        String htmlMessage = "Our html text";
        messageBodyPart.setContent(htmlMessage, "text/html");


        // Add html part to multi part
        multipart.addBodyPart(messageBodyPart);

        // Associate multi-part with message
        message.setContent(multipart);

        // Send message
        Transport transport = session.getTransport("smtp");
        transport.connect("smtp.gmail.com", "username", "password");
        System.out.println("Transport: "+transport.toString());
        transport.sendMessage(message, message.getAllRecipients());


    } catch (AddressException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (MessagingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}
19
Laabidi Raissi

D'accord. C'est un peu plus complexe que ce que je pensais pour la première fois ... Pour résumer ce que j'ai obtenu:

  • Il existe une commande très utile:session.setDebug(true);. Si vous définissez ceci sur true, tous les processus importants seront débogués vers la console. Je recommande de l'utiliser.
  • Le second ordinateur ne peut fonctionner qu'avec l'option secure, vous pouvez basculer celui-ci avec: Transport transport = session.getTransport("smtps"); plutôt que du smtp non sécurisé ... L'objet JavaMail API Transport se chargera également des ports (respectivement smtp: 587, smtps: 465)
  • Vous pouvez également utiliser la méthode statique de la classe Transport pour envoyer le message et (l'enregistrer avant, la méthode sendMessage non statique n'enregistrera pas le message), mais cette fois, vous devez utiliser javax.mail.Authenticator lors de la création de la session. comme ça:

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

    });

1.4.2 JavaMailApi a une autre exception que la version 1.4.7 pour ce problème ...

Si vous ne l'utilisez pas, vous ne pouvez pas vous authentifier avec la méthode statique. Si vous utilisez la méthode d'instance, vous pouvez.

  • Un ordinateur est devenu maître et a obtenu la version 1.4.2 de l'API JavaMail. Le deuxième ordinateur a une bibliothèque téléchargée, avec la version 1.4.7, qui, je suppose, gâche aussi les choses 
  • Première compilation Netbeans, deuxième compilation Intellij ... + 1) Il existe beaucoup de vieux et de mauvais exemples de code sur Internet, ce qui rend plus difficile l'utilisation de cette API correctement.

Si joli foiré, mais il y avait un concept de base qui devrait être concentré ...

3
czupe

Utiliser Simple Java Mail il devrait être simple:

Email email = new Email();

email.setFromAddress("lollypop", "[email protected]");
email.addRecipient("C.Cane", "[email protected]", RecipientType.TO);
email.setText("We should meet up!");
email.setTextHTML("<b>We should meet up!</b>");
email.setSubject("hey");

new Mailer("smtp.gmail.com", 25, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email);
new Mailer("smtp.gmail.com", 587, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email);
new Mailer("smtp.gmail.com", 465, "your user", "your password", TransportStrategy.SMTP_SSL).sendMail(email);

Si la connexion à deux facteurs est activée, vous devez générer un mot de passe spécifique à l'application depuis votre compte Google.

1
Benny Bottema

Je pourrais reproduire le problème décrit dans votre question et le corriger.

La méthode send reste bloquée à

SMTPTransport(Service).connect(String, int, String, String) line: 308   

La connexion échoue, car vous avez le mauvais port pour l'hôte smtp gmail: 465

changez-le en 587

props.put("mail.smtp.port", "587");

et ça va marcher.

1
A4L