Linux Postfix

北城以北 提交于 2020-08-07 01:48:59

原文地址:

https://www.cnblogs.com/hello-sky/articles/4532496.html

1. 电子邮件系统基础

在日常工作和生活中,发送和收取电子邮件已成为人们相互沟通的常见方式。对于国内的许多用户来说,大多会注册使用新浪、网易、Hotmail、Gmail等Web界面的电子邮箱,这些邮箱都是IT服务商提供的免费邮箱服务,在邮箱空间,功能等方面会有所限制。

现在更多的企业和机构要求员工使用公司自有的电子邮件系统,通过客户端软件直接与邮件服务器进行通信,以获得更好的通信效率,以及安全、功能方面的保障。

 

1.1 邮件系统角色、邮件协议

Internet网络中的电子邮件系统并不是一个孤立的体系。除了需要DNS服务器提供邮件域的解析,通过Web服务器提供邮箱操作界面以外,邮件收取、传递等功能也是由不同的组件来提供的。

 

1.邮件系统的角色

在实现电子邮件收发的完整系统中,根据各组件所处的位置,承担的功能不同,可以分为不同的角色。

➣   MTA(Mail Transfer Agent,邮件传输代理):一般被称为邮件服务器软件。MTA软件负责接收客户端软件发送的邮件,并将邮件传输给其他的MTA程序,是电子邮件系统中的核心部分。Exchange和Sendmail,Postfix等服务器软件都属于MTA。

➣   MUA(Mail User Agent,邮件用户代理): 一般被称为邮件客户端软件。MUA软件的功能是为用户提供发送、接收和管理电子邮件的界面。在Windows平台中使用的MUA软件包括Outlook  Express,Outlook、Foxmail等,在Linux平台中常用的MUA软件包括Thunderbird,Kmail,Evolution等。

➣   MDA(Mail Delivery Agent邮件分发代理):MDA软件负责在服务器中将邮件分发到用户的邮箱目录。MDA软件相对比较特殊,它并不直接面向邮件用户,而是在后台默默地工作。有时候MDA的功能可以直接集成在MTA软件中,因此经常被忽略。

通过邮件系统中的角色划分可以看出电子邮件系统与其他C/S(Client/Server,客户端服务器)模式的网络应用一样,包括独立的客户端和服务器端软件。

 

2.邮件通信协议

在电子邮件通信过程中邮件传递,收取是最基本的两个功能,应用于不同角色的软件之间。其中最常用的二种邮件协议如下所述。

➣   SMTP(Simple Mail Transfer Protocol,简单邮件传输协议):主要用于发送和传输邮件。MUA使用SMTP协议将邮件发送到MTA服务器中

,而MTA将邮件传输给其他MTA服务器时同样也使用SMTP协议。SMTP协议使用的TCP 25号端口,对于支持发信认证的邮件服务器,将会采用扩展的SMTP协议(Extended SMTP)。

➣   POP(Post Office Protocol,邮局协议):主要用于从邮件服务器中收取邮件。目前POP协议的最新版本是POP3。大多数MUA 软件都支持使用POP3协议,因此该协议应用最为广泛。POP3协议使用TCP 110端口(不支持在线,要先下载到本地)。

➣   IMAP(Internet Message Access Protocol,互联网消息访问协议):同样用于收取邮件。目前IMAP协议的最新版本是IMAP4。与POP3相比较IMAP4协议提供灵活和强大的邮件收取,邮件管理功能。IMAP4协议使用的TCP 143端口(支持先看再存)。

只有电子邮件客户端和服务器同时支持SMTP和POP/IMAP协议才能够实现完整的邮件发送和收取功能。

 

1.2 常见的邮件服务器软件

当用户在享受电子邮件带来的便利的时候,往往看到的只是邮件系统的”品牌“,而忽视了邮件系统的”幕后英雄“——邮件服务器软件。例如使用163邮箱的用户可能并没有想过,网易公司的邮件服务器是使用什么软件搭建的。然而对于企业邮件系统的管理员来说,则必须熟练掌握邮件服务器软件的配置和管理。

邮件服务器软件种类不是很多,常见的主要包括以下几种。

 

1.商业邮件系统

➣   Exchange:Windows系统中最著名的邮件服务器软件,也是微软公司的重量级产品,可以与活动目录等应用很好地结合在一起。当使用Windows服务器平台构建电子邮件系统时Excharge自然就成为首选。

