2010-01-02 15 views
28

J'essaye d'utiliser javamail dans un script groovy pour envoyer un email via gmail. J'ai regardé de nombreux endroits en ligne et j'ai été incapable de le faire fonctionner jusqu'à présent. L'erreur que je reçois lors de l'exécution de mon script est:L'utilisation de Javamail pour se connecter au serveur SMTP de Gmail ignore le port spécifié et essaie d'utiliser 25

DEBUG SMTP: useEhlo true, useAuth false 
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 25, isSSL false 
Caught: javax.mail.SendFailedException: Send failure (javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 25 (javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?)) 

Il semble essayer d'utiliser le port 25 même si je l'ai spécifié qu'il doit utiliser le port 587. Est-ce que quelqu'un sait ce qui pourrait être la cause de ce problème , J'ai utilisé telnet pour me connecter au serveur smtp sur le port 587, et thunderbird utilise le port 587 avec la sécurité STARTTLS et est capable d'envoyer du courrier avec succès en utilisant le serveur smtp. Cela me dit que ce n'est pas un problème de port ou de connectivité bloqué. Voici le code que j'utilise pour essayer et envoyer l'email:

import javax.mail.* 
import javax.mail.internet.* 

private class SMTPAuthenticator extends Authenticator 
{ 
    public PasswordAuthentication getPasswordAuthentication() 
    { 
     return new PasswordAuthentication('[email protected]', 'password'); 
    } 
} 

def d_email = "[email protected]", 
     d_password = "password", 
     d_host = "smtp.gmail.com", 
     d_port = "587", //465,587 
     m_to = "[email protected]", 
     m_subject = "Testing", 
     m_text = "This is a test." 

def props = new Properties() 
props.put("mail.smtp.user", d_email) 
props.put("mail.smtp.host", d_host) 
props.put("mail.smtp.port", d_port) 
props.put("mail.smtp.starttls.enable","true") 
props.put("mail.smtp.debug", "true"); 
props.put("mail.smtp.auth", "true") 
props.put("mail.smtp.socketFactory.port", d_port) 
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory") 
props.put("mail.smtp.socketFactory.fallback", "false") 

def auth = new SMTPAuthenticator() 
def session = Session.getInstance(props, auth) 
session.setDebug(true); 

def msg = new MimeMessage(session) 
msg.setText(m_text) 
msg.setSubject(m_subject) 
msg.setFrom(new InternetAddress(d_email)) 
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(m_to)) 
Transport.send(msg) 

Toute aide serait grandement appréciée. Merci d'avance!

-Bryan

Répondre

28

En Java, vous feriez quelque chose de similaire à:

Transport transport = session.getTransport("smtps"); 
transport.connect (smtp_host, smtp_port, smtp_username, smtp_password); 
transport.sendMessage(msg, msg.getAllRecipients()); 
transport.close();  

Remarque protocole 'smtps'. De même, les propriétés socketFactory ne sont plus nécessaires dans les JVM modernes, mais vous devrez peut-être définir 'mail.smtps.auth' et 'mail.smtps.starttls.enable' sur 'true' pour Gmail. 'mail.smtps.debug' pourrait aussi être utile.

+4

Merci qui a fonctionné! Notez que le deuxième paramètre à connecter() dans un int, j'ai également dû passer le numéro de port à 465 parce que c'est le port SSL, tandis que 587 est pour TLS. Merci encore! – Bryan

+0

Heureux que cela a fonctionné. Je pense que vous pouvez également supprimer les propriétés mail.smtp.socketFactory. * – maximdim

+0

C'est bien de trouver ça! Sendgrid a un exemple Java [ici] (http://sendgrid.com/docs/Code_Examples/java.html) qui utilise les propriétés, et fonctionne très bien si vous pouvez utiliser le port 25, mais si vous devez basculer, il échoue. Mon FAI bloque le port 25, de sorte que le code fonctionnait à partir de mon bureau, mais pas à la maison, et je ne pouvais pas comprendre pourquoi mon port sélectionné était ignoré. –

15

Pour ceux qui cherchent une solution complète, j'ai eu ce travail avec le code suivant en fonction de la réponse de maximdim:

import javax.mail.* 
import javax.mail.internet.* 

private class SMTPAuthenticator extends Authenticator 
{ 
    public PasswordAuthentication getPasswordAuthentication() 
    { 
     return new PasswordAuthentication('[email protected]', 'test1234'); 
    } 
} 

def d_email = "[email protected]", 
     d_uname = "email", 
     d_password = "password", 
     d_host = "smtp.gmail.com", 
     d_port = "465", //465,587 
     m_to = "[email protected]", 
     m_subject = "Testing", 
     m_text = "Hey, this is the testing email." 

def props = new Properties() 
props.put("mail.smtp.user", d_email) 
props.put("mail.smtp.host", d_host) 
props.put("mail.smtp.port", d_port) 
props.put("mail.smtp.starttls.enable","true") 
props.put("mail.smtp.debug", "true"); 
props.put("mail.smtp.auth", "true") 
props.put("mail.smtp.socketFactory.port", d_port) 
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory") 
props.put("mail.smtp.socketFactory.fallback", "false") 

def auth = new SMTPAuthenticator() 
def session = Session.getInstance(props, auth) 
session.setDebug(true); 

def msg = new MimeMessage(session) 
msg.setText(m_text) 
msg.setSubject(m_subject) 
msg.setFrom(new InternetAddress(d_email)) 
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(m_to)) 

Transport transport = session.getTransport("smtps"); 
transport.connect(d_host, 465, d_uname, d_password); 
transport.sendMessage(msg, msg.getAllRecipients()); 
transport.close(); 
+0

C'est exactement ce que je cherchais. Merci – Tomik

+0

Un des rares exemples de codes qui a fonctionné pour moi, merci! – Cookie

+0

peut ayone s'il vous plaît regarder jusqu'à ma question semblable à ceci? Http: //stackoverflow.com/questions/14209284/could-not-connect-to-smtp-host-localhost-port-25 –

2

Peut-être utile pour tous ceux en cours d'exécution d'autre dans ce numéro: Lors du réglage du port sur les propriétés:

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

.. Assurez-vous d'utiliser un objet chaîne. L'utilisation d'un objet numérique (c'est-à-dire Long) entraînera apparemment l'absence d'effet de cette instruction.

+0

Merci! C'était mon problème! – migmig