【我的Linux,我做主!】动手搭建Postfix邮件服务器

系统运维

目录:
(一)了解邮件的整个收发流程
(二)配置postfix邮件服务器
(三)使用图形客户端收发邮件

创新互联专注于内黄网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供内黄营销型网站建设,内黄网站制作、内黄网页设计、内黄网站官网定制、微信小程序定制开发服务,打造内黄网络公司原创品牌,更为您提供内黄网站排名全网营销落地服务。

(一)了解邮件的整个收发流程

(1.1)电子邮件在我们的日常生活中,属于经常用到的一种信息传输服务。我们使用的可能是自己公司的邮件服务器,也可能使用的是互联网中提供的知名邮件服务器,例如QQ邮箱、163邮箱、126邮箱等,它们收发邮件的流程都是一样的。假设现在有一个126邮件服务器,在邮件服务器上有两个帐户,分别是tom@126.com和bob@126.com,此时如果tom想要发送邮件给bob,那么他发送邮件后,邮件首先会到达126邮件服务器,并标注“to:bob@126.com”,此时126服务器发现发送的邮件是属于自己的注册用户,那么126邮箱就会将这封邮件投递到bob的邮箱中,当bob进入到自己的邮箱后发现自己有一封未读的邮件,此时tom用户就完成了发送邮件给bob的需求,这是在同一台邮件服务器中发送邮件的过程。

现在我们的环境中又出现了一台QQ的邮件服务器mail.qq.com,在QQ的域中还存在着域名解析服务器ns.qq.com,对域中的所有主机进行域名解析的操作,假设在QQ服务器上存在着一个mary@qq.com的账户。tom@126.com准备给mary@qq.com用户发送一封邮件并标注“to:mary@qq.com”,此时126服务器接收到邮件后发现mary@qq.com并不是自己服务器中的账户,因此126服务器需要知道QQ邮件服务器的IP地址,126服务器首先会将查询IP地址的请求发送给自己域中的dns服务器,126域中的邮件服务器向DNS服务器查询的方式主要是通过递归查询。此时126域中的DNS服务器会去向全球13台根域名服务器进行查询,通过迭代查询的方式,经历了根域、顶级域、一级域、二级域...最终找到了QQ域中的DNS服务器,此时126域中的DNS服务器会向QQ域中的DNS服务器发送查询请求:“请问你知道QQ域中的邮件服务器是那一台吗?”此时QQ域中的DNS服务器便会去查询自己服务器上的MX记录找到优先级高的邮件服务器,并向126域中的DNS服务器回应:“知道,域中的邮件服务器是mail1.qq.com”,接着126域中的DNS服务器继续询问:“请问mail1.qq.com主机的A记录是什么呢?”此时QQ域中的DNS服务器会回答:“知道,mail1.qq.com的A记录是xxx”,这个时候126域中的DNS服务器便会将查询的结果告诉给126域中的邮件服务器,126域中的邮件服务器知道了QQ域中的邮件服务器后,便会把服务器中的“to:mary@qq.com”邮件发送到QQ域中的邮件服务器上,此时QQ邮件服务器发现mary是自己服务器中的一个账户,此时就会将这封邮件投递到mary的账户中,mary通过浏览器或者邮件客户端便可以查收自己账户中的邮件了,这就是整个邮件服务器的工作流程。

(1.2)平时我们在收发邮件的时候都会使用一些客户端,比如Outlook邮箱、Foxmail邮箱、Thunderbird邮箱等,对于这些客户端工具来说,我们将其称之为MUA(邮件用户代理)。我们在发邮件的时候,使用的协议是SMTP(简单邮件传输协议),其中简单邮件传输协议所使用的是TCP的25号端口;在收邮件的时候,我们所使用的协议是POP3(邮局协议版本3)或者IMAP(交互邮件访问协议),对于POP3来说所使用的是TCP的110端口,对于IMAP来说所使用的是TCP的143端口。如果我们想要将一台主机搭建为一台邮件服务器,那么就需要安装相对应的软件,比如postfix、sendmail、Exchange Server等,这些软件我们称之为MTA(邮件传输代理)。当126的用户tom发送了一封给bob或者mary的邮件后,邮件首先会到达126邮件服务器,接着126邮件服务器会进行邮件投递的操作,邮件投递的这个过程,我们称之为MDA(邮件投递代理),在postfix中它是一个进程。在客户端我们所使用的协议是POP3或者IMAP,它是由dovecot提供的,安装之后用户才可以正常的接收邮件,这个我们把它称之为MRA(邮件接收代理)。126邮箱接收到tom发送的邮件后,发现需要将邮件转发给mary,这个转发的过程我们称为relay(转发)。这时候就会引出一个概念openrelay,表示一个邮件服务器不作任何的限制,全球任何人都可以向我的服务器发送转发邮件,甚至不用在我的邮件服务器上注册,也可以直接让我的服务器发送转发邮件,此时我们的邮件服务器就是出于openrelay的状态。在互联网中会有一个订阅RBL(实时黑名单),它会将互联网中异常的邮件服务器添加到RBL的实时黑名单中,此时如果目标邮件服务器订阅了RBL后,就不会再接收到我们的异常邮件服务器发送的邮件了。


