3

我的一位客户将 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 也不能解决问题。

那么,我做错了什么,我应该怎么做才能使邮寄工作?

4

2 回答 2

3

摆脱所有套接字工厂属性;如果您使用的是相当新的 JavaMail 版本,则不需要它们。有关如何配置 JavaMail 以访问 Gmail 的信息,请参阅JavaMail 常见问题解答。如果它仍然不起作用,您还可以在那里找到调试提示。

此外,将 Session.getDefaultInstance 更改为 Session.getInstance。

最后,如果您将“mail.transport.protocol”设置为“smtps”,则需要将其他属性设置为“mail.smtps. ”属性,而不是“mail.smtp. ”属性。

于 2012-05-02T18:34:47.913 回答
0

在您看来,java.lang.reflect.InvocationTargetException. 所以,我的意思是这不是网络问题。可能是您指定了一些错误的参数,JavaMail API 路由无法调用方法。可能您还应该指定 property mail.smtp.ssl.socketFactory

这里有一些文档http://javamail.kenai.com/nonav/javadocs/com/sun/mail/smtp/package-summary.html

于 2012-05-02T07:49:58.250 回答