新增TinyMessage,并实现邮件接收处理

序言

我们在业务处理过程中,经常要处理各种信息,比如:站内信息、邮件信息、还可能有短信、彩信,甚至可能与各种IM软件进行对立的信息系统。

Tiny框架也需要面对这个问题,不一样的是我觉得这几种类型的信息处理模式都是一样的,因此试图采用统一的模式进行处理。

在开始之前,我们先梳理一下需求:

  • 可以支持各种信息系统如:短信,彩信,邮件,IM,站内信息的接收与发送
  • 在接收或发送消息的时候可以进行各种逻辑处理,比如:收到某种类型的邮件怎么处理,收到某种内容的短信怎么处理。
  • 邮件收到的时候,可以不删除,可以删除,也可以改成已读等各种状态
  • 发送邮件的时候,可以附加各种附件,比如:来自文件的,来自内存的等等

概念抽象

因此,我们就抽象了下面的几个概念:

085916_Vhc7_1245989.jpg (13.4 KB, 下载次数: 0)

下载附件

2015-5-27 21:20 上传

  • MessageAccount:接收信息或发送信息时,需要帐户,因此抽象一个信息帐户概念。
  • MessageReceiver:信息接收者
  • MessageSender:信息发送者
  • Message:要发送的信息,对应于邮件,短信,彩信之类
  • MessageReceiveService:用于提供信息发送服务
  • MessageSendService:用于提供信息接收服务
  • MessageException:用于在出现问题的时候,抛出异常
  • MessageSendProcessor:用于在发送信息的时候根据信息触发一些操作
  • MessageReceiveProcessor:用于在接收信息的时候根据信息触发一些操作
  • MessageManager:用于进行信息接收与发送



行为分析

当然,上面的概念的建立不是为了看看的,是要在我们的信息框架中参与的,当然它们中的一些就有一些行为,下面我们就分析一下这些概念的行为有哪些:

090755_w4fP_1245989.jpg (54.15 KB, 下载次数: 0)

下载附件

2015-5-27 21:20 上传

下面一个一个来分析一下:

  • MessageAccount:由于不同的信息模式,信息收发的帐号情况,并不一致,因此这里就只放个接口,没有办法进一步约束。同样的,MessageSender,Message,MessageReceiver也一样,因此,它们就是个空接口,把问题交给其后代来处理。
  • MessageReceiveServer:用于接收信息,只有一个方法,返回信息。
  • MessageSendService:用于发送信息,只有一个方法。
  • MessageSendProcessor:用于在发送信息的时候根据信息情况触发一些操作,一个方法用于判断是否命中,一个进行真正的处理。
  • MessageReceiveProcessor:用于在接收信息的时候根据信息情况触发一些操作,一个方法用于判断是否命中,一个进行真正的处理。
  • MessageManager:它其实是对MessageReceiveService和MessageSendService的进一步封装,在这里提供了事件触发的一些扩展。

在底层,只有MessageManager是有实现类的,即MessageManagerDefault,这也正常,由于其它的都不确定,所以就没法实现了。

到时为此,信息处理的底层抽象与设计就算完成了。



实现案例-Email收发

093736_NRBE_1245989.jpg (59.22 KB, 下载次数: 0)

下载附件

2015-5-27 21:20 上传

到了收发邮件,因为已经是具体问题,因此上次留给子孙解决的问题,都可以解决了。

由于javax.email只是其中的一种可选方案,因此,在这里没有直接暴露任何与javax.email相关的接口,这样就更方便针对不同邮件API进行实现。

值得一提的是这里引入了一个新的接口:

EmailMessageFlagMarker:用来在收邮件时对邮件的状态进行不同的标示,这是因为不能简单的把收到到的邮件标示成删除或已读,可能要根据许多种情况进行判断。

邮件收发实例邮件接收

  1. public static void main(String[] args) throws MessageException {
  2. MessageManager<EmailMessageAccount, EmailMessageSender, EmailMessageReceiver, EmailReceiveMessage> messageManager = new MessageManagerDefault();
  3. EmailMessageAccount account = new EmailMessageAccount();
  4. account.setHost("127.0.0.1");
  5. account.setUsername("[email protected]");
  6. account.setPassword("123456");
  7. messageManager.setMessageAccount(account);
  8. EmailMessageReceiveService messageReceiveService = new EmailMessageReceiveService();
  9. MessageReceiveService receiveService=messageReceiveService;
  10. MessageSendService messageSendService = new EmailMessageSendService();
  11. messageManager.setMessageReceiveService(receiveService);
  12. messageManager.setMessageSendService(messageSendService);
  13. messageReceiveService.setEmailMessageFlagMarker(new RemoveAllEmailMessageFlagMarker());
  14. Collection<EmailReceiveMessage> messages = messageManager.getMessages();
  15. for (EmailReceiveMessage message : messages) {
  16. System.out.println("subject:" + message.getMessage().getSubject());
  17. System.out.println("content:" + message.getMessage().getContent());
  18. System.out.println("附件:" + message.getMessage().getAccessories().size());
  19. System.out.println("=============================================");
  20. }
  21. }

复制代码