(二)配置postfix邮件服务器
(2.1)首先我们在vms001主机上配置好DNS服务,在/etc/unbound/local.d目录中创建一个aa.conf的配置文件,并且填写好相应的DNS解析条目。接着在vms002主机上我们将DNS服务器设置为192.168.26.101后,我们可以查询到example.com域的主机名为vms002.example.com,然后通过主机名查询A记录,便可以查询到vms002主机的IP地址为192.168.26.102,查询的结果是正确的。
# host -t mx example.com
# host -t A vms002.example.com


(2.2)postfix服务在我们系统中默认是已经安装好的,进入到/etc/postfix目录下,可以查看main.cf文件。当然main.cf文件中的配置参数并不是包含全部的内容,如果我们想要查看所有的参数信息,可以使用postconf命令,其中postconf是列出所有参数的当前值,而postconf -d是列出所有参数的默认值。Postconf中一共有816个参数,main.cf文件中只放置了常用的参数。




(2.3)在vms002主机的main.cf文件中主要包含的是常见的参数,具体的格式如下,同时我们在配置文件中进行参数定义的时候一定要顶格开始,否则会被系统默认为时上一行的延续。myhostname是一个很重要的参数,如果我们没有设置具体的值,那么postconf中会有默认值存在,默认值一般是主机名。
格式:
Key1=value1,value11
Key2=value2
Key3=$key1,value3
此时key3=value1,value11,value3
# postconf myhostname
# postconf | grep ^myhost

(2.4)在main.cf文件中mydomain的默认值会取myhostname第一个点之后的部分,如果我们通过postconf -e参数对myhostname进行修改,那么修改的结果会直接记录到main.cf文件中,且此时使用postconf查询mydomain时,会发现结果也随之修改为myhostname第一个点之后的部分。如果是通过配置文件进行修改那么需要重启服务才会生效,而通过命令行进行修改,则会立刻生效。
# postconf | grep ^mydom
# postconf -e myhostname=aa.bb.cc.dd.ee.com

(2.5)在main.cf文件中myorigin参数的主要作用是自动补齐收件人邮箱的后缀名称信息,我们查询到myorigin参数的默认值为$myhostname。现在我们在vms002主机上使用root用户对jerry用户发送一封邮件,我们尝试使用jerry或者是jerry@vms002.example.com作为收件人,此时我们发现使用两种方式发送过来的邮件都可以正常的看到如下的邮件信息。所以如果遇到了不是标准邮件格式的收件人,比如jerry,那么此时postfix会自动补齐为jerry@$myorigin即jerry@vms002.example.com
# mail -u jerry
# echo "Hello I\'m root" | mail -s "Hello jerry" jerry@vms002.example.com





(2.6)在main.cf文件中的inet_interfaces表示的是当前服务所监听的端口,默认是监听在主机回环接口上的,此时我们应该设置为监听在所有的接口之上。最后还要记得将防火墙添加SMTP可以通过。
# systemctl restart postfix.service
# netstat -tunlp | grep :25
# firewall-cmd --add-service=smtp --permanent

(2.7)在main.cf文件中的inet_protocols表示监听的协议,可以自己选择监听ipv4或者监听ipv6,默认是监听所有的all

