简单邮件收发系统
实验环境
Maven+Java Socket+JavaMail+wireshark
数据结构
1、Mail 类 封装一封邮件中所应包含的内容
2、serveSocket 用于接收客户连接请求,参数port指定服务器要绑定的端口(服务器要监听的端口),参数backlog指定客户连接请求队列的长度
3、MailSender类 用于发送邮件,构造器中封装了properties配置变量,sender() 方法,通过session与服务器进行交互建立transport ;createMimeMessage ()方法 用于封装一个邮件信息,使用MimeMessage类进行封装
4、Pattern 类是Java中用于编译正则表达式的类
5、Matcher 类是Java中用于执行匹配操作的类
定义参数变量
1、Session 用于收集JavaMail运行过程中的环境信息,解析上文提到的properties配置,找到对应配置信息
2、properties 配置邮件发送的主机,服务器,以及相关配置参数
3、用于读写的io:
1 | InputStream input = null; |
4、Map<String, String> JsonData 封装http返回的json数据键值对
5、String[] KeyWords 包含http消息体中关键词组
6、Map<String, String> FormData(String data) 利用 java.net.URLDecoder 对消息体消息进行解码
模块结构
1、serve 类 ==> 接收客户连接请求,获取连接ip和端口(远程服务器的端口),创建receive类,接收文件,并进行邮件转发
2、Receive类 ==> 通过http协议接收邮件内容,对发送者和接收者邮箱进行差错检查,创建Mail类,存储邮件消息,处理http消息体内容,并创建MailSender对象,进行邮件转发
3、Mail类 ==> 作为Bean 存储邮件消息
4、MailSender类 ==>接收邮件消息,创建properties配置,创建session读取配置,建立连接transport ,封装一封完整邮件,发送
算法流程
功能模块实现要点
1、接收Http消息时,需要区分消息头和消息体,中间会有空行,此时应隔开
2、消息体消息处理
wireshark抓包分析可知,均为json 键值对消息,使用Map来接收,同时消息体消息需要进行url解码,否则会出现乱码
3、关键消息的提取,通过用接收的数据与关键词数组进行匹配来接收数据
4、提取消息,消息可能包含很多其他内容,我们利用正则匹配和字符剪切获取我们所需信息
5、差错检查和处理,利用正则表达式对邮箱格式进行检查,若错误,返回错误信息
6、建立连接,利用session读取配置文件,同时开启debug,获得log信息,获取邮件传输对象
7、邮件的封装,利用MimeMessage类相关方法对邮件内容进行格式化封装
本机测试结果
设置代理,利用qq邮箱发送(可截个网址改为http的图)
wireshark抓包结果 上为http,下为smtp
输出的log信息
问题
1、处理http消息时,初始时为区分开消息头和消息体的提取,导致,读取时用时过长,且读取信息不够完整,此处耗时较久,后通过阅读http协议接收相关情况,解决
2、使用javamail发送邮件时,会由于读取邮件正文不完整,导致抛出空指针异常,后对接收邮件正文进行正则处理,解决
运行环境
jdk1.8
JavaMail1.4.7
Java activation1.1
代码配置
配置Maven pom.xml 文件 导入 JavaMail1.4.7 和 activation1.1
实现环境
windows10+FireFox(其他浏览器可能存在加密问题,导致抓不到包)