博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用Akka Http,ActiveMQ搭建一个邮件发送服务器
阅读量:5996 次
发布时间:2019-06-20

本文共 4052 字,大约阅读时间需要 13 分钟。

hot3.png

代码地址:

应用功能是实现一个基于队列的邮件发送服务,每个邮件发送者(使用smtp协议)作为一个sender。多个sender可以在同一个组(group)中,每个组中的sender将串行发送邮件。

邮件内容可以通过REST API提交,以可以使用JMS发布到ActiveMQ中,邮件服务器将从中读取邮件内容。

快速开始

配置:

推荐在启动时使用-Dapplication.file=/usr/app/etc/emailserver/application.conf指定配置文件

emailserver {  server {    interface = "0.0.0.0"    port = 9999  }  emails {    email1 {      userName = "email1@email.com"      password = ""      smtp = ""      smtpPort = 0      ssl = true      # 同一个组内的邮件会串行发送,此key可忽略      group = "1"    }    email2 {      userName = "email2@email.com"      password = ""      smtp = ""      smtpPort = 0      ssl = true      group = "2"    }  }  activemq {    url = "tcp://127.0.0.1:61616"    emailQueueName = "EmailQueue"  }}

emails定义邮件发送者(可用于stmp服务进行邮件发送的邮箱信息)。可以定义多个邮件发送者,但每个邮件发送者的key不能相同。比如:email1email2

activemq定义了ActiveMQ服务的连接参数。

编译与运行:

# 编译./sbt assembly# 运行java -Dapplication.file=/usr/app/etc/emailserver/application.conf -jar target/scala-2.11/email-server.jar

测试REST服务:

# 查询存在的邮箱发送者:curl http://localhost:9999/email/users# 发送测试邮件curl -v -XPOST -H "Content-Type: application/json" \  -d '{"sender":"Info@email.cn", "subject":"测试邮件","to":["user1@email.cn", "user2@email.cn"],"content":"测试邮件内容咯~"}' \  http://localhost:9999/email/send

使用JMS发送邮件:

安装activemq

Downloads:http://mirrors.hust.edu.cn/apache/activemq/5.11.1/apache-activemq-5.11.1-bin.tar.gztar zxf ~/Downloads/apache-activemq-5.11.1-bin.tar.gzcd apache-activemq-5.11.1/./bin/activemq-admin start

activemq管理控制台地址:,账号:admin,密码:admin

JMS TCP地址:tcp://localhost:61616

生产测试邮件

修改的activeMqUrlmapMessage参数,运行EmailProducers生产一个邮件发送请求。

Akka Http

Akka Http是一个完整的serverclient端HTTP开发栈,基于akka-actorakka-stream。它不是一个WEB框架,而是提供了可以构建Http服务的工具包。

Akka Http有一套很直观的DSL来定义路由,自然的形成了一个树型的路由结构。如:

pathPrefix("email") {  path("send") {    post {      entity(as[JsValue].map(_.as[SendEmail])) { sendEmail =>        onComplete(emailService.sendEmail(sendEmail)) {          case Success(value) =>            value match {              case Right(msg) => complete(msg)              case Left(msg) => complete(StatusCodes.Forbidden, msg)            }          case Failure(e) => complete(StatusCodes.InternalServerError, "SendEmail an error occurred: " + e.getMessage)        }      }    }  } ~    path("users") {      get {        onComplete(emailService.getEmailSenders) {          case Success(emailSenders) => complete(Json.toJson(emailSenders))          case Failure(e) => complete(StatusCodes.InternalServerError, "An error occurred: " + e.getMessage)        }      }    }}

path -> post -> entity -> complete 式的函数嵌套,很直观的定义出了声明式的树型REST URI结构,层次分明、逻辑清晰。entity函数用于解析Http Body,将其映射成希望的数据类型,可自定义映射方法。

onComplete函数用在返回类型是一个Future[T]时,提供了快捷的方式把一个Future[T]类型的响应转换到complete

邮件发送

邮件的发送采用了串行发送的方式,这个模式刚好契合Actor默认邮箱的FIFO处理形式。把收到的邮件发送请求告诉一个actoractor再从邮箱里取出,并组装成XXXXEmail(邮件发送使用了)后发送出去。

首先,程序将收到的邮件发送请求交给,EmailMaster再根据邮件发送者(连接SMTP的邮箱用户名)来决定将这个发送请求交给哪一个具体的。

这里,程序对邮件发送者(简称:sender)做了一个分组。因为对于使用相同smtp邮件发送服务提供的sender,程序中最后对此类的sender做串行发送。而对于不同smtp邮件发送服务提供的sender,我们可以并发的发送邮件。这个可以通过在定义配置文件的时候指定特定sender属于的邮件发送组。

emails {    email1 {      userName = "email1@email.com"      password = ""      smtp = ""      smtpPort = 0      ssl = true      # 同一个组内的邮件会串行发送,此key可忽略      group = "1"    }  }

连接ActiveMQ

连接ActiveMQ使用了JMS协议,这是一个Java EE标准实现的消息队列。代码在:。

JMS里,邮件使用MapMessage消息发送,程序使用case match来匹配期望的消息格式。

val listener = new MessageListener {  override def onMessage(message: Message): Unit = message match {    case msg: MapMessage => {      val subject = msg.getString("subject")      val sender = msg.getString("sender")      val content = msg.getString("content")      val to = msg.getString("to").split(";")      val mimeType = Option(msg.getString("mimeType")).map(MimeType.withName).getOrElse(MimeType.Text)      val sendEmail = SendEmail(sender, subject, to, content, None, mimeType)      emailService.sendEmail(sendEmail).onComplete(result => logger.debug(result.toString))    }

总结

本文简单的演示了Akka Http构建一个REST服务,并支持连接JMS Server来获取发送邮件消息。

演示了文件邮件和HTML格式邮件的发送。

接下来

接下来可以添加对邮件附件的支持,这个功能可以留给读者去实现。

转载于:https://my.oschina.net/yangbajing/blog/491790

你可能感兴趣的文章
自定义URL规则,URL传参
查看>>
关于加速和优化网页设计的文档收集
查看>>
Linux无法登录,提示module is unknown并闪退
查看>>
Calendar 日期类的使用
查看>>
Zookeeper-Watcher机制与异步调用原理
查看>>
RAID详解[RAID0/RAID1/RAID10/RAID5]
查看>>
解决ADT大量出现"Unexpected value from nativeGetEnabledTa
查看>>
借问主机怎样购?空间稳定必须有
查看>>
vue.js快速上手。
查看>>
Android listview与adapter用法(BaseAdapter + getView)
查看>>
ViewPager + Fragment实现滑动标签页
查看>>
android 随记
查看>>
给ecmall商城加上店铺浏览次数
查看>>
让history记录命令的历史执行时间
查看>>
TiDB 2.1 GA Release Notes
查看>>
Android------Button 添加声音效果(两种方式)
查看>>
Out of Memory PermGen
查看>>
Flex 布局教程:语法篇
查看>>
获取屏幕快照 截图
查看>>
大众点评Cat源码分析(三)——数据文件(MessageTree)读写磁盘详细逻辑
查看>>