使用Javamail连接到Gmail的SMTP服务器忽略指定的端口,并尝试使用25

我试图在groovy脚本中使用javamail通过gmail发送电子邮件。 我在网上查了很多地方,到目前为止一直无法工作。 我在运行脚本时遇到的错误是:

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

它似乎试图使用端口25,即使我已经指定它应该使用端口587.有谁知道什么可能导致这个问题,我用telnet连接到端口587 smtp服务器,和雷鸟使用端口587具有STARTTLS安全性,并能够使用SMTP服务器成功发送邮件。 这告诉我,这不是一个阻塞的端口或连接问题。 以下是我用来尝试发送电子邮件的代码:

 import javax.mail.* import javax.mail.internet.* private class SMTPAuthenticator extends Authenticator { public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication('email@gmail.com', 'password'); } } def d_email = "email@gmail.com", d_password = "password", d_host = "smtp.gmail.com", d_port = "587", //465,587 m_to = "email@gmail.com", 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) 

任何帮助将不胜感激。 提前致谢!

布莱恩

在Java中,你会做类似于:

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

请注意'smtpS'协议。 此外,在现代JVM中,socketFactory属性不再是必需的,但是您可能需要为Gmail设置“mail.smtps.auth”和“mail.smtps.starttls.enable”为“true”。 'mail.smtps.debug'也可能有帮助。

对于任何寻求完整解决scheme的人来说,我都会根据maximdim的回答得到以下代码:

 import javax.mail.* import javax.mail.internet.* private class SMTPAuthenticator extends Authenticator { public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication('email@gmail.com', 'test1234'); } } def d_email = "email@gmail.com", d_uname = "email", d_password = "password", d_host = "smtp.gmail.com", d_port = "465", //465,587 m_to = "testepscript@gmail.com", 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(); 

对于遇到这个问题的其他人可能很有用:在属性上设置端口时:

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

..确保使用一个string对象。 使用数字(即长)对象将导致此语句看起来没有任何效果。