➣   Notes/Domino由IBM公司出品的商业电子邮件和办公协作软件产品,其功能丰富,强大集成性较好且提供跨系统平台的支持,给用户提供了广泛的选择。多应用于一些高校政府部门,银行等较大型的企业单位。

 

2. 开源邮件系统

➣   Sendmail:对于运行在UNIX/Linux环境中的邮件服务器,Sendmail无疑是资格最老的,目前仍然有许多企业的电子邮件系统是使用Sendmail进行搭建的。Sendmail运行的稳定性较好,但安全性欠佳。

➣   Qmail:另一款运行在UNIX/Linux环境中的邮件服务器,比Sendmail具有更好的执行效率且配置,管理更加方便,很多商用电子邮件系统都采用Qmail作为服务器。

➣   Postfix:同样是运行在UNIX/Linux环境中的邮件服务器,Postfix由Wietse负责开发,其目的是为Sendmail提供一个更好的替代产品。Postfix在投递效率稳定性,服务性能及安全性方面都有相当出色的表现。

 

2. Postfix邮件服务基础

Postfix邮件服务器采用了模块化的设计,由许多个不同的程序集合而成,分别用于实现不同的功能。Postfix在启动时首先启动名为master的进程,由master进程主导邮件的处理工作,并在需要时自动加载其他程序以协同工作。

本节主要介绍Postfix的编译安装过程,服务控制以及主要目录和配置文件。

 

2.1 编译安装及服务控制

本节将以源码包postfix-2.8.2.tar.gz为例,讲解Postfix服务的编译安装过程务、控制方法。从其官方网站http://www.postfix.org中可以获取最新的源码包。

 

1.准备工作

为了避免发生端口冲突、程序冲突等现象,应将系统自带的sendmail服务停用,并将默认启动状态设为关闭。由于Postfix系统兼容并沿用了Sendmail的部分设置,因此建议保留Sendmail软件包,而不是直接卸载。

[root@mail ~]# /etc/init.d/sendmail stop

[root@mail ~]# chkconfig --level 2345 sendmail off

 

除此以外,因在下一章中需要Postfix支持SASL认证(通过软件包cyrus-sasl) ,所以应确认已安装好相关软件包。

[root@mail ~]# rpm -qa | grep cyrus

cyrus-sasl-plain-2.1.23-13.el6_3.1.x86_64

cyrus-sasl-lib-2.1.23-13.el6_3.1.x86_64

cyrus-sasl-md5-2.1.23-13.el6_3.1.x86_64

cyrus-sasl-gssapi-2.1.23-13.el6_3.1.x86_64

cyrus-sasl-2.1.23-13.el6_3.1.x86_64

 

2.源码编译及安装

1)创建运行组,用户

为了加强邮件服务的权限控制,需要创建专门的运行组账号postfix和postdrop,以及用户账号postfix。运行用户不需要直接登录到系统也无需创建宿主文件夹。

[root@mail ~]# groupadd -g 1200 postdrop

[root@mail ~]# groupadd -g 1000 postfix

[root@mail ~]# useradd -M -u 1000 -g postfix -G postdrop -s /sbin/nologin postfix

 

2)解包

将下载的postfix源码包解压,释放到/usr/src/目录下,并切换到展开后的源码目录。

[root@mail home]# tar zxf postfix-2.8.2.tar.gz -C /usr/src/

[root@mail home]# cd /usr/src/postfix-2.8.2/

 

3)配置

Postfix软件包的配置步骤使用“make makefiles“进行,具体配置选项可以参考源码目录中README_FILES/文件夹下的说明文件。例如,若要使Postfix支持发信认证可参考文件SASL_README中的相关信息。

[root@mail postfix-2.8.2]# yum -y install gcc-c++

[root@mail postfix-2.8.2]# yum -y install db*-devel

[root@mail postfix-2.8.2]# yum -y install cyrus-sasl-*

[root@mail postfix-2.8.2]# make makefiles 'CCARGS=-DUSE_SASL_AUTH  -DUSE_CYRUS_SASL -I/usr/include/sasl'  'AUXLIBS=-L/usr/lib/sasl2  -lsasl2'

 

其中编译参数CCARGS和AUXLIBS的作用如下。

➣   CCARGS参数:为编译器提供额外的扩展参数。例如,启用SASL认证,并指出cyrus-sasl认证程序的头文件位于/usr/include/sasl/。

