Проблемы с отправкой через SMTP-сервер Gmail с Java

Один из моих клиентов использует Gmail для бизнеса (часть Служб Google), и мне пришлось перенастроить веб-сайт, который я разработал, чтобы он соответствовал новым учетным данным. После небольшой борьбы из-за ошибок 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

Странно то, что на 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 не сработает.

Итак, что я делаю не так, и что я должен сделать, чтобы рассылка работала?

2 ответа

Решение

Избавиться от всех свойств фабрики сокетов; Если вы используете достаточно свежую версию JavaMail, они вам не нужны. См. FAQ по JavaMail, чтобы узнать, как настроить JavaMail для доступа к Gmail. Вы также найдете там советы по отладке, если они все еще не работают.

Также измените Session.getDefaultInstance на Session.getInstance.

И наконец, если вы устанавливаете "mail.transport.protocol" в "smtps", вам нужно установить другие свойства как "mail.smtps.", А не "mail.smtp.".

Кажется, у вас есть проблемы с java.lang.reflect.InvocationTargetException, Итак, я имею в виду, что это не проблема сети. Возможно, вы неправильно указали некоторые параметры, и маршруты JavaMail API не смогли вызвать метод. Может быть, вы также должны указать свойство mail.smtp.ssl.socketFactory,

Некоторая документация здесь http://javamail.kenai.com/nonav/javadocs/com/sun/mail/smtp/package-summary.html.

Другие вопросы по тегам