发送电子邮件和Spock Spring

365bet地区了解如何从365bet地区应用程序使用AWS SES和SendGrid发送电子邮件以及如何利用Spock Spring集成来验证交互

s塞尔吉奥·德尔阿莫

365bet地区版本 3.3.5

入门

您将需要什么

要完成本指南,您将需要以下内容

  • 花些时间在你手上

  • 体面的文本编辑器或IDE

  • 安装了JDK或更高版本JAVA首页适当配置

如何完成指南

要开始,请执行以下操作

要么

365bet地区指南存储库包含两个文件夹

  • 初始初始项目通常是一个简单的365bet地区应用程序,其中包含一些其他代码,可以帮助您快速入门

  • 完成一个完整的示例它是按照指南中介绍的步骤进行操作并将这些更改应用于文档的结果。初始

要完成指南,请转到初始

  • 光盘进入grails指南grails电子邮件初始

并按照下一节中的说明进行操作

您可以直接前往完成的例子如果你光盘进入grails指南grails电子邮件已完成

365bet地区如果要从头开始,请使用创建新的365bet地区应用程序365bet地区365bet地区应用伪造.

伪造默认

编写应用

使用创建一个应用轮廓

grails创建应用程序示例配置文件rest api

控制者

将条目添加到网址映射:

grails应用程序控制器示例grails UrlMappings groovy
例子 网址映射 {

    静态的映射帖子"邮件发送"(控制者: '邮件', 行动: '发送')
    }
}

创建MailController使用合作者emailService发送和发送电子邮件

grails应用程序控制器示例grails MailController groovy
例子 常规转换CompileStatic
 groovy util日志记录Slf j

自我
静态编译
 MailControllerEmailService emailService静态的allowedMethods发送: '开机自检']

    定义 发送EmailCmd cmd如果cmd hasErrors渲染状态: 422
            返回日志信息'{}'cmd toString电子邮件服务发送命令渲染状态: 200
    }
}

前一个控制器使用命令对象:

grails应用程序控制器示例grails EmailCmd groovy
例子 grails编译器365bet地区CompileStatic
 grails验证有效
 常规转换ToString

ToString
365bet地区CompileStatic
 EmailCmd 实施可验证的电子邮件接受者清单<抄送[]
    清单<密件抄送[]
    学科htmlBodytextBodyReplyTo静态的约束接收者可为空:  (1)学科可为空:   (2)htmlBody可为空: textBody可为空: , 验证器: { 做得好(3)obj htmlBody val replyTo可为空: 
    }
}
1 接受者是必须的
2 学科是必须的
3 您必须指定textBody要么htmlBody

电邮服务

创建一个界面电邮服务应用程序中存在的任何电子邮件集成都应实现它

src groovy主要示例grails EmailService groovy
例子 常规转换CompileStatic

静态编译
接口电邮服务虚空发送电子邮件
src groovy主要示例grails电子邮件groovy
例子 常规转换CompileStatic

静态编译
接口电子邮件getRecipient清单<getCc清单<getBccgetSubjectgetHtmlBodygetTextBodygetReplyTo

AWS SES

Amazon Simple Email Service Amazon SES是一种基于云的电子邮件发送服务,旨在帮助数字营销人员和应用程序开发人员发送营销通知和交易电子邮件。对于使用电子邮件与客户保持联系的各种规模的企业而言,这是一项可靠的经济高效的服务

有一个365bet地区AWS开发工具包SES 365bet地区插件但是,在本指南中,我们将直接集成AWS开发工具包SES

向AWS SES SDK添加依赖项

建立gradle
编译'com amazonaws好的java sdk ses'

添加可以通过系统属性命令行参数传递的配置属性

grails应用配置会议应用yml
是的:
    accessKeyId: 'AWS访问密钥ID'
    密钥: 'AWS密钥'
    sourceEmail: 'AWS源电子邮件'
    他的:
        区域: 'AWS地区'

创建两个服务以封装与SES的集成

grails应用程序服务示例grails AwsCredentialsProviderService groovy
例子 与amazonaws auth AWSCredentials
 与amazonaws auth AWSCredentialsProvider一起使用
 com amazonaws auth BasicAWSCredentials
 grails config配置
 grails核心支持365bet地区ConfigurationAware
 常规转换CompileStatic

