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