Grails2.1动态邮件配置

Grails2.1动态邮件配置,grails,Grails,我正在尝试从grails应用程序发送电子邮件。我使用gmail尝试了推荐的设置,效果很好。我成功地发送了邮件。但我想动态覆盖用户名和密码。我不知道该怎么做。有人能帮忙吗 grails { mail { host = "smtp.gmail.com" port = 465 username = "faruq@gmail.com" // Want to change dynamically like variable ${bran

我正在尝试从grails应用程序发送电子邮件。我使用gmail尝试了推荐的设置,效果很好。我成功地发送了邮件。但我想动态覆盖用户名和密码。我不知道该怎么做。有人能帮忙吗

    grails {
    mail {
        host = "smtp.gmail.com"
        port = 465
        username = "faruq@gmail.com"    // Want to change dynamically like variable ${branch.mail}
        password = "12345"              // Want to change dynamically like variable ${branch.pass}
        props = [
            "mail.smtp.auth":"true",
            "mail.smtp.socketFactory.port":"465",
            "mail.smtp.socketFactory.class":"javax.net.ssl.SSLSocketFactory",
            "mail.smtp.socketFactory.fallback":"false"
        ]
    }
}
我使用此过程覆盖控制器中的用户名

grailsApplication.config.grails.mail.username = Branch.get(2).mail
通过此过程,用户名成功更改

这里Branch是我的域类,mail是属性

但是出现了一个身份验证问题:

javax.mail.AuthenticationFailedException: 535-5.7.8 Username and Password not accepted
现在我能做什么呢?

您可以在主
Config.groovy

grails {
    mail {
        host = "smtp.gmail.com"
        port = 465
        username = "<changeme>"
        password = "<changeme>"
        props = [
            "mail.smtp.auth":"true",
            "mail.smtp.socketFactory.port":"465",
            "mail.smtp.socketFactory.class":"javax.net.ssl.SSLSocketFactory",
            "mail.smtp.socketFactory.fallback":"false"
        ]
    }
}
为了能够在运行时动态更改凭据,它变得相当复杂。在封面下,邮件插件创建了一个Springbean,它是的一个实例,用于处理电子邮件的实际发送,默认情况下,该bean通过配置中的静态设置进行配置。但在运行时,该类在每次需要发送消息时都会出现。因此,您可以用您自己的JavaMailSenderImpl自定义子类替换这个bean,该子类重写这些方法以从请求上下文中提取细节(代码示例,未测试,导入/错误处理省略):

src/groovy/com/example/RequestCredentialsMailSender.groovy

class RequestCredentialsMailSender extends JavaMailSenderImpl {
  public String getUsername() {
    return RequestContextHolder.requestAttributes?.currentRequest?.mailUsername ?: super.getUsername()
  }

  public String getPassword() {
    return RequestContextHolder.requestAttributes?.currentRequest?.mailPassword ?: super.getPassword()
  }
}
beans = {
  mailSender(com.example.RequestCredentialsMailSender) {
    def mailConf = application.config.grails.mail
    host = mailConf.host
    port = mailConf.port
    username = mailConf.username // the default, if not set in request
    password = mailConf.password
    protocol = mailConf.protocol
    javaMailProperties = mailConf.props
  }
}
您必须在
参考资料.groovy中注册这个bean,并从邮件插件本身复制相当多的配置,这不太理想:

grails-app/conf/spring/resources.groovy

class RequestCredentialsMailSender extends JavaMailSenderImpl {
  public String getUsername() {
    return RequestContextHolder.requestAttributes?.currentRequest?.mailUsername ?: super.getUsername()
  }

  public String getPassword() {
    return RequestContextHolder.requestAttributes?.currentRequest?.mailPassword ?: super.getPassword()
  }
}
beans = {
  mailSender(com.example.RequestCredentialsMailSender) {
    def mailConf = application.config.grails.mail
    host = mailConf.host
    port = mailConf.port
    username = mailConf.username // the default, if not set in request
    password = mailConf.password
    protocol = mailConf.protocol
    javaMailProperties = mailConf.props
  }
}
现在,当您需要从控制器发送邮件时,您可以执行以下操作

request.mailUsername = Branch.get(2).mail
request.mailPassword = Branch.get(2).mailPassword
sendMail { ... }
您可以在主
Config.groovy

grails {
    mail {
        host = "smtp.gmail.com"
        port = 465
        username = "<changeme>"
        password = "<changeme>"
        props = [
            "mail.smtp.auth":"true",
            "mail.smtp.socketFactory.port":"465",
            "mail.smtp.socketFactory.class":"javax.net.ssl.SSLSocketFactory",
            "mail.smtp.socketFactory.fallback":"false"
        ]
    }
}
为了能够在运行时动态更改凭据,它变得相当复杂。在封面下,邮件插件创建了一个Springbean,它是的一个实例,用于处理电子邮件的实际发送,默认情况下,该bean通过配置中的静态设置进行配置。但在运行时,该类在每次需要发送消息时都会出现。因此,您可以用您自己的JavaMailSenderImpl自定义子类替换这个bean,该子类重写这些方法以从请求上下文中提取细节(代码示例,未测试,导入/错误处理省略):

src/groovy/com/example/RequestCredentialsMailSender.groovy

class RequestCredentialsMailSender extends JavaMailSenderImpl {
  public String getUsername() {
    return RequestContextHolder.requestAttributes?.currentRequest?.mailUsername ?: super.getUsername()
  }

  public String getPassword() {
    return RequestContextHolder.requestAttributes?.currentRequest?.mailPassword ?: super.getPassword()
  }
}
beans = {
  mailSender(com.example.RequestCredentialsMailSender) {
    def mailConf = application.config.grails.mail
    host = mailConf.host
    port = mailConf.port
    username = mailConf.username // the default, if not set in request
    password = mailConf.password
    protocol = mailConf.protocol
    javaMailProperties = mailConf.props
  }
}
您必须在
参考资料.groovy中注册这个bean,并从邮件插件本身复制相当多的配置,这不太理想:

grails-app/conf/spring/resources.groovy

class RequestCredentialsMailSender extends JavaMailSenderImpl {
  public String getUsername() {
    return RequestContextHolder.requestAttributes?.currentRequest?.mailUsername ?: super.getUsername()
  }

  public String getPassword() {
    return RequestContextHolder.requestAttributes?.currentRequest?.mailPassword ?: super.getPassword()
  }
}
beans = {
  mailSender(com.example.RequestCredentialsMailSender) {
    def mailConf = application.config.grails.mail
    host = mailConf.host
    port = mailConf.port
    username = mailConf.username // the default, if not set in request
    password = mailConf.password
    protocol = mailConf.protocol
    javaMailProperties = mailConf.props
  }
}
现在,当您需要从控制器发送邮件时,您可以执行以下操作

request.mailUsername = Branch.get(2).mail
request.mailPassword = Branch.get(2).mailPassword
sendMail { ... }

我只是想验证伊恩的答案并扩展它

在默认Config.groovy文件中,我添加了外部配置行:

 grails.config.locations = [
     "file:./${appName}-config.groovy",
     "classpath:${appName}-config.groovy"
     ]

....
// and here is the mail config as above
grails{
    mail{
.... 
在根级别的配置文件中,我有我的配置文件:TestApp-config.groovy(其中TestApp是我的应用程序的名称),如上所示:

grails {
  mail {
    username = "faruq@gmail.com"
    password = "12345"
  }
}

不需要任何超越这一点的东西,而且效果很好

只是想验证伊恩的答案并加以扩展

在默认Config.groovy文件中,我添加了外部配置行:

 grails.config.locations = [
     "file:./${appName}-config.groovy",
     "classpath:${appName}-config.groovy"
     ]

....
// and here is the mail config as above
grails{
    mail{
.... 
在根级别的配置文件中,我有我的配置文件:TestApp-config.groovy(其中TestApp是我的应用程序的名称),如上所示:

grails {
  mail {
    username = "faruq@gmail.com"
    password = "12345"
  }
}

不需要任何超越这一点的东西,而且效果很好

如果我们的目标仅仅是在特定的电子邮件Id上获得回复,那么我们也可以使用replyTo字段。我们可以动态地将电子邮件Id传递给“replyTo”字段,并且可以期望在同一个字段上返回电子邮件

例如:

asynchronousMailService.sendMail
{
至[”xyz@gmail.com","pqr@gmail.com"]
主题“主题文本”
如果(ccs)cc[”xyz1@gmail.com","pqr1@gmail.com"]
如果(密件抄送)密件抄送[”xyz2@gmail.com","pqr2@gmail.com"]
如果(replyTo)replyTo“xyz@gmail.com"
if(attachBytes)attachBytes attachBytes
}
注意:添加“replyTo”只允许我们使用指定的电子邮件id返回电子邮件,而不会从配置的电子邮件发送电子邮件


它适用于我的用例。希望有帮助

如果我们的目标仅仅是在特定的电子邮件Id上获得回复,那么我们也可以使用replyTo字段。我们可以动态地将电子邮件Id传递给“replyTo”字段,并且可以期望在同一个字段上返回电子邮件

例如:

asynchronousMailService.sendMail
{
至[”xyz@gmail.com","pqr@gmail.com"]
主题“主题文本”
如果(ccs)cc[”xyz1@gmail.com","pqr1@gmail.com"]
如果(密件抄送)密件抄送[”xyz2@gmail.com","pqr2@gmail.com"]
如果(replyTo)replyTo“xyz@gmail.com"
if(attachBytes)attachBytes attachBytes
}
注意:添加“replyTo”只允许我们使用指定的电子邮件id返回电子邮件,而不会从配置的电子邮件发送电子邮件


它适用于我的用例。希望有帮助

我的Email表名分支在这里我把我所有的emailid和密码,属性名都是mail和pass我如何配置这两个参数hi@Ian Roberts我修改我的question@OmarFaruq我在这里添加了一个可能使用的方法的概要。我的电子邮件表名分支在这里我放置了我所有的电子邮件ID和密码,属性名为mail and pass如何配置这两个参数hi@Ian Roberts i modify myquestion@OmarFaruq我在这里添加了一个您可以使用的可能方法的概要。当您说“动态”时,您是指基于部署站点(例如companyA、companyB等)还是基于域实例(例如,我的系统中的userX使用Gmail,所以通过Gmail发送他的电子邮件,userY使用Yahoo,所以通过Yahoo发送他的电子邮件,等等)?是的,当你说“动态”时,我也想要这个(如果可能),你的意思是基于部署站点(例如companyA、companyB等)还是基于域实例(例如,我的系统中的userX使用Gmail)