今天我们又来讲讲邮件协议,如果您曾经设置过电子邮件帐户,则可能会询问您要使用哪种电子邮件协议(POP或IMAP),对于POP,我们在这篇文章上有讲解《pop3协议解析及代码实现》。当我们所做的选择那种电子件协议,将对您发送,接收和以其他方式使用电子邮件的体验有一定影响。
POP(邮局协议)曾经是电子邮件协议中最流行的类型,但如今,IMAP是大多数人的首选。在下面详细了解IMAP是什么,以及Wireshark抓包分析IMAP协议。
什么是IMAP?
IMAP代表Internet消息访问协议。这是一个应用程序层协议,用于接收来自邮件服务器的电子邮件。它是最常用的协议。
IMAP协议还遵循客户端/服务器模型。一方面,我们有一个IMAP客户端,它是在计算机上运行的进程。另一方面,我们有一个IMAP服务器,它也是在另一台计算机上运行的进程。两台计算机都通过网络连接。
IMAP协议在TCP / IP 传输层上,这意味着它隐式使用了该协议的可靠性。一旦在IMAP客户端和IMAP服务器之间建立了TCP连接,默认情况下,IMAP服务器将侦听端口143,但是此端口号也可以更改。
默认情况下,IMAP使用两个端口:
- 端口143:这是未加密的IMAP端口。
- 端口993:当IMAP客户端希望通过IMAP安全连接时,将使用此端口。
为什么我们应该使用IMAP?
- 与POP不同,IMAP允许您访问,组织,阅读和分类电子邮件,而无需先下载它们。
- IMAP非常快速和高效。服务器还会保留您发送的所有消息的记录,从而使您可以从任何地方访问已发送的消息。
- IMAP不会将邮件从服务器移动到您的计算机,而是将计算机上的电子邮件与服务器上的电子邮件同步。
通过示例了解IMAP协议
IMAP使用传输控制协议(TCP)进行通信,以确保数据的传递并按顺序接收。IMAP在众所周知的端口(即端口号143)上侦听来自IMAP客户端的传入连接请求。IMAP协议将所有设备与主服务器同步。
假设我们有上图所示的三种设备:笔记本,智能机和平板电脑。如果所有这些设备都在访问同一邮箱,则它将与所有设备同步。
在这里,同步意味着当一台设备打开邮件时,它将在所有其他设备上标记为已打开,如果我们删除该邮件,那么该邮件也将从所有其他设备上删除。因此,我们在所有设备之间进行了同步。
在IMAP中,我们可以看到所有文件夹,例如垃圾邮件,收件箱,已发送邮件等。我们还可以创建自己的文件夹,称为自定义文件夹,该文件夹将在所有其他设备上可见。
IMAP协议常见指令讲解
下面我们来讲解IMAP协议命令的快速列表,以及常见指令。
Any State
- capability
capability指令主要是获得服务器功能 。
- noop
noop指令主要是 用于检查新邮件并防止连接超时 。
Non-Authenticated State
- authenticate
authenticate指令主要做SASL认证 。
- login
登录可以使用引号将空格和特殊字符引起来。然后必须用\来转义“
Authenticated State
-
append:将邮件添加到特定邮箱
-
create:创建新邮箱
-
delete:删除邮箱
-
examine:在只读模式下选择
-
list:邮箱名称列表
-
lsub:用户已订阅的邮箱列表
-
select:这样邮箱中的邮件就可以
被读/写
-
status:获取邮箱状态
-
subscribe:到新邮箱
Selected State
-
check:用来在邮箱设置一个检查点,类似NOOP
-
close:从当前删除消息选定的邮箱已删除旗帜
-
copy:将邮件从当前复制到另一个邮箱
-
fetch:获取邮件的相关数据
-
search:返回消息列表,搜索标准已详细说明并使用了密钥用于不同的消息部分
-
store:设置/取消设置消息标志
-
uid:使用UID号而不是消息序列号
IMAP协议解析代码实现
int main(int argc, char* argv[])
{
char errbuf[1024];
pcap_t *desc = 0;
char *filename = argv[1];
if (argc != 2)
{
printf("usage: ./dissect_imap [pcap file]\n");
return -1;
}
return 0;
}
编译运行:
总结
使用IMAP有几个优点。
- IMAP允许您从任意位置通过任意数量的不同设备访问电子邮件。
- IMAP仅在您单击时下载一条消息。因此,您无需等待所有新消息从服务器下载就可以阅读它们。
- 附件不会随IMAP自动下载。因此,您可以更快地检查邮件,并更好地控制打开哪些附件。
参考:https://tools.ietf.org/html/rfc3501
欢迎关注微信公众号【程序猿编码】,需要IMAP源码和报文的添加本人微信号(17865354792)