发送电子邮件和Spock Spring

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

s塞尔吉奥·德尔阿莫

365bet地区版本 4.0.1

入门

您将需要什么

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

  • 花些时间在你手上

  • 体面的文本编辑器或IDE

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

如何完成指南

要开始,请执行以下操作

要么

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

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

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

要完成指南,请转到初始

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

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

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

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

伪造默认

编写应用

使用创建一个应用休息api轮廓

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
例子 365bet地区grails编译器365bet地区CompileStatic
 grails验证有效
 常规转换ToString

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

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

例子 常规转换CompileStatic

静态编译
接口电邮服务虚空发送电子邮件
例子 常规转换CompileStatic

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

AWS SES

向AWS SES SDK添加依赖项

建立gradle
编译'亚马逊awssdk ses软件'

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

grails应用配置会议应用yml
是的:
    他的:
        资源: 'AWS源'
        区域: 'AWS地区'

创建一项封装与SES集成的服务有几种提供编程凭据的方法

客户端使用默认证书提供者链按以下顺序搜索证书

在Java系统属性中,aws accessKeyId和AWS secretKey

在系统环境变量中,AWS ACCESS KEY ID和AWS SECRET ACCESS KEY

在默认凭据文件中,此文件的位置因平台而异

在Amazon ECS环境变量中,AWS CONTAINER CREDENTIALS相对URI

在实例配置文件中,凭据存在于与EC实例的IAM角色关联的实例元数据中

grails应用程序服务示例grails AwsSesMailService groovy
例子 grails config配置
 365bet地区grails核心支持365bet地区ConfigurationAware
 常规转换CompileStatic
 groovy util日志记录Slf j
 亚马逊地区awssdk软件地区
 软件Amazon awssdk服务ses SesClient
 软件亚马逊awssdk服务ses模型主体
 软件amazon awssdk服务ses模型内容
 软件亚马逊awssdk服务ses模型目的地
 软件Amazon awssdk服务ses模型消息
 软件Amazon awssdk服务ses模型SendEmailRequest
 软件amazon awssdk服务请参见模型SendEmailResponse

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

    sourceEmail SesClient sesClient覆写
    虚空setConfiguration Config coawsRegion co getProperty'是的地区')
        如果awsRegion  IllegalStateException('未设置aws ses地区')
        }
        这个sesClient SesClient构建器区域区域的awsRegion版本这个sourceEmail co getProperty'是的来源', '')
        如果 (!这个sourceEmail日志警告'没设置aws sourceEmail')
        }
    }

    私人的正文bodyOfEmail电子邮件电子邮件如果电子邮件htmlBody内容htmlBody内容构建器数据电子邮件htmlBody生成返回车身制造商html htmlBody build如果电子邮件textBody内容textBody内容构建器数据电子邮件textBody生成返回正文生成器文本textBody生成正文生成器私人的 目的地目的地电子邮件电子邮件目的地建造者的目的地目的地构建器toAddresses电子邮件收件人如果电子邮件getCc destinationBuilder destinationBuilder ccAddresses电子邮件getCc如果电子邮件getBcc destinationBuilder destinationBuilder bcc地址电子邮件getBcc destinationBuilder构建私人的消息compose消息电子邮件电子邮件内容主题内容构建器数据电子邮件getSubject构建主体body bodyOfEmail电子邮件消息构建器主题主体正文覆写
     虚空发送电子邮件尝试 {
            目的地目标目的地电子邮件消息消息composeMessage电子邮件SendEmailRequest sendEmailRequest SendEmailRequest构建器源sourceEmail目标目的地消息消息构建SendEmailResponse响应sesClient sendEmail sendEmailRequest日志信息"邮件已发送"响应messageId抓住 (例外事前警告"电子邮件未发送"日志警告"错误信息"留言
1 检索配置值365bet地区365bet地区ConfigurationAware

送电网

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

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

向SendGrid SDK添加依赖项

建立gradle
编译'与sendgrid sendgrid java'

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

grails应用配置会议应用yml
送电网:
    : '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)

    覆写
    虚空setConfiguration Config co这个api co getProperty'火警', )
        如果 (!这个  IllegalStateException('未设置sendgrid api')
        }
        这个来自co getProperty'sendgrid来自', )
        如果 (!这个  IllegalStateException('未设置sendgrid apiKey')
        }
    }

    覆写
    虚空发送电子邮件电子邮件邮件邮件构建电子邮件电子邮件SendGrid sgSendGrid API请求请求请求尝试请求方法方法POST端点"邮件发送"正文邮件构建响应响应sg api请求日志信息"状态码", valueOf响应getStatusCode日志信息"身体"响应getBody如果日志infoEnabled响应getHeaders每个v日志信息"响应标题"v抓住 (IOExceptionex日志错误ex getMessage私人的内容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 buildEmail电子邮件email个性化个性化build个性化电子邮件Mail邮件Mail com sendgrid电子邮件来自com sendgrid电子邮件来自电子邮件来自邮件来自邮件addPersonalization个性化内容内容contentOfEmail电子邮件mail addContent内容邮件
1 检索配置值365bet地区365bet地区ConfigurationAware

资源资源

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

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

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

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

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

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

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

Gradlew电子邮件保护SENDGRID API密钥XXXXXX bootRun

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

导出AWS ACCESS KEY ID XXXXXXXX导出AWS SECRET ACCESS KEY XXXXXXXX gradlew DAWS REGION eu west电子邮件保护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地区365bet地区AutoConfiguration静态的 虚空主要[]365bet地区args 365bet地区App运行应用程序args

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

src集成测试groovy示例grails MailControllerSpec groovy
例子 grails测试mixin集成集成
 365bet地区测试Spock一次
 io micronaut http HttpStatus
 org springframework引导测试上下文TestConfiguration
 org springframework上下文注释Bean
 spock lang共享
 io micronaut http HttpRequest
 io micronaut http HttpResponse
 io micronaut http客户端HttpClient
 spock lang规格
 spock模拟DetachedMockFactory

积分
 MailControllerSpec 延伸规格共享HttpClient客户端EmailService emailService之前
    虚空在里面的baseUrl"HTTP本地主机$服务器端口"
        这个HttpClient的客户创造的baseUrl的toURL定义 "电子邮件发送后,邮件发送就会互动"() {
        什么时候HttpRequest请求HttpRequest POST'邮件发送', [
                学科: '测试',
                接受者: '电子邮件保护',
                textBody: '你好'HttpResponse响应客户端到阻止交换请求然后分别显示HttpStatus状态1emailService发送(1)
    }

    测试配置
    静态的  EmailServiceConfiguration {
        私人的DetachedMockFactory工厂分离模拟工厂豆角,扁豆EmailService emailService工厂模拟EmailService
1 emailService发送方法被调用一次

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

您需要365bet地区帮助吗

365bet地区服务:

免费咨询

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

Grails OCI团队