web-dev-qa-db-fra.com

Vous devez d'abord lancer une commande STARTTLS. Envoi d'e-mails avec Java et Google Apps

J'essaie d'utiliser Bill the Lizard's code pour envoyer un e-mail à l'aide de Google Apps. Je reçois cette erreur:

Exception in thread "main" javax.mail.SendFailedException: Sending failed;
  nested exception is: 
    javax.mail.MessagingException: 530 5.7.0 Must issue a STARTTLS command first. f3sm9277120nfh.74

    at javax.mail.Transport.send0(Transport.Java:219)
    at javax.mail.Transport.send(Transport.Java:81)
    at SendMailUsingAuthentication.postMail(SendMailUsingAuthentication.Java:81)
    at SendMailUsingAuthentication.main(SendMailUsingAuthentication.Java:44)

Le code de Bill contient la ligne suivante, qui semble liée à l'erreur:

   props.put("mail.smtp.starttls.enable","true");

Cependant, cela n'aide pas.

Ce sont mes déclarations d'importation:

import Java.util.Properties; 
import javax.mail.Authenticator;
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;

Quelqu'un connaît-il cette erreur?

20
Sergio del Amo

J'ai trouvé le problème. Auparavant, j'utilisais j2ee.jar pour importer javax.mail.

J'ai supprimé j2ee.jar du chemin de classe et téléchargé JavaMail 1.4.1 et mis dans mon chemin de classe deux pots, smtp.jar et mailapi.jar. J'utilise maintenant smtps à la place smtp

Transport transport = session.getTransport("smtps");            

Maintenant, le code de Bill the Lizard fonctionne.

19
Sergio del Amo

Définissez les balises suivantes. Ça va marcher.

props.put("mail.smtp.user","username"); 
props.put("mail.smtp.Host", "smtp.gmail.com"); 
props.put("mail.smtp.port", "25"); 
props.put("mail.debug", "true"); 
props.put("mail.smtp.auth", "true"); 
props.put("mail.smtp.starttls.enable","true"); 
props.put("mail.smtp.EnableSSL.enable","true");

props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");   
props.setProperty("mail.smtp.socketFactory.fallback", "false");   
props.setProperty("mail.smtp.port", "465");   
props.setProperty("mail.smtp.socketFactory.port", "465"); 
16
Rupal K

Il s'agit de la version de Java API de messagerie. J'étais confronté à ce problème et je viens de mettre à jour la Java API de messagerie vers 1.4.3. Cela fonctionne bien pour moi!

Merci!

8
Cleber

Je pense que cela a à voir avec l'utilisation de SMTPS au lieu de SMTP pour le transport du courrier. Voici une version différente, modelée d'après JavaMail FAQ sur l'accès à Gmail . Notez que j'ai laissé de côté tout le traitement des exceptions de niveau plus fin pour plus de clarté.

private static void send(
        final String username,
        final String password,
        final String recipients,
        final String subject,
        final String body)
        throws Exception
{
    final Session session = Session.getInstance(System.getProperties(), null);
    final Message msg = new MimeMessage(session);
    final String senderEmail = username.contains("@") ? username : (username + "@gmail.com");
    msg.setFrom(new InternetAddress(senderEmail));

    final Address[] recipientAddresses = InternetAddress.parse(recipients);
    msg.setRecipients(Message.RecipientType.TO, recipientAddresses);

    msg.setSentDate(new Date());
    msg.setSubject(subject);
    msg.setText(body);

    final Transport transport = session.getTransport("smtps");
    transport.connect(GMAIL_SMTP_Host, GMAIL_SMTP_PORT, username, password);
    transport.sendMessage(msg, recipientAddresses);
    transport.close();
}
4
Zach Scrivena

Cela me rendait fou et je voulais juste ajouter ce qui a fonctionné pour moi. J'ai dû mettre à jour ma version de JavaMail (1.4.5) pour que cela fonctionne - je ne sais pas quelle version était utilisée auparavant.

Une fois que j'ai mis à jour vers une nouvelle version de JavaMail, le code suivant a fonctionné pour moi (peut décommenter les lignes de débogage pour obtenir des informations de débogage supplémentaires - le port était 587 et l'hôte était smtp.gmail.com):

public void sendMailWithAuth(String Host, String user, String password, 
    String port, List<String> toList, String htmlBody, 
        String subject) throws Exception {

    Properties props = System.getProperties();

    props.put("mail.smtp.user",user); 
    props.put("mail.smtp.password", password);
    props.put("mail.smtp.Host", Host); 
    props.put("mail.smtp.port", port); 
    //props.put("mail.debug", "true"); 
    props.put("mail.smtp.auth", "true"); 
    props.put("mail.smtp.starttls.enable","true"); 
    props.put("mail.smtp.EnableSSL.enable","true");

    Session session = Session.getInstance(props, null);
    //session.setDebug(true);

    MimeMessage message = new MimeMessage(session);
    message.setFrom(new InternetAddress(user));

    // To get the array of addresses
    for (String to: toList) {
        message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
    }

    message.setSubject(subject);
    message.setContent(htmlBody, "text/html");

    Transport transport = session.getTransport("smtp");
    try {
        transport.connect(Host, user, password);
        transport.sendMessage(message, message.getAllRecipients());
    } finally {
        transport.close();
    }
}
2
csheets

essaye ça:

activer: autoriser des applications moins sécurisées pour votre compte gmail

https://myaccount.google.com/lesssecureapps

1
Balchandar Reddy