我的一位客户正在使用商务用Gmail(属于Google Apps的一部分),我不得不重新配置我开发的网站,以便它与新的凭据匹配。经过TLS错误的努力后,我设法使代码在localhost和测试服务器(均为Apache Tomcat 5.5)上运行。一切都进行得很顺利,直到我不得不将其移动到他的服务器上(托管公司告诉我的另一个Tomcat 5.5)。在客户端的服务器上,出现以下错误:
javax.mail.SendFailedException: Sending failed; nested exception is: class javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 465; nested exception is: java.io.IOException: Couldn't connect using "javax.net.ssl.SSLSocketFactory" socket factory to host, port: smtp.gmail.com, 465; Exception: java.lang.reflect.InvocationTargetException
奇怪的是,在localhost和测试服务器上,端口465可以正常工作,而托管人员则表示该端口已在其服务器上打开。
连接到邮件服务器的代码是:
private void initConfigParams() throws CMSGeneralException { try { props = System.getProperties(); String smtpHost = Messages.getDBConfString("mail.smtp.host"); String mailPort = Messages.getDBConfString("mail.smtp.port"); String socketFallback = Messages.getDBConfString("mail.smtp.socketFactory.fallback"); String enableTls = Messages.getDBConfString("mail.smtp.starttls.enable"); String authSmtp = Messages.getDBConfString("mail.smtp.auth"); String tlsRequired = Messages.getDBConfString("mail.smtp.stattls.required"); String sktFactory = Messages.getDBConfString("mail.smtp.socketFactory.class"); props.put("mail.smtp.starttls.enable", enableTls); props.put("mail.smtp.host", smtpHost); props.put("mail.smtp.auth", authSmtp); props.put("mail.smtp.starttls.required", tlsRequired); props.setProperty("mail.smtp.socketFactory.class", sktFactory); props.setProperty("mail.smtp.socketFactory.fallback", socketFallback); props.setProperty("mail.smtp.port", mailPort); props.setProperty("mail.smtp.socketFactory.port", mailPort); props.put("mail.transport.protocol", Messages.getDBConfString("mail.transport.protocol")); Authenticator auth = null; userName = Messages.getDBConfString("mail.username"); userPassword = Messages.getDBConfString("mail.userpassword"); if (!CMSUtils.isEmptyString(userName) && !CMSUtils.isEmptyString(userPassword)){ /* props.put("mail.smtp.auth", "true"); */ auth = new SMTPAuthenticator(userName, userPassword); } session = Session.getDefaultInstance(props, auth); session.setDebug(false); address = new InternetAddress[1]; address[0] = new InternetAddress(recipients); mbText = new MimeBodyPart(); mbText.setContent(text, "text/html"); mp = new MimeMultipart(); mp.addBodyPart(mbText); } catch (MessagingException e) { e.printStackTrace(); throw new CMSGeneralException(); } }
使用以下.properties文件
mail.smtp.starttls.enable=true mail.smtp.host=smtp.gmail.com mail.smtp.auth=true mail.smtp.starttls.required=true mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory mail.smtp.socketFactory.fallback=false mail.smtp.port=465 mail.transport.protocol=smtps mail.username=website@example.com mail.userpassword=password mail.from=website@example.com mail.to=mail@example.com
我尝试了GMail 587的其他端口,但在任何服务器上均不起作用。甚至端口25也无法解决问题。
那么,我在做什么错了,应该怎么做才能使邮件工作?
摆脱所有套接字工厂属性;如果您使用的是JavaMail的较新版本,则不需要它们。有关如何配置JavaMail以访问Gmail的信息,请参阅JavaMail常见问题解答。如果仍然无法使用,您还将在其中找到调试提示。
另外,将Session.getDefaultInstance更改为Session.getInstance。
最后,如果将“ mail.transport.protocol”设置为“ smtps”,则需要将其他属性设置为“ mail.smtps。 ”属性,而不是“ mail.smtp。 ”属性。