SMTP服务

邮件服务用的是SMTP协议

SMTP(C/S模型):简单邮件传输协议(太简单,仅仅就是负责把邮件从发送方传输到接收方)

至于邮件内部的格式,邮件如何储存,以及邮件系统应以多快的速度来发送邮件,都未作出规定。

发件人的邮件送到发送方邮件服务器的邮件缓存后,SMTP客户就每隔一段时间对邮件缓存进行一次扫描。如发现有邮件,就是用SMTP的熟知端口号码25与接收方邮件服务器的SMTP服务器建立TCP连接,再连接建立后,接收方SMTP服务器要发出“220 Service Ready”(服务就绪)。然后SMTP客户向SMTP服务器发送HELLO命令,附上发送方主机名。SMTP服务器若有能力接收邮件,则回答“250 OK”,表示已经准备好接受。若SMTP服务器不可用,则回答“421 Service not available”(服务不可用)

1、先用DNS服务进行域名解析

2、使用TCP三次握手建立连接

3、传输邮件

4、放进对应用户的邮箱中去,并不是用户的家目录

POP3:邮局协议(第三版)

IMAP4:互联网邮件访问协议(第四版),功能比POP3稍微强大,但是同样,消耗的资源也多。

UUCP:(Unix to Unix Copy)计算机诞生时期比较早的协议,用来复制文件的协议。过后不久便有了SMTP,而且SMTP本身可以实现路由功能。比如,我们想把一个文件从一个主机发送到另外一个主机上的某个用户上去,那我们怎么去标识那个源发送用户,怎么去标识目标接受用户。

邮件中继服务器:发现不是自己的邮件,还会帮忙找一找目标主机在什么地方。

那么多用户怎么同时访问主机?主机上边有一个类似分屏器,里边有许许多多的接口,每一个用户只要提供一个显示器+一个键盘通过连接线路,就能够使用这台主机了,所以我们把显示器+键盘叫做终端。

虚拟终端:在早期,确实有这么多终端,但是后来通过虚拟技术把终端虚拟成虚拟终端,更加简便了。

SMTP服务器端:需要监听在TCP协议的25端口上

SMTP客户端:监听随机端口(一般是大于5000的端口)

SMTP服务

SMTP协议只负责邮件传输,只负责传输到相应的服务器主机上去,而把邮件从主机上放进用户的邮箱(邮件缓存)是由邮件投递(并不是SMTP协议)来完成的。

回复邮件过程:

SMTP服务

同一个主机上的两个用户发送邮件:

本地客户端连接本地服务器端,本地服务器直接就发现这是一个本地用户,直接放进用户邮箱中。

不同方向的邮件要发往不同的方向:所以要有一个分拣过程。

MUA:邮件用户代理(邮件用户编辑用户使用的工具),MUA写好邮件后直接提交给本地服务器(MTA:邮件传输代理)(一般情况)。然后由本地服务器进行分拣,分拣出来两类:本地邮件和远程邮件。本地邮件直接放在用户家目录下,如果发现是远程邮件,就会调用SMTP的客户端(本地的),再由本地客户端连接远程服务器端。
SMTP服务

之所以这么复杂,是因没它没有相应的功能。

SMTP服务
假如a.org接受下邮件之后发现邮件不是自己的,然后再进行转发,将邮件转发至b.net,但是b.net的服务器会认为是a.org这台主机发来的邮件,但是发件人依然是magedu.com,发件人和发送主机直接没有联系。假如这是一封垃圾邮件,虽然发件人是jerry,但是发来的主机是a.org,虽然你只是中继过来的邮件,但是b.net会认为是你发来的垃圾邮件,会拒收你以后发来的所有邮件。

Open Relay:开放式中继(a.org)

所以一般来讲,我们都不允许给任何人中继了。

邮件是从dagedu.com到b.net,但是你非要到a.net,然是人家a.net不搭理你,所以a.net就是关闭了开放式中继。一般来讲:现在的邮件服务器都必须关闭开放式中继功能。

在SMTP协议上,它不管发件人是谁,它只管接收方是谁,所以发件人可以随意伪装。所以就应该有用户认证。(但是SMTP不支持这个功能),借助于额外的认证工具来完成,这个工具叫做SASL协议(简单认证安全层)。

由本地服务器中的一个小程序发给SASL服务器进行验证用户是否合法。所以用户可以在任何地方都可以发邮件,只要有用户名和密码就可以了。

SMTP服务

为了避免用户直接登陆服务器查看邮件,再装一个服务器,用户提供用户和密码,他代替用户去寻找有没有邮件。同时有多个用户进行访问,这个服务器产生多个子进程代替用户去寻找是否有邮件。

这就是邮件取回代理(MRA):

SMTP服务

收邮件用的是POP3/IMAP协议

发邮件用的是SMTP协议

SMTP服务

webmail:使用浏览器就能够发送邮件,收邮件。

SMTP服务

那么MRA服务器检索的用户到底是什么用户呢?

可不可能是系统用户?在/etc/passwd中建立上亿个用户,显然不可能,所以就要使用数据库。

但是当用户数量非常大的时候数据库检索依然非常慢,但是有一种协议,检索用户速度非常快,这个协议就是LDAP协议。(轻量级目录访问协议)

但是LDAP有一个缺点就是读的速度非常快,但是写的速度非常慢,所以LDAP适用于一次写入,多次读取的场景。

SMTP服务
所以此处在表中就要用到虚拟用户。

虚拟用户:仅用于访问某服务的数字标识。

SASL验证用户就是假定每个用户都是系统账号,然后在/etc/passwd和/etc/shadow 中寻找。

SMTP服务

这才是一个基本的邮件服务系统。

但是如果发送的是垃圾邮件或者病毒邮件,怎么办?所以还要有一个垃圾邮件过滤器和一个病毒邮件过滤器。

现在就是一个流水线:来一个邮件,先交给垃圾邮件分拣器,如果不是,交给下一个病毒邮件分拣器,在不是,才发送。但是这样需要装太多的组件,所以,我们必须要让一个角色(组件)一个主机来扮演。这样,一个邮件系统就需要十几台主机。所以,构建一个邮件服务器特别麻烦。

UUCP:互联网邮件服务系统的鼻祖。

MTA:邮件传输代理,SMTP服务器

​ sendmail:占据了曾经互联网50%的邮件,单体结构,不安全,还要用到SUID,不安全

​ qmail:一位数学家发明的,但是弄了两年不弄了,网友们也拯救不了。性能非常强悍

​ postfix:模块化设计,且不使用SUID,作者是一个安全专家,所以安全,和sendmail兼容性非常好,效率高。

​ exim:也是一个著名的MTA。剑桥大学弄的。

MDA:邮件投递代理

​ procmail:sendmail使用的

​ maildrop:可以实现垃圾信息过滤。

​ postfix自带邮件投递工具

MRA:邮件检索代理(POP3,IMAP)

​ cyrus-imap

​ dovecot:功能强大,配置简单

MUA:邮件用户代理

​ foxmail:被腾讯收购了

​ thunderbird:雷鸟

​ evolution

​ mutt(文本界面)

webmail:

​ Openwebmail:

​ squirrelmail:

​ extmail:中国的,商业化(extman)

SASL:V2版本协议

​ cyrus-sasl

​ courier-authlib:经常使用这个来进行认证

​ 他就是一个认证框架

SMTP服务

发:postfix + SASL(courier-authlib) + Mysql(实现虚拟用户)

收:Dovecot + Mysql

Extmail + Extman + httpd