Ошибка SMTP-хоста JavaMail - PullRequest
       8

Ошибка SMTP-хоста JavaMail

1 голос
/ 08 декабря 2011

У меня есть приложение Grails, которое отправляет электронные письма. Почтовый сервер не имеет SMTP-аутентификации, поэтому он требует «POP перед SMTP», что означает, что мне нужно пройти аутентификацию на POP-аккаунте перед отправкой через SMTP. Чаще всего это работает, но иногда почтовый сервер не выбирается из свойств, и вместо этого он пытается подключиться к «localhost». Вот свойства:

    Properties props = new Properties();

    props.setProperty("mail.store.protocol", "pop3")
    props.setProperty("mail.pop3.host", "mail.xxxxx.com")
    props.setProperty("mail.pop3.port", "110")
    props.setProperty("mail.smtp.host", "mail.xxxxx.com")
    props.setProperty("mail.smtp.port", "25")
    props.setProperty("mail.smtp.sendpartial", "true")
    props.setProperty("mail.pop3.socketFactory.port", "110")
    props.setProperty("mail.pop3.socketFactory.class","javax.net.SocketFactory")
    props.setProperty("mail.pop3.socketFactory.fallback", "false")
    Transport t = null
    def store

    try {
        URLName url = new URLName("pop3", "mail.xxxxxxx.com", 110, 
             "INBOX",  "username", "password");

        Session session = Session.getDefaultInstance(props, null)

        store = session.getStore(url)
        store.connect("mail.xxxxxx.com", "username", "password")

        Message message = new MimeMessage(session);

        message.setFrom(new InternetAddress("xxxx@xxxxxx.com"));

        message.setRecipients(Message.RecipientType.TO, 
            InternetAddress.parse(toAddress, true));

        message.setSubject(mailTitle);
        message.setContent(messageBody, "text/html");
        message.setSentDate(new Date());

        t = session.getTransport("smtp")
        t.connect()
        t.send(message)
        return true
    }
    catch (AddressException e) {
        e.printStackTrace()
        return false
    }
    catch (MessagingException e) {
        e.printStackTrace()
        return false
    }
    finally {
        store?.close()
    }

Чаще всего это работает. Но когда кварцевое задание выполняет отправку, запись почтового сервера из свойств не учитывается, и вместо этого она использует «localhost», а затем не отправляет электронные письма.

Я могу соединиться с Telnet и отправить с указанными атрибутами.

Может ли это быть проблема тайм-аута? Согласно тому, что я прочитал в документации, тайм-ауты по умолчанию «бесконечны», так что «не должно быть» проблемой.

Может ли это быть проблемой производительности? Я создал «фиктивное приложение», которое - более или менее - делает то же самое, но не выдает отправку из службы Grails, а напрямую из контроллера. Это работает все время, но это приложение всегда бездействует.

Я не использую почтовый плагин для Grails, так как не мог понять, что он может обрабатывать парадигму «pop before smtp».

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 09 декабря 2011

Решение. Похоже, что решение состоит в том, чтобы присвоить "mail.smtp.localhost" -значению то же значение, что и для "mail.smtp.host" . Ни одно письмо не сработало с тех пор, как я ввел это свойство. Я не думаю, что это было очевидное свойство для установки и невежество с моей точки зрения, тем не менее, я надеюсь, что это поможет кому-то еще в будущем.

Итак, мои свойства следующие:

    Properties props = new Properties();

    props.setProperty("mail.store.protocol", "pop3")
    props.setProperty("mail.pop3.host", "mail.xxxxxxx.com")
    props.setProperty("mail.pop3.port", "110")
    props.setProperty("mail.smtp.localhost", "mail.xxxxxxx.com")
    props.setProperty("mail.smtp.host", "mail.xxxxxxx.com")
    props.setProperty("mail.smtp.port", "25")
    props.setProperty("mail.smtp.sendpartial", "true")
    props.setProperty("mail.pop3.socketFactory.port", "110")
    props.setProperty("mail.pop3.socketFactory.class","javax.net.SocketFactory")
    props.setProperty("mail.pop3.socketFactory.fallback", "false")

Установка значения "mail.smtp.host" для свойства "mail.smtp.localhost" , не только устраняла ошибки, вся процедура стала намного быстрее

Спасибо за ваши усилия!

0 голосов
/ 06 декабря 2012
        props.setProperty("mail.transport.protocol", "smtp");
        props.setProperty("mail.smtp.port", "25");
        props.setProperty("mail.host", "a.b.com");
        props.setProperty("mail.smtp.timeout", "10000");

Над работами

...