(2.8)在main.cf文件中的mydestination表示的是当邮件服务器将需要发送的邮件进行投递的时候判断邮件的收信人是否是自己的注册用户的列表库,例如root用户使用jerry@vms002.example.com作为收件人名是可以正常的将邮件投递到jerry用户的邮箱的,但是使用jerry@example.com作为收件人名时默认是不能投递到jerry用户的邮箱的,如果我们希望接收到类似于jerry@example.com这样常规格式的收件人名,就需要将$mydomain参数添加进来,因为mydomain表示的是myhostname第一个点之后的所有内容,所以开启mydestination第二行的配置(图2-20)。当在/etc/postfix/目录下main.cf文件中mydestination参数后添加了$mydomain的选项并重启服务后,此时便可以正常的识别jerry@example.com收件人信息,并正确的投递邮件(图2-22)。如果不添加$mydomain参数的话,此时vms002邮件服务器会不停的询问DNS服务器发送邮件的主机地址是多少,而DNS服务器会回复是vms002主机自己,转发给自己后发现邮件后缀并不是自己域名内地注册用户,这样又会向DNS询问,形成了一个死循环,所以建议一般情况下是需要添加这个参数的。
# tailf /var/log/maillog---查看邮件发送的后台日志
# echo "Hello I\'m root" | mail -s \'Hello jerry\' jerry@example.com

(2.9)在main.cf文件中的mynetworks表示的是允许使用openrelay的IP地址范围,mynetworks值表示的是默认IP地址范围,在此范围内的主机才可以使用openrelay进行邮件转发的操作(图2-29),现在我们创建一个新的主机MailTest(192.168.26.103),然后配置好邮件测试主机的相关光盘镜像挂载、YUM源等信息。此时vms002主机上并不存在xxyy用户,但是我们可以在MailTest主机上使用xxyy账号发送邮件,我们在MailTest主机上安装好telnet软件,并编辑发送的邮件信息(图2-27),此时我们在vms002主机上便发现jerry用户已经接收到了不存在的xxyy账号发送过来的邮件了(图2-28)。不过一般我们使用公司的邮箱收发邮件,如果我们回到家后在IP地址可能就不在mynetworks的范围中了,此时如果不能进行邮件的转发会非常的麻烦,所以mynetworks允许的范围还是尽量要大一些,不过这个时候我们是可以使用SMTP的认证解决openrelay的问题的,使用了SMTP的认证,使得用户必须要输入用户名和密码信息。
# telnet 192.168.26.102 25
\\>helo example.com
\\>mail from:xxyy@example.com
\\>rcpt to:jerry@example.com
\\>data
\\>haha,I\'m xxyy
\\>.---结束符
\\>quit
# postconf | grep ^mynetworks---查询mynetworks默认的网段范围

(2.10)在main.cf文件中的relayhost表示的是指明我们的转发主机是哪一台,我们在vms002主机上配置relayhost转发的主机地址是192.168.26.103。我们在MailTest主机上配置好邮件服务器的相关内容,首先设置MailTest主机的inet_interfaces可以监听所有的地址,接着将参数mydestination加上$mydomain变量,并创建一个用户jerry,在MailTest主机上将服务重启一下,同时还要将MailTest主机的防火墙开放一下。此时我们在vms002主机上将服务重启完成后,虽然vms002主机并不能解析MailTest主机的域名,但是发送的邮件仍然可以正常的到达MailTest主机的jerry用户的邮箱中年,主要是因为设置了relayhost的值(图2-35),虽然vms002主机发现了jerry@server.example.com并不是自己域名内的注册用户,但是由于设置了转发地址relayhost,所以vms002主机直接将邮件发送给了MailTest主机,而MailTest主机通过mydestination发现邮件是自己域名内的注册用户,所以直接将邮件投递到了jerry用户的邮箱中了。
# firewall-cmd --add-service=smtp --permanent

(2.11)此时如果vms002主机上的root用户发送给jerry@example.com的邮件地址时,虽然MailTest主机的域名是example.com(图2-37),但是vms002主机自己的域名也是example.com,虽然此时我们在vms002主机上已经配置了relayhost转发的主机地址是192.168.26.103,但是最终发送的邮件会在本机的jerry用户的邮箱进行接收(图2-36)。这是由于对于vms002主机来说,虽然设置了relayhost,但是只有在发送的邮件不是vms002主机的注册用户的时候才会生效。