静态编译
 AwsCredentialsProvider服务 实施365bet地区AWSCredentialsProvider 365bet地区ConfigurationAware(1)

    accessKey密钥覆写AWSCredentials getCredentials返回 BasicAWSCredentials accessKey secretKey覆写
    虚空刷新覆写
    虚空setConfiguration Config co这个accessKey co getProperty'AWS AccessKeyId', )
        如果 (!这个accessKey  IllegalStateException('没设置aws accessKeyId')
        }
        这个secretKey co getProperty'AWS SecretKey', )
        如果 (!这个密钥  IllegalStateException('未设置AWS SecretKey')
        }
    }
}
1 检索配置值365bet地区ConfigurationAware
grails应用程序服务示例grails AwsSesMailService groovy
例子 com amazonaws服务simpleemail模型SendEmailResult
 grails config配置
 grails核心支持365bet地区ConfigurationAware
 常规转换CompileStatic
 groovy util日志记录Slf j
 com amazonaws服务simpleemail AmazonSimpleEmailService
 com amazonaws服务simpleemail AmazonSimpleEmailServiceClientBuilder
 com amazonaws服务simpleemail模型主体
 com amazonaws服务simpleemail模型内容
 com amazonaws服务simpleemail模型目的地
 com amazonaws服务simpleemail模型消息
 com amazonaws服务simpleemail模型SendEmailRequest

自我
静态编译
 AwsSesMailService 实施365bet地区EmailService 365bet地区ConfigurationAware(1)

    awsRegionsourceEmail AwsCredentialsProviderService awsCredentialsProviderService覆写
    虚空setConfiguration Config co这个awsRegion co getProperty'是的地区')
        如果 (!这个awsRegion  IllegalStateException('未设置aws ses地区')
        }

        这个sourceEmail co getProperty'AWS SourceEmail')
        如果 (!这个sourceEmail  IllegalStateException('没设置aws sourceEmaill')
        }
    }

    私人的正文bodyOfEmail电子邮件电子邮件如果电子邮件htmlBody内容htmlBody内容随数据电子邮件htmlBody返回 HTML正文如果电子邮件textBody内容textBody内容与数据电子邮件文本正文返回 带有HTML文字的正文身体覆写
     虚空发送电子邮件如果awsCredentialsProviderService日志警告"未配置AWS Credentials提供程序")
            返回
        }

        目的地目的地 目的地withToAddresses电子邮件收件人如果电子邮件getCc目的地目的地与CcAddresses电子邮件getCc如果电子邮件getBcc目的地目的地,带有BccAddresses电子邮件getBcc内容主题内容与数据电子邮件getSubject正文body bodyOfEmail电子邮件消息消息带有主体主题的消息带有正文SendEmail请求请求SendEmailRequest withSource sourceEmail withDestination目标withMessage消息如果电子邮件getReplyTo通过ReplyToAddresses请求请求日志信息"尝试使用适用于Java的AWS开发工具包通过Amazon SES发送电子邮件"AmazonSimpleEmailService客户端AmazonSimpleEmailServiceClientBuilder标准withCredentials awsCredentialsProviderService withRegion awsRegion构建SendEmailResult sendEmailResult客户端sendEmail请求日志信息"邮件已发送"sendEmailResult toString抓住 (例外事前警告"电子邮件未发送"日志警告"错误信息"留言
1 检索配置值365bet地区ConfigurationAware

送电网

送电网是一种交易电子邮件服务

SendGrid负责为世界上一些最好,最聪明的公司发送数十亿封电子邮件

有一个365bet地区SendGrid 365bet地区插件但是,在本指南中,我们将直接集成AWS开发工具包SES

向SendGrid SDK添加依赖项

建立gradle
编译'与sendgrid sendgrid java'

添加可以通过系统属性命令行参数传递的配置属性

grails应用配置会议应用yml
送电网:
    apiKey: 'SENDGRID API密钥'
    来自电子邮件: '来自电子邮件的SENDGRID'

创建一个封装与SendGrid集成的服务

grails应用程序服务示例grails SendGridEmailService groovy
例子 与sendgrid个性化
 与sendgrid内容
 与sendgrid Mail
 与sendgrid SendGrid
 与sendgrid请求
 与sendgrid响应
 使用sendgrid方法
 grails config配置
 grails核心支持365bet地区ConfigurationAware
 常规转换CompileStatic
 groovy util日志记录Slf j

自我
静态编译
 SendGridEmailService 实施EmailService 365bet地区ConfigurationAware(1)

    apiKey来自电子邮件覆写
    虚空setConfiguration Config co这个apiKey co getProperty'sendgrid apiKey', )
        如果 (!这个apiKey  IllegalStateException('未设置sendgrid apiKey')
        }
        这个fromEmail co getProperty'从电子邮件发送网格', )
        如果 (!这个来自电子邮件  IllegalStateException('未设置sendgrid apiKey')
        }
    }

    受保护的内容contentOfEmail电子邮件电子邮件如果电子邮件textBody返回 内容"纯文字"电子邮件textBody如果电子邮件htmlBody返回 内容"文字HTML"电子邮件htmlBody返回 空值
    }

    覆写
    虚空发送电子邮件电子邮件个性化个性化个性化个性化主题电子邮件主题com sendgrid电子邮件至com sendgrid电子邮件电子邮件收件人的个性化添加到如果电子邮件getCc对于 ( cc电子邮件getCc com sendgrid电子邮件ccEmailcom sendgrid电子邮件ccEmail电子邮件cc个性化addCc ccEmail如果电子邮件getBcc对于 ( 密件抄送电子邮件getBcc com sendgrid电子邮件密件抄送电子邮件com sendgrid电子邮件bccEmail电子邮件bcc个性化addBcc bccEmail邮件邮件Mail com sendgrid电子邮件来自com sendgrid来自电子邮件的电子邮件来自电子邮件的电子邮件来自邮件的电子邮件addPersonalization个性化内容内容contentOfEmail电子邮件邮件addContent内容SendGrid sgSendGrid apiKey请求请求请求请求方法方法POST端点"邮件发送"正文邮件构建响应响应sg api请求日志信息"状态码", valueOf响应getStatusCode日志信息"身体"响应getBody如果日志infoEnabled响应getHeaders每个v日志信息"响应标题"v抓住 (IOExceptionex日志错误ex getMessage
1 检索配置值365bet地区ConfigurationAware

资源资源

365bet地区365bet地区与春季框架.

您可以通过在中配置它们来轻松注册新的或覆盖现有的beangrails app conf春季资源groovy使用365bet地区365bet地区 Spring DSL.

根据所需系统属性的存在,我们将启用SendGrid或AWS SES集成

grails app conf春季资源groovy
 示例graws AwsSesMailService
 示例grails SendGridEmailService豆子如果 ( 系统getProperty'AWS地区') && 系统getProperty'AWS源电子邮件') && 系统getProperty'AWS访问密钥ID') && 系统getProperty'AWS密钥'emailService AwsSesMailService awsCredentialsProviderService ref'awsCredentialsProvider服务')
        }
    } 其他 如果 ( 系统getProperty'来自电子邮件的SENDGRID') && 系统getProperty'SENDGRID API密钥'emailService SendGridEmailService