➣   AUXLIBS参数:为编译器指出位于标准位置之外的额外函数库。例如,cyrus-sasl 认证程序的库文件位于/usr/lib/sasl2/。

 

4)编译并安装

[root@mail postfix-2.8.2]# make

[root@mail postfix-2.8.2]# make install

执行make install命令以后,最后阶段会需要设置一些安装参数,一般直接“按回车”键接受默认或自动识别的配置即可。完成安装以后,应执行postconf-a命令检查所支持的认证方式,若输出结果中未包含“cyrus“则应检查配置步骤,纠正错误后重新进行配置,编译并安装。

[root@mail postfix-2.8.2]# postconf -a

cyrus           <==支持cyrus认证

dovecot        <==支持dovecot认证

 

3.postfix服务控制

Postfix邮件系统的控制主要通过/usr/sbin/postfix命令进行,结合start、stop、check、reload选项分别实现启动、停止、检查、重载服务的操作。例如,若要启动postfix邮件服务,并验证服务状态,可以执行以下操作。

[root@mail ~]# postfix start

postfix/postfix-script: fatal: the Postfix mail system is already running

[root@mail ~]# postfix status

postfix/postfix-script: the Postfix mail system is running: PID: 2289

 需要注意的是,实际监听服务的进程名并不是postfix,而是master。

[root@mail ~]# netstat -anpt | grep ":25"

tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      2289/master         

tcp        0      0 ::1:25                      :::*                        LISTEN      2289/master

 

当重新调整邮件服务配置以后可以通道check选项进行基本的语法检查,检查无误后再通过reload选项来重载服务。

[root@mail ~]# postfix check <==配置无误,则无输出信息

[root@mail ~]# postfix reload

postfix/postfix-scriptrefreshing the Postfix mail system

 

2.2主要目录和配置文件

安装好postfix软件以后,最好对相关的目录和配置文件有所了解,这样将有助于对Postfix服务器的进一步配置和使用。

 

1. 主要目录

➣   /etc/postfix:包括Postfix服务的主配置文件,各类脚本,查询表等。

➣   /usr/libexec/postfix/:包括Postfix服务的各个服务器程序文件。

➣   /var/spool/postfix/:包括Postfix服务的邮件队列相关的子目录,每个队列子目录用于保存不同的邮件。常见的几个子目录及用途如下所述。

◆   incoming (传入) :存放刚接收到的邮件。

◆   active(活动):存放正在投递的邮件。

◆   deferred(推迟):存放以前投递失败的邮件。

◆   hold(约束):存放被阻止发送的邮件。

◆   corrupt(错误):存放不可读或不可分析的邮件。

➣   /usr/sbin/:包括Postfix服务的各种管理工具程序,这些程序文件名以post开头。

主要的几个程序文件及其用途如下所述。

◆   postalias:构造,修改和查询别名表。

◆   postconf:显示和编辑main.cf配置文件。

◆   postfix:启动、停止Postfix邮件服务,要求有root用户权限。

◆   postmap:构造、修改或者查询表文件(记录如别名等映射关系的文件)。

◆   postqueue:查看邮件队列,一般用户也可以使用。

◆   postsuper:管理邮件队列,要求有root用户权限。

 

2. 主要配置文件

       Postfix邮件系统的主要配置文件包括main.cf,master.cf,都位于/ete/postfix/文件夹下。其中,main.cf是Postfix服务的配置文件,设置邮      件服务器时以修改此文件的内容为主;而master.cf是主程序master的配置文件,一般不需要修改。

       在主配置文件main.cf中可以调整的各种配置参数有近千个。大部分的配置参数都被自动设置了默认值,如果在mail.cf文件中没有对应的设置,郡么Postfix服务器将使用默认值来启动及运行。因此只需要修改很少的几个配置参数就可以满足基本邮件服务器的要求了。

       使用postconf工具可以辅助配置过程,不带任何选项时将列出当前Postfix服务器启用的所有配置参数,若添加”-n"选项则只列出使用非默认值的配置参数。

[root@mail ~]# postconf      <==査看当前启用的所有配置

2bounce_notice_recipient = postmaster

access_map_defer_code = 450

access_map_reject_code = 554

address_verify_cache_cleanup_interval = 12h

address_verify_default_transport = $default_transport

...... //省略部分内容

[root@mail ~]# postconf -n      <==只列出使用非默认值的配置

