我有一个带有邮件插件1.0.1的grails 2.2.1 app。
通过Gmail smtp服务器发送邮件在我本地运行应用程序(grails dev run-app)时工作正常,但在生产服务器(位于Jelastic云平台上)失败,我将其部署为战争档案。
Config.groovy中:
// Mail
grails {
mail {
host = "smtp.gmail.com"
port = 465
username = "aut********@gmail.com" // *** = just blacked out
password = "sun1******" // *** = just blacked out
props = ["mail.smtp.auth":"true",
"mail.smtp.starttls.required": "false",
"mail.smtp.socketFactory.port":"465",
"mail.smtp.socketFactory.class":"javax.net.ssl.SSLSocketFactory",
"mail.smtp.socketFactory.fallback":"false"]
}
}
但我只有一个邮件插件配置,因此假设该配置适用于开发和生产环境。
事实上,当我解压缩war文件并通过Decompiler检查类(在我的情况下:Config $ _run_closure2_closure8_closure13.class)时,我可以看到正确的配置值:
扩大:http://i.troll.ws/638ef33d.png
错误讯息:
Caused by: org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is javax.mail.AuthenticationFailedException: 535-5.7.1 Username and Password not accepted. Learn more at
535 5.7.1 http://support.google.com/mail/bin/answer.py?answer=14257 d47sm23030880eem.9 - gsmtp
at grails.plugin.mail.MailMessageBuilder.sendMessage(MailMessageBuilder.groovy:104)
at grails.plugin.mail.MailService.sendMail(MailService.groovy:41)
at MailGrailsPlugin$_configureSendMail_closure6.doCall(MailGrailsPlugin.groovy:170)
at com.oritrack.core.ApiController.register(ApiController.groovy:212)
... 5 more
Caused by: javax.mail.AuthenticationFailedException: 535-5.7.1 Username and Password not accepted. Learn more at
535 5.7.1 http://support.google.com/mail/bin/answer.py?answer=14257 d47sm23030880eem.9 - gsmtp
at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:648)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:583)
at javax.mail.Service.connect(Service.java:291)
... 9 more
认证失败真是太奇怪了;所以它至少试图连接到正确的服务器;并且Config.groovy中的用户名/密码是我在那里的唯一一组邮件插件配置。如果它在本地运行,它必须在其他地方运行。
答案 0 :(得分:1)
当某些东西在开发中工作而不是在生产中时,通常的罪魁祸首(根据我的经验)是依赖性。检查你的WAR是否有相同jar的多个版本,例如java-mail-1.0.jar和java-mail-1.2.jar。不要将搜索限制为java-mail.jar,这只是一个例子。
如果您发现一个jar的多个版本,请尝试删除一个并部署您的战争,如果它有效...... huzzah!
要查找jar中带来的插件,请使用“grails dependency-report”。一旦你发现jar中带来了什么,你可以使用exludes语法在BuildConfig.groovy中做这样的事情来删除它。
dependencies {
compile("org.apache.shiro:shiro-quartz:1.1.0") {
excludes("quartz")
}
runtime('org.codehaus.groovy.modules.http-builder:http-builder:0.5.0') {
excludes 'xalan'
excludes 'xml-apis'
excludes 'groovy'
}
}
我已经解决了一些非常奇怪的错误,其中一个包括由于多个http-client jar导致失败的http身份验证。