添加记录器以获得更多可见性

365bet地区应用程序配置会议日志回切
日志'例子'信息'标准输出'], )

要使用SendGrid,请使用必要的系统属性启动应用程序

要使用AWS SES,请使用必要的系统属性启动应用程序

Gradlew DAWS REGION欧盟西部电子邮件保护DAWS访问密钥ID XXXXXXXX DAWS秘密密钥XXXXXXXX bootRun

测试

在我们的验收测试中,我们不需要豆emailService成为SendGridEmailService要么AwsSesMailService相反,我们希望它是一个Mock,我们可以根据它来验证交互

斯波克春天模块提供了将Spock模拟和存根定义为Spring bean的支持

将依赖项添加到斯波克春天:

建立gradle
测试编译'组织spockframework spock spring groovy'

首先,您需要注释应用程序组件扫描.

grails应用程序初始化示例grails应用程序groovy
例子 365bet地区grails启动365bet地区App
 365bet地区grails启动配置365bet地区AutoConfiguration
 常规转换CompileStatic
 org springframework上下文注释ComponentScan

组件扫描('例子')
静态编译
 应用 延伸365bet地区AutoConfiguration静态的 虚空主要[]365bet地区args 365bet地区App运行应用程序args

在下一个测试中,我们使用带有注释的嵌入式配置测试配置我们创建一个电邮服务分离模拟工厂.

src集成测试groovy示例grails MailControllerSpec groovy
例子 grails插件rest client RestBuilder
 grails插件其余客户端RestResponse
 grails测试mixin集成集成
 org springframework bean工厂注释自动装配
 org springframework bean工厂注释限定符
 org springframework引导测试上下文TestConfiguration
 org springframework上下文注释Bean
 spock lang规格
 spock模拟DetachedMockFactory

积分
 MailControllerSpec 延伸规格EmailService emailService定义 "电子邮件发送后,邮件发送就会互动"() {
        给定RestBuilder的休息RestBuilder的什么时候RestResponse响应休息帖子"HTTP本地主机${服务器端口}邮件发送"接受'应用程序json''应用程序json'json主题'测试'接受者'电子邮件保护'textBody'你好'
            }
        }

        然后状态200
        1emailService发送(1)

    }

    测试配置
    静态的  EmailServiceConfiguration {
        私人的DetachedMockFactory工厂分离模拟工厂豆角,扁豆EmailService emailService工厂模拟EmailService
1 emailService发送

学习更多关于Spring Spock集成在Spock文档中

您需要365bet地区帮助吗

365bet地区服务:

免费咨询

OCI 365bet地区团队包括365bet地区联合创始人检查我们的并向发展和维护365bet地区的工程师学习

Grails OCI团队