动机
st0rm23我想自己搭建一个邮件服务器,干啥勒,可以有自己的一坨邮箱,就可以用来注册一些奇怪的账号了2333。开玩笑啦,不过有个自己的邮箱还是挺不错的。
原理
邮件投递过程基本上是由三个角色组成的,分别是MUA(mail user agent)邮件用户代理, MTA(mail transfer agent)邮件传输代理, MDA(mail delivery agent)邮件投递代理。其实蛮简单的,我们通过一个例子来看这个三者如何协同工作的。
这个例子的背景是小明要用outlook邮箱给小红的foxmail邮箱发一封邮件,信件内容是这样的。
from xiaoming@outlook.com
to xiaohong@foxmail.com
哈喽小红,我可以去你家帮忙修电脑吗?亲亲
首先,小明在自己电脑上用outlook软件写好了一封邮件,这里outlook软件就是MUA,也就是用户接触到的那个客户端。其实平常你看到的QQ邮箱或者新浪邮箱那个界面也是MUA,区别只是outlook是电脑上的软件,QQ邮箱只是web应用而已。
然后勒,小明点了发送,这样邮件就从小明的电脑就会根据小明的邮箱地址xiaoming@outlook.com把这个邮件上传到outlook.com所解析到的服务器A上,这个服务器A勒就是MTA,这个服务器只是负责传输的,然后这个服务器又会继续进行传输,再根据xiaohong@foxmail.com丢到foxmail.com所对应的服务器B。当然有可能A和B之间继续经过了很多的MTA。这并不影响,总之就是最终会被传输到目的地。
最终的目的地就是MDA,这个MDA服务器负责存储下这封邮件的内容。然后小红的客户端当连接MDA的时候,一旦发现了自己有一封新邮件,就会去MDA上获取这个邮件。那么就展现到小红的面前了,晚上就可以愉快地和小明修电脑了。
大体的流程就是MUA -> MTA -> ... MTA -> MTA -> MDA <- MUA.
这里的传输过程因为情况的不同又分为不同的协议
MUA->MTA使用的是SMTP
MTA->MTA使用的是SMTP
MDU<-MUA使用的是POP3或者IMAP
介绍
MUA暂时先用linux命令行下的mail指令吧
MTA我们用POSTFIX(linux默认好像带有sendMail)
MDA就用linux自己的就好了,用户组会把邮件自己存下来的,mail指令可以取的到
准备工作
首先我们要先做好地址的解析工作,就以上述的例子而言,foxmail.com怎么找到对方的邮件服务器勒。大家可能会说foxmail.com这个域名对应的地址不就是么。这里大家可能搞混乱,通常说域名对应的地址是web服务器的地址,不一定就是邮件服务器的地址。DNS解析里面有A记录和MX记录之分,A(Address)记录就是普通我们说的域名翻译的地址。邮件投递的地址有稍微的不同,会去让查找foxmail.com这个域名下有没有MX记录,有的话就去查找MX记录对应的主机。通常MX记录的目标主机填的是一个子域名,而不是真正的IP地址。我们以为@example.com这个邮箱后缀的解析为例。
A记录新建一条如下
域名:mail.example.com IP地址:123.123.123.123
MX记录新建一条入戏
域名:example.com 目标主机:mail.exmaple.com
这样,当我们@example.com的时候,就会自动对应到mail.example.com的域名下再翻译成123.123.123.123了。
过程
1、先停用Sendmail
$ /etc/init.d/sendmail stop #停止sendmail服务
$ chkconfig sendmail off #从启动组删除
$ apt-get install postfix #安装postfix
2、修改配置
配置文件在/etc/postfix/main.cf下
打开后修改即可
myhostname = mail.example.com #主机名指向真正域名
mydomain = example.com #mydomain参数指向根域
myorigin = $mydomain #myorigin指向mydomain
mydestination = $mydomain #mydestination指向mydomain
inet_interfaces = all #监听网卡的所有IP,这样才可以收到外部邮件
mynetworks_style = host #只信任本机
relay_domains = $mydomain #配置哪些地址的邮件能够被Postfix转发,当然是mydomain的才能转发,否则其他人都可以用这台邮件服务器转发垃圾邮件
测试使用
这样基本就大功告成了。我们可以简单尝试一下,用你其他邮箱向root@example.com发一封邮件。这里root可以改成你服务器上的某个特定用户。如果没有收到退信提示说明发送成功了。
到root用户下,输入mail指令,就可以列出root用户收件箱的内容。
mail
郝然看到第一封邮件就是你刚才发的,是不是很开森。
当然你也可以用mail指令对外发邮件.
echo "hello, boys" | mail -s "hello" root@example.com
日常维护
日志 : /var/log/maillog
mailq : 列出当前在postfix发送队列中的所有邮件
postsuper -d ALL : 删除当前等待发送队列的所有邮件,包括发送失败的退信