Postfix 邮件服务

1、Postfix 简介

postfixWietse VenemaIBMGPL协议之下开发的MTA(邮件传输代理)软件。postfixWietse Venema想要为使用最广泛的sendmail提供替代品的一个尝试。
Internet世界中,大部分的电子邮件都是通过sendmail来投递的,大约有100万用户使用sendmail,每天投递上亿封邮件。这真是一个让人吃惊的数字。
Postfix试图更快、更容易管理、更安全,同时还与sendmail保持足够的兼容性。

1.1 其它邮件服务器

Sendmail、Qmail、Postfix
Sendmail的不足
第一个重要的缺点是它的安全性较差,这是因为当其作者Eric Allman最初开始写作这个软件的时候,Internet的用户还很少,因而安全性并不没有得到大家的重视。
由于邮件系统需要处理的是外部发送来的各种各样的信息,甚至包含一些恶意数据,然而sendmail在大多数系统中都是以root身份运行,一旦出现问题,就会对系统安全造成严重影响。在这种情况下,要防止出现安全问题,仅仅依赖程序本身是不可取的,应该从系统结构出发,使程序拥有的特殊权限限制到最小。
第二个,使用Sendmail还会遇到的另一个问题是它的设置相当复杂,对于使用缺省设置来收发电子邮件,问题并不存在。当管理员打算进行一些特殊设置,以便利用Sendmail提供的复杂邮件处理能力时,就不得不面对复杂的宏和正则表达式。

Qmail可以替代Sendmail
Qmail,为了解决sendmail的安全问题,整个系统结构需要重新设计。基本的原则是将系统划分为不同的模块,有负责接收外部邮件的,有管理缓冲目录中待发送的邮件队列的,有将邮件发送到远程服务器或本地用户的。Qmail就是按照这个原则进行的设计,它由多个不同功能的小程序组成,只有必要的程序才是setuid程序(即以root用户权限执行),这样就减少了安全隐患,并且由于这些程序都比较简单一些,因此就可以达到较高的安全性。

另一种替代软件:Postfix 可以替代sendmail
Postfix同样也是采用了模块化的方式,但与Qmail不同的是,Postfix使用了一个主控进程进行监控。Postfix在很多方面都考虑到了安全问题,它甚至不向root分发电子邮件,以避免以root身份读写文件或启动外部程序。考虑到它的作者Wietse Venema曾编写了著名的安全软件TcpWrapper,Postfix的安全性是非常值得信赖的。
Postfix的性能也非常不错,甚至在Qmail作者自己进行的测试中也表明,Postfix的性能和Qmail基本相当。postfix在性能上大约比sendmail快三倍。
官方网站:www.postfix.org

1.2 邮件接收服务器

Dovecot: 邮件接收服务器
Dovecot 是一个开源的 IMAP 和 POP3 邮件服务器,支持 Linux/Unix 系统。
POP / IMAP4 是 MUA 从邮件服务器中读取邮件时使用的协议。
POP3 是从邮件服务器中下载邮件存起来,IMAP 则是将邮件留在服务器端直接对邮件进行管理、操作。比POP3更先进。
由 Timo Sirainen 开发,最初发布于 2002年7月。作者将安全性考虑在第一,所以 Dovecot 在安全性方面比较出众。
IMAP4是TCP/IP协议族中的一员,现在的版本是“IMAP第四版第一次修订版”。
一个完整的邮件服务器由以下内容构成:

1.3 邮件服务协议

25 端口:SMTP协议
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
作用:此协议主要用来发送或中转邮件。SMTP协议属于TCP/IP协议簇,

邮件服务中:
发送: 指的是同属于163邮件服务器两人相互发送邮件。
中转: 使用163邮箱给QQ邮箱发送邮件。

24端口:LMTP(Local Mail Transfer Protocol)[1],是本地邮件传输协议,与SMTP类似,但不支持邮件队列(queue),主要应用于非广域网的邮件网关。

110端口:POP3协议
POP3(Post Office Protocol 3)即邮局协议的第3个版本,它是规定个人计算机如何连接到互联网上的邮件服务器进行收邮件的协议。
还有POP2协议。

143端口:IMAP
IMAP: (Internet Mail Access Protocol Internet邮件访问协议) 。IMAP是斯坦福大学在1986年开发的一种邮件获取协议。它的主要作用是邮件客户端(例如Outlook)可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。

当前的权威定义是RFC3501。IMAP协议运行在TCP/IP协议之上,使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。

两者之间的区别:

img

总之,IMAP 整体上为用户带来更为便捷和可靠的体验。

POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的 。
而IMAP提供webmail 与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作。

1.4 邮件功能组件

MUA:邮件用户代理(Mail User Agent) 收邮件
MTA:邮件传输代理(Mail Transfer Agent) 发邮件
rhel5默认采用sendmail做为MTA,rhel6则采用postfix,
MDA:邮件递送代理(Mail Delivery Agent)

名称全名基于协议作用常见软件
MUAMail User Agent 用户邮件代理替用户收发邮件的Outlook Foxmail Thunderbird mutt
MTAMail Transfer Agent 邮件传输代理SMTP服务器中接受邮件Sendmail qmail postfix(IBM) exchange
MDAMail Deliver Agent 邮件投递代理把 SMTP 收到的邮件投递的用户邮箱Procmail maildrop
MRAMail Retrival Agent 邮件检索代理POP3/IMAP帮用户去邮箱取邮件dovecot courier- imap cyrus-imap

1.5 邮件的工作流程

img

  1. 发件人写邮件,通过客户端连接邮件服务器,这个之间使用了 SMTP 协议链接!用
    户就是 SMTP 客户端,发送服务器就是我们这儿的 SMTP 服务器!
  2. SMTP 检查我们进入的邮件,将其放到邮件缓冲队列中,等待发送到接受服务器中, 这里要注意,postfix 在这里会检查我们是是否发给自己,若是发给自己的,那么就直接进入 了我们服务器自己的 mailbox!
  3. 发送服务器此时充当 SMTP 客户端,接受服务器充当 SMTP 服务端,建立 TCP 链接, 将邮件发送的接受服务器!
  4. 接受服务器收到邮件之后,把邮件里面的内容读取,如收件人信息 to:……
  5. 收件人打开客户端,使用 POP3 或者 IMAP 协议收取邮件并读取!

2、部署 postfix 邮件服务

2.1 部署 postfix

部署邮件服务器的时候,在 RHEL6 以上版本默认使用了 Postfix,但是不排除有些定制系统可能安装的 Sendmail,所以你需要将 sendmail 卸载!

1
2
3
[root@postfix ~]# rpm -qa | grep sendmail //查看是否安装 sendmail 
[root@postfix ~]# yum remove sendmail -y //卸载 sendmail
[root@postfix ~]# yum install -y postfix dovecot

服务的主程序包,服务器端必须安装该软件包。
Dovecot
接收邮件软件包。 安装在服务端用于测试收邮件。 安装客端用于收邮件。

1
2
3
/etc/postfix/main.cf //主配置文件位置
/var/log/maillog //日志文件位置
/var/spool/mail/ //邮件存放位置,对应有相应用户名

启动服务

1
2
3
4
5
6
7
[root@postfix postfix]# service postfix restart 
[root@postfix postfix]# chkconfig postfix on

[root@postfix postfix]# netstat -antup | grep 25
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 11470/master
tcp 0 0 192.168.1.63:22 192.168.1.101:62563 ESTABLISHED 10521/sshd
tcp 0 0 ::1:25 :::* LISTEN 11470/master

如果启动服务启动不了,也没有错误日志输出,查看:

1
2
/usr/sbin/postfix status
/usr/sbin/postfix: error while loading shared libraries: libmysqlclient.so.16: cannot open shared object file: No such file or directory

提示没有共享库文件

1
2
3
find / -name libmysqlclient.so.16
/usr/lib64/mysql/libmysqlclient.so.16
cp /usr/lib64/mysql/libmysqlclient.so.16  /usr/lib

2.2 服务的使用方法

2.2.1 Linux 使用:

发送邮件:通过mail命令来发送

  1. 发送指定的文件内容到某个地址

    1
    mail -s 'Postfix1' localhost< /etc/hosts
  2. 自定义邮件内容

    1
    echo body | mail -s abcd root@localhost

    #内容是body,主题是abcd

  3. 查看邮件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    cat /var/spool/mail/root
    Received: by client75.localdomain (Postfix, from userid 0)
    id 4023B21C5E; Tue, 5 Jul 2016 15:31:47 +0800 (CST)
    Date: Tue, 05 Jul 2016 15:31:47 +0800
    To: localhost@client75.localdomain
    Subject: Postfix1
    User-Agent: Heirloom mailx 12.4 7/29/08
    MIME-Version: 1.0
    Content-Type: text/plain; charset=us-ascii
    Content-Transfer-Encoding: 7bit
    Message-Id: <20160705073147.4023B21C5E@client75.localdomain>
    From: root@client75.localdomain (root)

    127.0.0.1 client centos localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
    192.168.2.73 client73 client73.cn

