JavaMail SMTP主机错误

时间:2011-12-08 08:38:01

标签: grails smtp javamail

我有一个发送电子邮件的Grails应用程序。邮件服务器没有SMTP身份验证,因此它需要“SMTP之前的POP”,这意味着我需要在通过SMTP发送之前对POP帐户进行身份验证。大多数情况下它可以工作,但偶尔,邮件服务器不会从属性中获取,而是尝试连接到“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()
    }

通常情况下,这是有效的。但是当Quartz Job正在进行发送时,属性中的邮件服务器条目不受尊重,而是使用“localhost”,然后无法发送电子邮件。

我可以使用Telnet连接并使用上述属性发送。

可能是超时问题吗?根据我在文档中读到的内容,默认情况下超时是“无限的”,所以“应该”不是问题。

这可能是性能问题吗?我已经创建了一个“虚拟应用程序”,它或多或少地执行相同的操作,但不会从Grails服务发出发送,而是直接从控制器发出。那个一直在工作,但那个应用程序总是在闲着。

我没有使用Grails的Mail插件,因为我看不出它能处理“smtp之前的pop” - 范例。

提前致谢。

2 个答案:

答案 0 :(得分:1)

解决方案:看起来解决方案是将“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”,不仅使错误消失,整个例程变得快得多。

感谢您的努力!

答案 1 :(得分:0)

        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");

以上作品