我有一个发送电子邮件的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” - 范例。
提前致谢。
答案 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");
以上作品