(2.12)如果我们希望从vms002主机发出的邮件全部都转发到MailTest主机上,那么此时我们应该将mydestination的值设置为空值即可,在vms002主机上将main.cf文件里的mydestination设置为空值后,将邮件服务重启一下。我们发现在vms002主机上并没有收到任何的邮件,但是MailTest主机上却收到了发送给jerry@example.com地址的邮件了。这种邮件转发的功能一般是在企业中邮件服务器数量非常多的时候使用的,例如公司有三台邮件服务器,我们并不希望邮件服务器直接接入互联网,此时我们可以配置一个邮件网关,此时邮件服务器发送的所有邮件都直接转发给邮件网关,我们在邮件网关上可以做更多的安全策略,垃圾过滤策略等,以此来保护我们内部邮件服务器的安全性。例如在Exchange服务器中五大组件之一的边缘传输服务器就是起到这个作用的。

(2.13)在main.cf文件中的alias_maps表示的是在/etc/aliases文件中配置别名信息,使得发送邮件的时候可以向同一类用户发送邮件。我们在/etc/aliases文件中定义别名all代表的是root、jerry、marry三个用户的一个集合,当给all发送邮件时jerry@vms002.example.com便会接收到邮件(图2-42)。如果我们希望是以常规的格式jerry@example.com接收到邮件,则可以设置myorigin=$mydomain,此时向all发送邮件,我们便可以在本机的所有用户邮箱中看到已经接收的邮件信息了(图2-44)。当然如果all代表的用户数量非常大时,我们可以使用/etc/userlist文件,然后将用户列表写入到userlist文件中。
# newaliases

(2.14)在main.cf文件中的home_mailbox表示的是定义用户的邮件存放的文件名,定义完成后一般这个文件会存在用户的家目录下,在默认情况下我们的邮件都是/var/spool/mail目录下存放的(图2-46)。我们设置home_mailbox的值为Mailbox,然后将邮件服务重启一下,此时便会在所有用户的家目录下产生一个Mailbox文件用来接收邮件信息(图2-48),如果我们将home_mailbox的参数修改为Maildir/后,则重启邮件服务后,所有发送的邮件便会都存放在用户的自己家目录下的Maildir目录中。
# systemctl restart postfix.service


(三)使用图形客户端收发邮件
(3.1)一般情况下,用户在收发邮件的时候都是习惯使用图形化界面操作的,在客户端接收邮件的时候一般是使用POP3或者IMAP协议,分别监听的是110端口和143端口,客户端如果需要连接到服务器接收邮件的话,则需要在vms002主机上安装dovecot软件。同时需要将pop3和imap服务的端口在防火墙打开。
# yum install dovecot -y
# grep imap /etc/services---查询imap协议使用的端口
# grep pop3 /etc/services---查询pop3协议使用的端口
# firewall-cmd --add-port=110/tcp --permanent
# firewall-cmd --add-port=143/tcp --permanent


(3.2)接着我们还需要进入/etc/dovecot/目录查看dovecot.conf配置文件,其中这里系统protocols的默认值就是这三个参数,其中lmtp表示的是本地邮件传输协议。然后可以进入到/etc/dovecot/conf.d/目录下,编辑10-auth.conf配置文件,是否禁用明文发送,这里我们应该设置为no;然后进入到/etc/dovecot/conf.d/目录下,编辑10-mail.conf配置文件设置mail_location的值为maildir:~/Maildir,设置用户接收到文件后自动将邮件接收到家目录下的Maildir/目录下,同时我们需要在vms002主机上的/etc/postfix/目录下的main.cf文件中将home_mailbox的值设置为Maildir/(图3-5-1);最后在/etc/dovecot/conf.d/目录下,编辑10-ssl.conf配置文件,由于我们并不需要SSL验证,所以设置ssl的值为no






(3.3)接着我们找到一台Win7系统,并在Win7系统上安装客户端Foxmail的客户端软件,接着我们选择手动设置连接到vms002主机的邮件服务器上,并将marry账户的邮箱创建出来。




(3.4)接着我们继续将jerry用户的邮箱也创建在Win7的邮箱客户端上,此时我们便可以尝试在图形界面的客户端上使用jerry用户向marry用户发送邮件了。



(3.5)此时我们发现marry用户在客户端工具上也能够正常的接收到jerry用户发送过来的邮件了。

—————— 本文至此结束,感谢阅读 ——————


网站题目:【我的Linux,我做主!】动手搭建Postfix邮件服务器
URL网址:http://hbruida.cn/article/cjhdii.html