一、关键技术点
- 基于java socket的TCP协议
- IMAP协议
- SMTP协议
- MIME格式(邮件内容的格式)
二、开发历程
1、通过查阅《RFC3501》标准,了解imap协议,该标准制定了imap协议的总体规范
2、使用QQ邮箱作为服务端,foxmail作为邮箱客户端
3、了解MIME格式,该格式标准其实可以理解为html格式基础,邮箱内容就是用了这种格式
三、部分代码示例
连接到SMTP服务器(SMTP服务器用途发送邮件)
//连接到 SMTPServer
static void connectSMTPServer(){
try {
//创建QQ邮箱的smtp服务TCP连接,smtp协议也是基于tcp协议的
Socket client =new Socket("smtp.qq.com",25);
smtpConnection=new Connection(client,Constant.PROTOCOL_SMTP);
System.out.println("SMTPServer connect success");
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("SMTPServer connect failed:"+e.getMessage());
}
}
发送指指令给SMTP服务器(部分)
//EHLO命令
RespMessage respMessage= sendMessage(Constant.PROTOCOL_SMTP,"EHLO "+ System.getenv("USERDOMAIN_ROAMINGPROFILE"));
resetRespMessage(respMessage);
//授权登录命令
respMessage= sendMessage(Constant.PROTOCOL_SMTP,"AUTH LOGIN");
resetRespMessage(respMessage);
//设置邮箱账号
respMessage= sendMessage(Constant.PROTOCOL_SMTP,Base64.encode("xxxxxxx@qq.com"));
resetRespMessage(respMessage);
控制台输出日志;
邮件发送成功响应:
imap协议去订阅邮箱邮件代码示例
//连接到IMAP服务器
connectIMAPServer();
//CAPABILITY指令
RespMessage respMessage= sendMessage(Constant.PROTOCOL_IMAP,"C1 CAPABILITY");
resetRespMessage(respMessage);
//登录服务器
Map<String,String> loginParam= MapUtil.newHashMap();
loginParam.put("account","xxxxxxx@qq.com");
loginParam.put("pwd","xxxxxxx");
respMessage=sendMessage(Constant.PROTOCOL_IMAP,new LoginCommand().buildComand(loginParam));
resetRespMessage(respMessage);
foxmail中有收到邮件
总体代码目录:
四、最后总结
由于平时在上班比较忙,只能每天抽出个把小时去研究,用了好几天的时间写了个基本的版本,目的不是为了实现一个邮件服务器,而是想让大家通过了解一些国际标准协议的实现思路为工作提供一些参考价值,时间虽短但也基本实现了IMAP和SMTP两个协议的客户端基础开发,开发的时候做了一些基本的封装,后面有空了再实现服务端。博主也挺不容易的,想要具体代码可以联系博主,打赏博主5到10块买杯奶茶,定会奉上全部代码。