使用Java发送电子邮件时遇到Gmail SMTP服务器问题

3

我的一个客户正在使用Gmail作为商务电子邮件(Google Apps的一部分),我不得不重新配置我开发的网站,以便它与新的凭据匹配。由于TLS错误的困扰,我花了一些时间让代码在本地主机和我的测试服务器上运行(都是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

奇怪的是,在本地和测试服务器上,端口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号端口也行不通。

那么,我做错了什么,该怎么做才能使邮件发送工作正常进行呢?


2
你能在日志中找到关于“InvocationTargetException”的更多信息吗?最好有堆栈跟踪。 - Eli Acherkan
有问题的服务器上使用了哪个JVM? - Thorbjørn Ravn Andersen
2个回答

3
摆脱所有的套接字工厂属性;如果您正在使用相当新版本的JavaMail,则不需要它们。请参阅JavaMail FAQ以了解如何配置JavaMail以访问Gmail。如果仍然无法正常工作,您还会在那里找到调试提示。
此外,请将Session.getDefaultInstance更改为Session.getInstance。
最后,如果您将“mail.transport.protocol”设置为“smtps”,则需要将其他属性设置为“mail.smtps.”属性,而不是“mail.smtp。”属性。

0

尝试正确指定mail.smtp.ssl.socketFactory,但仍然出现相同的错误... - aBogdan
这只是一个预测。你尝试过ping这个主机吗?同时,使用任何telnet客户端尝试连接此主机和此端口。或者使用一些软件(例如WireShark)监视网络活动。也许这是一个网络问题。 - Nikolay Antipov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接