alias_database = hash:/etc/aliases

alias_maps = hash:/etc/aliases

command_directory = /usr/sbin

config_directory = /etc/postfix

daemon_directory = /usr/libexec/postfix

data_directory = /var/lib/postfix

debug_peer_level = 2

html_directory = no

inet_interfaces = localhost

inet_protocols = all

mail_owner = postfix

mailq_path = /usr/bin/mailq.postfix

manpage_directory = /usr/share/man

mydestination = $myhostname, localhost.$mydomain, localhost

newaliases_path = /usr/bin/newaliases.postfix

queue_directory = /var/spool/postfix

readme_directory = /usr/share/doc/postfix-2.6.6/README_FILES

sample_directory = /usr/share/doc/postfix-2.6.6/samples

sendmail_path = /usr/sbin/sendmail.postfix

setgid_group = postdrop

unknown_local_recipient_reject_code = 550

 

为了避免配置参数过多带来的干扰,提高易读性,建议对main.cf配置文件进行适当的简化,只保留与默认配置不同的参数。

[root@mail ~]# postconf -n > tmp.file

[root@mail ~]# mv /etc/postfix/main.cf /etc/postfix/main.cf.bak

[root@mail ~]# mv tmp.file /etc/postfix/main.cf

 

3.Postfix的日志文件

Postfix邮件服务的日志文件位于/var/log/maillog,该文件中记录了本机中的邮件进出相关的消息,包括邮件服务的启动,出错,与其他SMTP服务器的会话信息等。在维护邮件服务器的过程中,经常会使用带”-f“选项的tail命令来跟踪日志变化。

[root@mail ~]# tail -f /var/log/maillog 

 

当日志内容较多时,还可以使用egrep命令进行过滤,只查看包含reject、error,fatal等较重要的记录。

[root@mail ~]# egerp '(reject|error|fatal|panic):' /var/log/maillog 

 

3. 邮件服务器的基本构建

从本节开始,将以前面编译安装的Postfix为基础,学习如何构建一个完整的电子邮件系统。在整个案例中,使用Postfix软件提供SMTP发信服务,使用Dovecot软件提供POP3/IMAP收信服务(如图所示),使用邮件客户端软件OutlooL2007测试发信,收信功能。

 

在该电子邮件系统架构中,服务器所使用的相关配置环境如下。

➣   IP 地址 : 192.168.1.10/24. 

➣   邮件域@sky.com。

➣   主机名mail.sky.com。

➣   邮件账号:使用本地系统用户。

➣   域名服务器已预先架好DNS服务器,能够提供sky.com域的解析服务,并为该域添加了到192.168.1.10的MX邮件交换记录。

接下来依次讲解Postfix、Dovecot的配置过程以及邮件客户端Outlook的使用。

 

3.1配置SMTP发信服务

在整个电子邮件系统中,Postfix基于SMTP协议提供邮件传递服务,并负责将邮件分发到用户的邮箱空间。对Postfix服务的配置主要通过修改主配置文件/etc/postfix/main.cf来进行。

在main.cf文件中,以”#“号开头的行表示注释信息,其他行表示有效设置,设置行的格式与为Shell变量赋值的形式非常类似,采用”配置参数=值“的形式,其中等号两边的空格可有可无。当某个配置参数包含多个值时,使用逗号或空格进行分隔。也允许换行进行分隔,但行首至少应有一个空格。

 

1.设置main.cf,并启动服务

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

...... //省略部分内容

inet_interfaces = 192.168.1.10,127.0.0.1   <==监听服务的IP地址,默认为all 

myhostname = mail.sky.com        <==邮件服务器的主机名

mydomain = sky.com          <==邮件域

myorigin = $mydomain       <==外发邮件时发件人地址中的邮件域

mydestination = $mydomain,$myhostname      <==允许投递到本地的目标邮件域

home_mailbox = Maildir/        <==设置邮件存储位置和格式

[root@mail ~]# postfix reload     <==重载配置内容

postfix/postfix-script: refreshing the Postfix mail system

 

在上述配置中,将mydestination的值设置为"$mydomain,$myhostname"表示将@sky.com和@mail.sky.com域作为本地目标域,允许投递到本地邮箱空间。各用户的邮件将被保存到宿主目录下的Maildir/文件夹中。

邮箱空间用来存放每个用户的电子邮件内容,在Postfix服务器中支持两种最常见的邮箱存储方式:Mailbox,Maildir(当指定的存储位置最后一个字符为”/“时,自动使用Maildir存储方式)。

