实验环境

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
2
3
4
5
InputStream input = null;
InputStreamReader inputStreamReader = null;
OutputStream output = null ;
PrintWriter writer = null;
BufferedReader reader = 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 ,封装一封完整邮件,发送

算法流程

NetWork.png

功能模块实现要点

1、接收Http消息时,需要区分消息头和消息体,中间会有空行,此时应隔开

image.png

2、消息体消息处理

image.png

wireshark抓包分析可知,均为json 键值对消息,使用Map来接收,同时消息体消息需要进行url解码,否则会出现乱码

image.png

3、关键消息的提取,通过用接收的数据与关键词数组进行匹配来接收数据

image.png

4、提取消息,消息可能包含很多其他内容,我们利用正则匹配和字符剪切获取我们所需信息

image.png

image.png

5、差错检查和处理,利用正则表达式对邮箱格式进行检查,若错误,返回错误信息

image.png

6、建立连接,利用session读取配置文件,同时开启debug,获得log信息,获取邮件传输对象

image.png

image.png

7、邮件的封装,利用MimeMessage类相关方法对邮件内容进行格式化封装

image.png

本机测试结果

设置代理,利用qq邮箱发送(可截个网址改为http的图)

image.png

image.png

wireshark抓包结果 上为http,下为smtp

image.png

image.png

输出的log信息

image.png

image.png

问题

1、处理http消息时,初始时为区分开消息头和消息体的提取,导致,读取时用时过长,且读取信息不够完整,此处耗时较久,后通过阅读http协议接收相关情况,解决

2、使用javamail发送邮件时,会由于读取邮件正文不完整,导致抛出空指针异常,后对接收邮件正文进行正则处理,解决

运行环境

jdk1.8

JavaMail1.4.7

Java activation1.1

代码配置

配置Maven pom.xml 文件 导入 JavaMail1.4.7 和 activation1.1

实现环境

windows10+FireFox(其他浏览器可能存在加密问题,导致抓不到包)