JavaMail详解(十)——应用实战,邮件监听 - 高飞网
59 人阅读

JavaMail详解(十)——应用实战,邮件监听

2016-11-24 16:00:30

    通过前面的介绍,大家已经对用JavaMail来开发简单的收发邮件应用没有问题了,下面从实际情况出发,看一下笔者经历过的一个邮件项目。

背景

    现在公司的销售在工作中遇到问题时(可能是技术方面,也可能是产品问题),就会发邮件到公司的支持团队的邮箱中,支持团队在接收到问题邮件后,会给出相应的解答。但这个流程还有一定的问题:

  1. 销售提出问题以后,不能及时了解到问题的进度
  2. 无法排除提相同或相似的问题
  3. 事后无法自动化的对支持团队进行业务考核

方案

    建立一套问答系统

  1. 由销售提出问题,支持团队回答问题
  2. 支持团队看到问题时,会到问题设置一个已读状态
  3. 如果支持团队无法立即解决,可以设置几小时解决
  4. 如果支持团队回答问题,销售可以看到回答内容,并可以继续追问
  5. 如果支持团队自身无法处理,而需要其他部门同事处理,就需要把该问题转发给其他同事
  6. 销售可以将问题置为完成

    问答系统是建立了,但这个系统有个限制,即只能在公司网内使用,不能在公网使用,如果在公司,也必须使用VPN,但销售可能在发问题时并不在公司,考虑到销售登录公司这套系统的不方便性,因此需要同时支持销售端使用邮件来提问和追问,同时在邮件的关键环节,如问题收到回答,问题完成等需要邮件通知。这里就用到了对邮箱的读取监听和邮件发送转发等。

技术设计

    系统自设一个轮询,对指定的邮箱,如Inbox进行监听,监听到邮件到来时,就读取邮件并放入一个缓冲池中,分发器从缓冲池中得到队列中的邮件,发通知给应用端。


 监听器

    监听器的设计,可以通过配置文件配置要监听的邮件地址和要读取的邮箱,在系统启动时进行轮询监听。如何依次往后读取邮件,我这里采用的是messageNumber,它是邮件相对于Folder的位置,每次读到指定num的消息后,将位置存起来,下次轮询拿出来继续读取。

    如果系统是单点的比较简单,如果是集群部署,要确定只有一个节点进行轮询,这里可以使用zk的选举

    该部分的对mail的应用,还有内容解析部分,目前实现了邮件内容分析,包含了文本内容和图片,可以看这篇博客:JavaMail实战——内容解析(包含文本、图片),解析完后,会发现有个问题,就是邮件可能含有原始邮件的内容,如下:


    如上,我想要的只是“怎么回事”这句,对于附带着的历史邮件,而需要去掉,关于这个问题,可以看这篇博客:JavaMail实战——内容解析,如何去除历史内容,只收取本次内容


消息缓冲池

    这个可以用NoSQL来实现,当然也可以使用持久化存储,但尽量不要使用内存,因为在系统重启时,可能会丢失池中的消息。这里使用redis,好处是既有性能上的优势,同时还有持久化的能力。加之它丰富的数据结构,可以阻塞的读取等。

分发器

    分发器也是个轮询,如果redis是单点的,可以使用redis的发布订阅模式。这里之能轮询了。从缓存中得到消息以后,可以通过如ActiveMQ的消息中间件类通知应用方。


还没有评论!
54.204.219.143