➣   Mailbox:同一个用户的所有邮件内容存储为单个文件,通常保存在/var/spool/mail/目录下,文件名与用户名相同。Mailbox存储方式比较古老,当邮件数量较多时会降低查询和管理的效率。

➣   Maildir:使用目录结构来存储用户的邮件内客,每一个用户使用一个文件夹,每封邮件都作为一个独立的文件存放。Maildir方式的存取速度和效率要好一些,对于管理邮件内容也更加方便,大多数较新的邮件服务器都采用这种方式。

 

2. 添加邮箱账号

Postfix服务器默认使用本机中的系统用户作为邮件账号,因此使用时只需要添加Linux用户账号即可。测试时,可以添加两个邮件账号xiaoqi和lisi,并为其设置密码。

[root@mail ~]# groupadd mailusers     <==创建邮箱用户组

[root@mail ~]# useradd -g mailusers -s /sbin/nologin xiaoqi    <==新建账户xiaoqi

[root@mail ~]# passwd xiaoqi

[root@mail ~]# useradd -g mailusers -s /sbin/nologin lisi      <==新建账户lisi

[root@mail ~]# passwd lisi

#删除某个邮箱账号:

[root@mail ~]# userdel -r lisi

[root@mail ~]# rm /var/spool/mail/lisi

[root@mail ~]# rm -rf /home/lisi

 

3.SMTP发送邮件测试

将Postfix服务器交付使用之前,最好先在本机测试一下发信功能是否正常。命令行中的测试工作可以通过telnet命令进行。例如,可以连接到邮件服务器的25端口并输入相关的SMTP命令,以邮件账户xiaoqi@sky.com作为发件人,给lisi@sky.com 发送一封测试邮件。

[root@mail ~]# telnet mail.sky.com 25 <==连接到Postfix服务器

Trying 192.168.1.10...

Connected to mail.sky.com.

Escape character is '^]'.

220 mail.sky.com ESMTP Postfix

HELO mail.sky.com <==宣告客户机地址

250 mail.sky.com

MAIL FROM:xiaoqi@sky.com <==告知客户机地址

250 2.1.0 Ok

RCPT TO:lisi@sky.com <==告知发件人地址

250 2.1.5 Ok

DATA <==告知要发送邮件数据

354 End data with <CR><LF>.<CR><LF>

Subject:A Test Mail! <==指定邮件标题

Dear Lisi: <==编写邮件正文

This is a test mail by Xiaoqi.

. <==单独的点号表示正文结束

250 2.0.0 Ok: queued as 9C34440E8B

QUIT <==断开连接并退出

221 2.0.0 Bye

Connection closed by foreign host.

 

邮件发送并投递成功以后,可以到服务器中lisi用户的宿主目录下进行查看,新接收到的邮件保存在Maildir/new/目录中。

[root@mail ~]# ls -lh /home/lisi/Maildir/new/

总用量 4.0K

-rw-------. 1 lisi mailusers 434 5月  21 09:41 1432172479.Vfd00Ia04a3M869051.mail.sky.com

 

[root@mail ~]# cat /home/lisi/Maildir/new/1432172479.Vfd00Ia04a3M869051.mail.sky.com 

Return-Path: <xiaoqi@sky.com>      <==退信地址

X-Original-To: lisi@sky.com      <==来源地址

Delivered-To: lisi@sky.com      <==提交目的地址

Received: from mail.sky.com (www.sky.com [192.168.1.10])

    by mail.sky.com (Postfix) with SMTP id 9C34440E8B       <==经由哪些MTA接受

    for <lisi@sky.com>; Thu, 21 May 2015 09:39:46 +0800 (CST)     

Subject:A Test Mail!      <==邮件主题

Message-Id: <20150521014004.9C34440E8B@mail.sky.com>

Date: Thu, 21 May 2015 09:39:46 +0800 (CST)

From: xiaoqi@sky.com      <==发件人地址

 

Dear Lisi:         <==邮件内容

This is a test mail by Xiaoqi.

 

通过以上测试结果,不难发现已经能够通过Posrfix服务器发送并投递邮件了,但是还只能在服务器本机查看收到的邮件。若要使收件人能够从其他主机查收邮件,还需要进一步安装POP3或IMAP服务器以提供邮件的下载服务。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!