Grails Mail插件无法正常工作

时间:2010-09-08 01:30:41

标签: grails smtp javamail

我正在尝试从Grails应用程序发送邮件,但没有任何成功。

我使用过gmail和其他smtp服务器(没有ssl!)但是会出现同样的错误:

org.springframework.mail.MailSendException: Mail server connection failed; nested exception is javax.mail.MessagingException: Exception reading response;
  nested exception is:
    javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?. Failed messages: javax.mail.MessagingException: Exception reading response;
  nested exception is:
    javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?; message exceptions (1) are:
Failed message 1: javax.mail.MessagingException: Exception reading response;
  nested exception is:
    javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?

我在Config.groovy中使用(gmail示例):

grails.mail.host = "smtp.gmail.com"
grails.mail.from = "xxx@gmail.com"
grails.mail.port = "465"
grails.mail.ssl = "on"
grails.mail.username = "xxx@gmail.com"
grails.mail.password = "xxx"
grails.mail.props = ["mail.smtp.auth": "true",
        "mail.smtp.socketFactory.port": "465",
        "mail.smtp.socketFactory.class": "javax.net.ssl.SSLSocketFactory",
        "mail.smtp.socketFactory.fallback": "false",
        "mail.smtp.starttls.enable": "true",
        "mail.debug": "true"]
编辑:我使用邮件插件和控制器制作了一个简单的应用程序,Javid Jamae发布了配置(第三个答案,我认为另一个应该可以工作)。

但即使我只是复制粘贴相同的配置和相同的发送邮件代码,在我的主项目上它仍然给我相同的例外!我认为这可能是由Nimble插件引起的(Mail插件是由它安装的)。 我的配置是:
Grails版本:1.3.4
Groovy版本:1.7.4
JVM版本:1.6.0_21
jquery - 1.4.2.5
邮件 - 0.9
shiro - 1.0.1
敏捷 - 0.4-SNAPSHOT

最终编辑: 我解决了这个问题:似乎我必须在Nimble插件中使用相同的设置,在NimbleConfig.groovy中 - >邮件{...(必须有“from = ...”)}。
愚蠢的问题,但在它上面花了很多时间。

5 个答案:

答案 0 :(得分:4)

我没有使用SSL,我在Config.groovy的底部定义了以下内容(不在环境部分下面):

grails {
   mail {
     host = "smtp.gmail.com"
     port = 465
     username = "xxx@gmail.com"
     password = "xxx"
     props = ["mail.smtp.auth":"true",                     
              "mail.smtp.socketFactory.port":"465",
              "mail.smtp.socketFactory.class":"javax.net.ssl.SSLSocketFactory",
              "mail.smtp.socketFactory.fallback":"false"]
   }
}

我正在使用:

app.grails.version=1.2.1
plugins.mail=0.9

这适合我。

答案 1 :(得分:2)

您已启用SSL:

  

grails.mail.ssl =“on”

得到例外

  

javax.net.ssl.SSLException:无法识别的SSL消息,明文连接?。

所以禁用SSL(我的配置):

host = "smtp.gmail.com"
port = 465
username = "username@gmail.com"
password = "password"
javaMailProperties = ['mail.smtp.auth': 'true',
        'mail.smtp.socketFactory.port': '465',
        'mail.smtp.socketFactory.class': 'javax.net.ssl.SSLSocketFactory',
        'mail.smtp.socketFactory.fallback': 'false']

无论如何,如果您想启用SSL - 请尝试 587 端口。

还尝试设置

  

mail.smtp.starttls.required:'true'

因为如果服务器不支持安全连接或客户端不接受服务器的证书安全连接将无法启动,您将获得异常。 但是在设置starttls.required = true并且安全连接不可能之后,整个连接将失败,因此您得到了正确的异常消息。

P.S。请注意,SSL和TLS是不同的协议。

答案 2 :(得分:1)

我的配置中没有这一行

"mail.smtp.starttls.enable": "true"

我的连接正常工作

端口也不应该在引号中

grails.mail.port = 465

答案 3 :(得分:0)

我也遇到了类似的问题,所以我将分享我的经验。使用Nimble插件(使用Mail插件作为依赖项)时,Nimble在grails-app/conf/NimbleConfig.groovy中定义自己的邮件设置。

NimbleConfig.groovy中的设置似乎会覆盖Config.groovy中设置的设置(可能是因为NimbleConfig之后执行Config)。

这里的解决方案是有条件的:

  • 如果您使用的是Nimble ,请在grails-app/conf/NimbleConfig.groovy中设置邮件属性;您无需在grails-app/conf/Config.groovy

  • 中设置它们
  • 如果你没有使用Nimble ,那么只需按照邮件插件说明进行配置(或使用Javid Jamae的回答)

这似乎是OP在他/她的编辑中所提到的,但我只是认为我会根据我对正在发生的事情的理解来确认编辑。

更新

作为参考,以下是适用于我的NimbleConfig.groovy设置:

nimble {
    ...
    messaging {
        ...
        mail {
            host = 'smtp.gmail.com'
            port = 465
            username = '...@gmail.com'
            password = '...'
            props = [
                'mail.smtp.auth': 'true',
                'mail.smtp.socketFactory.port': '465',
                'mail.smtp.socketFactory.class': 'javax.net.ssl.SSLSocketFactory',
                'mail.smtp.socketFactory.fallback': 'false'
            ]
        }
    }
}

答案 4 :(得分:0)

您可以通过选中来验证运行时的配置设置 mailService.mailSender属性。这样的东西: mailService.mailSender.properties.each {}的println 它将产生主机,端口,用户名,密码和一些其他值。 如果您确定它们都是正确的,我会怀疑防火墙问题。