2.2.2 windows 使用

通过浏览器访问或 foxmail

2.3 主配置文件整体介绍

1
2
[root@postfix ~]# cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
[root@postfix ~]# vim /etc/postfix/main.cf

queue_directory = /var/spool/postfix #队列目录
command_directory = /usr/sbin #命令位置目录
mail_owner = postfix #postfix运行身份
myhostname = postfix.cn #发送邮件时的名字,服务器名字
mydomain = postfix.cn #邮件域,用于接受的时候用
myorigin = $mydomain #我来自哪儿,别人收到的时候知道是我发送的
inet_interfaces = localhost #邮件接受监控的地址
inet_protocols = all #启用IPV4和IPV6
mydestination = $myhostname, $mydomain, localhost #服务器负责那些域
mynetworks = 192.168.0.0/24, 127.0.0.0/8 #指定允许使用的IP地址段
alias_maps = hash:/etc/aliases #对某一个用户发,里面的人都可以收到邮件
alias_database = hash:/etc/aliases
#home_mailbox = Mailbox #收件箱存放位置

2.4 修改配置文件,示例

配置postfix邮件服务器,实现邮件发送功能。实现给邮箱:3402301871@qq.com 发送邮件。

修改主机名和对应关系:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@postfix postfix]# hostname 
postfix.cn
[root@postfix postfix]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.63 postfix.cn
192.168.1.64 xuegod64.cn

vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=xuegod63.cn

[root@postfix ~]# vim /etc/postfix/main.cf

需要启用和修改的项:

myhostname = postfix.cn #指定邮件服务器名字,接收用来识别的,也就是一个标识
mydomain = postfix.cn #邮件域
myorigin = $mydomain #启用,去掉注释,发信地址,此设置显示为@xuegod63.cn
inet_interfaces = all #对外提供MTA服务设置为监听所有网卡,默认只监听本地
#inet_interfaces = localhost #这个注释起来,是默认值,只监控本地
mydestination = $myhostname, localhost.$mydomain, localhost #此行不用改,但是要说明,这是代表邮件服务器负责的那些域
mynetworks_style = subnet #允许转发的来源网段,可选subnet子网,class网段,host本机
mynetworks = 192.168.0.0/24, 127.0.0.0/8 #用户允许的使用的IP地址段
relay_domains = $mydestination #允许转发的目标域
local_recipient_maps = #含有所有本地邮件地址的查询表.SMTP server借此拒收外界寄给不明用户的邮件,启用即可
alias_maps = hash:/etc/aliases #对某个用户发,文件中的用户都可以收到邮件,别名组
alias_database = hash:/etc/aliases #别名数据库
smtpd_banner = $myhostname ESMTP “Welcome postfix.cn STMP Server” #自定义服务器信息

重启服务:

1
2
[root@postfix ~]# service postfix start
[root@postfix ~]# netstat -antup | grep 25

测试:

看能不能给邮箱:3402301871@qq.com 发送邮件。

1
mail -s 'Postfix1' 3402301871@qq.com < /etc/hosts

发邮件的用户名是: root@xuegod63.cn .格式: 当前用户名@邮箱域
参数: -s 邮件主题
< /etc/hosts 要写入的内容
也可以通过查看日志文件来判断:

1
tail -f /var/log/maillog

在postfix的日志里:
如果status=sent表示已经成功发送。removed表示从队列中删除发送的邮件
如果status= deferred表示延期,需要重试,当重试到一定次数,还失败就抛弃

登录163邮箱查收邮件: 注:收邮件时,会有一些延迟。

img

总结可以对外发邮件配置项
配置文件配置下面4条就可以工作了

1
2
3
4
myhostname = postfix.cn 
mydomain = postfix.cn
inet_interfaces = all
mynetworks = 192.168.1.0/24, 127.0.0.0/8

不过要注意,hostname要和hosts文件能够对应上,所以需要检查的文件除开配置文件之外,还应该有hosts文件和/etc/sysconfig/network文件,修改了配置文件,一定要重启服务方可生效!

注:测试的时候换个自己的邮箱地址,不要让我老收到垃圾邮件。
注意:在企业生产环境中,搭建一套完整的邮件收发服务器,需要一个合法的域名,并且把域名设置一个合法的MX记录,这样公网的邮件服务器(163、QQ)收到你的mail,才能通过MX解析到你主机,将回信投递到你的邮件服务器上。

反垃圾邮件联盟:http://www.anti-spam.org.cn/ 可以查看IP地址是否被拉入黑名单。

-------------本文结束感谢您的阅读-------------