sendmail是最重要的邮件传输代理程序。Sendmail做为一种免费的邮件服务器软件,已被普遍的应用于各类服务器中,它在稳定性、可移植性、及确保没有bug等方面具备必定的特点,且能够在网络中搜索到大量的使用资料。通常状况下,咱们把电子邮件程序分解成用户代理,传输代理和投递代理。 用户代理用来接受用户的指令,将用户的信件传送至信件传输代理。而投递代理则从信件传输代理取得信件传送至最终用户的邮箱。邮件传输是从服务器到服务器的,并且每一个用户必须拥有服务器上存储信息的空间(称为信箱)才能接受邮件(发送邮件不受这个限制)。能够看到,一个邮件传输代理的主要工做是监视用户代理的请求,根据电子邮件的目标地址找出对应的邮件服务器,将信件在服务器之间传输而且将接收到的邮件缓冲或者 提交给最终投递程序。有许多的程序能够做为信件传输代理,可是sendmail是其中最重要的一个,事实证实它能够支持数千甚至更多的用户,并且占用的系统资源至关少。不过,sendmail的配置十分复杂,且无验证,没有防范垃圾机制,没有防病毒机制。当sendmail程序获得一封待发送的邮件的时候,它须要根据目标地址肯定将信件投递给对应的服务器,这是经过DNS服务实现的。sendmail首先肯定这个地址是用户名+机器名的格式,而后,经过查询DNS来肯定须要把信件投递给某个服务器。DNS数据中,与电子邮件相关的是MX记录。
MUA (mail user agent 邮件用户代理),用于用户端发送邮件或者阅读邮件。linux有mutt这个工具 MTA (mail tranfer agent 邮件传输代理 ),至关于一个邮局,server端的软件,主要的功能有,接收MUA发来的邮件和把邮件发送给下一个MTA,能够说是一个邮件路由(mail router),server端的软件就属于MTA,如今开源的有sendmail,postfix,qmail等 。
MDA (mail devilery agent 邮件投递代理),主要是将MTA所接受的邮件,依照邮件的目的地将此邮件放到本机帐号下或者是给下一个MTA,通常就是指mail这样的命令。
邮件的协议:
发信: SMTP (simple mail tranfer protocol 简单邮件传输协议) 端口号 TCP的25端口,在发信时,MUA会主动链接MTA的port 25,而后经由SMTP协议发送出去,SMTP分为接受SMTP和发送SMTP,它无论两端主机的配置或者系统等,只要两边SMTP协议OK就能够发送邮件
收信: POP (post office protocol 邮局协议),来链接到MTA,以读取或者下载邮件,如今经常使用的版本是POP3,端口为110 IMAP (internet message access protocol 网络报文件协议),能在下载邮件前先下载邮件头信息,以可让用户选择性下载 端口 143。
首先来测试一下环境
这里我用的centos的系统,默认彷佛是安装过了sendmail的,而且是启动过的。
接着安装dovecot:yum install dovecot
启动dovecot: service dovecot start
这时是能够发信件的,为了测试能够先添加两个帐号user1、user2,而后向其发送一份邮件
由日志看出,发送成功了,真的发送成功了吗,要看user1可否收到这封标题为1的内容为12387681498649821的邮件,为了验证,要切换到user1,进行收信
说明真的发成功,好神奇呀。。。
在后续操做以前,先安装一个工具sendmail-cf
接下来来修改/etc/mail/目录下的三个文件
1 vim sendmail.mc ,让其监听全部地址,以达到用客户端也能够发信件的目的
2 vim access (作中继)在后面追加,实现这个网段地址的中继,及到163.com域的都无条件接受,到sina.com的进行中继
3 vim local-host-names
通过测试,没有问题,基于上面的基本配置后,下面来开始对sendmail的搭建
一:163.com部分的基本搭建
首先来安装并搭建DNS服务器(为了节省资源,把邮件服务器和ns服务器搭在一台机器上)
至此,dns就安装安装完成了,而后开始搭建
而后切换到安装目录,来产生配置文件
而后编辑该配置文件
而后修改区域生成文件vim named.rfc1912.zones (填写内容只是说明用法)
而后去生成163.com.zone
接着编辑163文件
而后启动dns服务器:service named start
接着要作DNS指向:编辑/etc/resolv.conf
而后修改主机名: vim /etc/sysconfig/network
接着也要把hosts文件也要修改了
重启sendmail 和DNS服务器
接下来就是测试来看是否搭建成功
由图可知,基本搭建成功。
二:sina.com的基本搭建
这里我用redhat来搭建sendmail,在redhat中sendmail依然默认已经安装并启动,下面来安装dovecot: yum install dovecot
启动dovecot:service dovecot start
创建用户user3 user4
接下来依旧来安装并搭建DNS服务器(为了节省资源,把邮件服务器和ns服务器搭在一台机器上)
而后切换到安装目录,来产生配置文件
而后编辑该配置文件
而后修改区域生成文件vim named.rfc1912.zones (填写内容只是说明用法)
而后去生成sina.com.zone
接着编辑sina文件
而后启动dns服务器:service named start
接着要作DNS指向:编辑/etc/resolv.conf
安装一个工具sendmail-cf
接下来来修改/etc/mail/目录下的三个文件
1 vim sendmail.mc ,让其监听全部地址,以达到用客户端也能够发信件的目的
2 vim access (作中继)在后面追加,实现这个网段地址的中继,及到sina.com域的都无条件接受,到163.com的进行中继
3 vim local-host-names
而后修改主机名: vim /etc/sysconfig/network
接着也要把hosts文件也要修改
重启sendmail 和DNS服务器
接下来就是测试来看是否搭建成功
由此知,基本搭建也已经成功了。
下面来测试从163想sina发送是否成功
由此知,已成功完成两者的邮件收发。
为了实现快速发送,这里要对两者的DNS作反向解析
163:
vim /var/named/chroot/etc/named.rfc1912.zones
而后去生成这个文件
编辑生成的192.168.102.local文件
而后执行:rndc reload
接下来作sina的DNS反向解析
sina:
vim /var/named/chroot/etc/named.rfc1912.zones
而后生成192.168.102.local文件
编辑生成的192.168.102.local文件
而后执行:rndc reload
而后分别重启两者的sendmail和DNS服务器,这时再进行测试,发现速度快了不少。
利用证书实现对信息的加密:
实现这个功能,在一台机器上实现就好,这里我在sina.com上实现
为了试验的须要,这里要安装一款抓包工具
yum install wireshark
因为要利用证书,因此要作CA
cd /etc/pki/
vim tls/openssl.cnf
接下来建立三个目录两个文件:
建立一个序列号到serial中:echo 01 >serial
建立私钥并修改权限:
生成证书:
至此,CA架设就完成了。
建立一个目录来存放为sendmail申请的证书
切换到所建立的目录:cd /etc/mail/certs
生成私钥
作请求
产生证书
openssl ca -in sendmail.csr -out sednmail.crt
chmod 600 sendmail.key
编辑文件,使证书生效
重启sendmail服务器
测试
此时,接收时仍是明文,这时假如接受时使用pop3s或imaps,又该怎么作呢,这时,能够再来建立一证书
mkdir -pv /etc/dovecot/certs
生成私钥:
作请求:
产生证书: openssl ca -in dovecot.csr -out dovecot.crt
chmod 600 dovecot.key
而后结合dovecot来用,vim /etc/dovecot.conf
重启服务:
service dovecot restart
测试
启用抓包工具
在服务器上发以信件,这时在客户端收发
抓包图示显示,没有任何有价值的东西显示出来
此时就是先了加密。
认证:
可是sendmail自身没有身份认证能力,要想实现身份认证,必需要借助sasl协议,而这个协议要想正常工做,就必需要安装cyrus-sasl这个包,只有安装了这个包,才会造成saslauthd这个服务器软件,下面就来安装cyrus-sasl
由此信息可知,这个包已经安装过了,可是还缺乏devel包,是要装上的
此时去看一个文件
cd /usr/lib/sasl2/
vim Sendmail.conf
这时可知,saslauthd已与sendmail结合了,下面来启动这个服务器软件
接着要去修改sendmail的配置文件,来和saslauthd结合
打开检测机制:
反红的那个表达式的意思是让其强制身份认证。
而后重启服务
而后来用一个不存在的帐号来测试:
Telnet 127.0.0.1 25
能够看出要求认证了。
当利用auth login指令测试时,帐号不能输明文的,要输入base64编码的帐号,这时要产生这个base64编码
接着把密码也生成base64编码
继续刚才的测试,输入auth login后加入编码过的用户
此时就能发信息了,这时在服务器短能够发信件了,那在客户端呢
在客户端依旧以一个不合法的用户来测试
说明是不能发送的,说明认证也就成功了。