邮件发送示例

  1. public static void main(String[] args) throws IOException, MessageException {
  2. MessageManager<EmailMessageAccount, EmailMessageSender, EmailMessageReceiver, EmailMessage> messageManager = new MessageManagerDefault();
  3. EmailMessageAccount account = new EmailMessageAccount();
  4. account.setHost("127.0.0.1");
  5. account.setUsername("[email protected]");
  6. account.setPassword("123456");
  7. EmailMessageSendService sendService = new EmailMessageSendService();
  8. EmailMessageSender messageSender = new EmailMessageSender();
  9. messageSender.setDisplayName("罗果");
  10. messageSender.setEmail("[email protected]");
  11. EmailMessageReceiver messageReceiver = new EmailMessageReceiver();
  12. messageReceiver.setDisplayName("罗果");
  13. messageReceiver.setEmail("[email protected]");
  14. EmailMessage emailMessage = new EmailMessage();
  15. emailMessage.setSubject("test1111111");
  16. emailMessage.setContent("中华人民共和国");
  17. EmailAccessory accessory = new EmailAccessory(new File("D:/RUNNING.txt"));
  18. emailMessage.getAccessories().add(accessory);
  19. messageManager.setMessageAccount(account);
  20. MessageReceiveService messageReceiveService = new EmailMessageReceiveService();
  21. MessageSendService messageSendService = new EmailMessageSendService();
  22. messageManager.setMessageReceiveService(messageReceiveService);
  23. messageManager.setMessageSendService(messageSendService);
  24. Collection<EmailMessageReceiver> receivers = new ArrayList<EmailMessageReceiver>();
  25. receivers.add(messageReceiver);
  26. messageManager.sendMessage(messageSender, receivers, emailMessage);
  27. }

复制代码

上面看起来比较复杂,实际是都是在构建Bean,如果是把Bean配在IOC容器中,就会非常简单了。

总结

通过对各种信息的接收与发送进行分析,对信息处理进行了上层抽象,并简单的进行实现就可以实现各种信息的收发处理。

由于对各种信息处理都采用了统一的接口,在需要进行各种信息都要进行接收或发送的时候,开发人员就会非常方便。

所有的源码都可以在:http://git.oschina.net/tinyframework/tiny/tree/master/framework/org.tinygroup.message找到,感兴趣的童鞋可以前去查阅。

时间: 2024-10-31 14:33:16

新增TinyMessage,并实现邮件接收处理的相关文章

邮件接收中Postfix、Dovecot、Squirrelmail、MySQL、AMaVis、Clam AntiVirus和SpamAssasin的功能解析

参考网址的教程:https://workaround.org/ispmail/lenny/bigpicture 邮件接收过程中各个软件的功能分布流程 在收发电子邮件的过程中,Postfix.Dovecot.Squirrelmail.MySQL.AMaVis.Clam AntiVirus和SpamAssasin的功能分类流程图如下所示: 电子邮件采用SMTP协议,通过TCP端口25进入邮件服务器.Postfix通过监控这个端口,接收电子邮件并进行一些基本检查.这些检查比如:发件人是否在黑名单?邮件

基于Lumisoft.NET组件的POP3邮件接收和删除操作

Lumisoft.NET组件是一个非常强大的邮件发送.邮件接收等功能的开源组件,一般用它来处理邮件的相关操作,是非常合适的.之前也写过一些该组件的随笔文章,不过主要是利用来发送邮件居多,最近由于项目需要,需要利用该组件来接收邮件,邮件通过POP3协议进行接收到本地,故对该组件进行了全面的了解和使用.本文主要是在此背景上,介绍该组件的POP3协议处理类的使用.Lumisoft.NET组件2013年作者有做了一定的更新,修复了一些问题,本文是基于该组件的最新版本进行开发使用. 1.POP3登录及头部

C#邮件接收系统核心代码(接收POP3邮件IMAP邮件)

/* * Created by SharpDevelop. * User: Administrator * Date: 2013/11/18 * Time: 20:55 * * To change this template use Tools | Options | Coding | Edit Standard Headers. */ using System; using System.Linq; using System.IO; using System.Collections.Gener

javaMail邮件接收解析内容及附件 及删除邮件

参考自:  http://blog.csdn.net/xyang81/article/details/7675160 package com.szy.project.utils; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStr

C#基础--基于POP3协议的邮件接收和基于STMP的邮件发送

最近在用outlook同步邮件.对邮件协议有一点兴趣.于是就去收集了一些资料,学习了一下如何通过.net来实现邮件的收发.    一:SMTP协议  1.什么是SMTP协议:       SMTP目前已是事实上的在Internet传输E-Mail的标准,是一个相对简单的基于文本的协议.在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确定是存在的),然后消息文本就传输了.可以很简单地通过Telnet程序来测试一个SMTP服务器,SMTP使用TCP端口25.要为一个给定的域名决定一个SMT

JavaMail邮件接收小例子

package demo2; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Properties; import javax.mail.Folder; import javax.mail.Message; import javax.mail.Session; import javax.mail.Store; public class JavaMailDemo1 { public

Linux中Postfix邮件接收配置(四)

Dovecot介绍 MRA邮件取回代理也有很多如courier-imap,cyrus-imap和dovecot这三个个工具,下面重点介绍Dovecot: 1.高安全性.据 Dovecot 的作者声称,从 Dovecot 的设计和实现,安全性都是被高度关注和强调的.这里的安全性不单单指传统意义的安全漏洞,也包括软件的可靠性.而 Dovecot 高安全性的最佳佐证,就是"悬赏".Dovecot 作者从 2006 年开始,对于第一个能够发现"remotely exploitable

JavaWeb学习总结(五十一)——邮件的发送与接收原理

一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.sohu.163等等他们都有自己的邮件服务器. 这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中. 电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请,确切地说,电子邮箱其实就是用户在邮件服务器上申请的一个账户,用户在邮件服务器上申请了一

深入分析JavaWeb Item41 -- 邮件的发送与接收原理

一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.sohu.163等等他们都有自己的邮件服务器. 这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中. 电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请,确切地说,电子邮箱其实就是用户在邮件服务器上申请的一个账户,用户在邮件服务器上申请了一