如何搭建自己的邮件服务器

0. 邮件系统介绍

邮件系统角色:MUA(邮件用户代理)、MTA(邮件传输代理)、MDA(邮件分发代理 )

MTA:一般被称为邮件服务器软件,负责接收客户端软件发送的邮件,并将邮件传输给其他的MTA程序,是电子邮件系统中的核心部分。例如Exchange、 Postfix都属于MTA类软件

MUA:一般被称为邮件客户端软件,负责为用户提供发送、接收和管理电子邮件的界面。例如Outlook、Outlook Express、Foxmail等

MDA:负责在服务器中将邮件分发到用户的邮箱目录(默认情况下是/var/spool/mail/user),它并不直接面向邮件用户,而是在后台默默的工作。有时候MDA的功能可以直接集成在MTA软件中,因此经常被忽略。

rhel5默认采用sendmail做为MTA,rhel6则采用postfix,安装postfix和dovecot软件包,yum方式安装;

配置DNS服务器,在正向区数据文件中创建邮件服务器的A和MX记录

1. postfix安装配置

rhel6默认已经安装好了postfix,所以只需要安装dovecot即可。如下图所示:

postfix服务的配置文件:/etc/postfix/main.cf

postfix系统提供了 postconf 工具可以用来辅助配置

执行 postconf ,查看当前的有效配置,如postconf “inet_interfaces”

执行 postconf -n ,查看非默认配置

执行 postconf -d ,查看默认配置

执行postconf -e ,修改自定义设置,如postconf -e “inet_interfaces = all”

#postconf -n > main2.cf

#mv main.cf main.cf.bak

#mv main2.cf main.cf

修改postfix主配置文件相关配置如下:添加或修改下图红色部分的配置

参数解释:

inet_interfaces = all //设置postfix服务监听的IP地址,设置为all表示监听所有IPmydomain=http://renet.com //设置postfix服务器使用的邮件域名myhostname = mail.peixun.wlmq //设置postfix服务器使用的主机名myorigin = $myhostname //外发邮件时发件人地址中的邮件域名, 指明发件人所在的域名mydestination = $myhostname, $mydomain //允许投递到本地的邮件域名,可接收邮件的主机名或域名, 即您的postfix系统要接收到哪个域名的邮件mynetworks //设置可转发哪些网络的邮件, postfix系统根据其值来区别用户是远程的还是本地的,这些地址和网络可以通过此MTA转发邮件至任何地方,无需进一步身份验证relayhost//smarthost转发所有通过的出站邮件。通常用方括号指定,以避免MX记录查找local_transport //收件地址为$mydestination的邮件的发送方式。默认情况下,设置为local:$myhostname(使用local MDA将传入的邮件发送到/var/spool/mail中的本地邮件存储位置)home_mailbox = Maildir///设置邮件存储位置和格式,postfix支持2种最常见的邮箱存储方式(当指定的存储位置最后一个字符为“/”时,自动使用Maildir存储方式)Mailbox//将同一用户的所有邮件内容存储在同一个文件中,例如 “/var/spool/mail/username”,这种方式比较古老,在邮件数量较多时查询和管理的效率较低Maildir//使用目录结构来存储用户的邮件内容,每一个用户对应有一个文件夹,每一封邮件作为一个独立的文件保存,例如/home/username/Maildir/*,这种方式存取速度和效率更好,而且对于邮件内容管理也更方便

重启postfix服务

#service postfix restart

#chkconfig postfix on

创建邮件账户,如下图所示:

测试发邮件:

验证收信人zhangsan是否收到邮件:

2. 修改dovecot主配置文件

vi /etc/dovecot/dovecot.conf!include conf.d/*.conf //该配置项说明conf.d下的所以conf结尾的文件均有效,注意最前面的"!"号protocols = imap pop3 lmtplogin_trusted_networks = 192.168.0.0/24 //指定允许登录的网段地址

设置/etc/dovecot/conf.d/10-mail.conf配置文件

如下图,将下图打勾处注释去掉

设置完mail_location值后,需要重启dovecot服务.

#service dovecot restart

#chkconfig dovecot on

测试接收邮件:

可以使用mailq命令或postqueue -p命令显示已排队的所有传出邮件的列表,若要尝试再次立即发送所有已排队的邮件,可以运行postfix flush命令或postqueue -f命令;否则postfix将大约每小时尝试重新发送一次,直到邮件被接受或过期。

3、设置邮件用户的别名和群发列表

在/etc/postfix/main.cf文件中存在如下配置项(默认就存在,只需确认一下即可)

修改/etc/aliases别名文件,中其中添加相关设置,如图所示:

aliases别名文件解释:

第一行是为zhangsan邮件用户起一个别名:admin;第二行是创建一个群发列表,群发列表名叫tech,列表中包含lisi和zhangsan两个邮件账户

执行postalias或newaliases命令更新别名文件。

#postalias /etc/alias 或#newaliases

最后重启postfix服务

4、虚拟别名域的配置

使用虚拟别名域,可以将发给虚拟域的邮件实际投递到真实域的用户邮箱中;可以实现群发组邮递功能,即指定一个虚拟邮件地址,任何人发给这个邮件地址的邮件都将由邮件服务器自动转发到真实域中的一组用户的邮箱中。

实际虚拟域是真实域的一个别名,是通过一个虚拟别名表virtual实现了虚拟域的邮件地址到真实域的邮件地址的重定向

编辑postfix主配置文件/etc/postfix/main.cf,添加如下定义,如下图所示:

参数解释:

第一行用来指定虚拟别名域的名称;

第二行用来指定含有虚拟别名域定义的文件路径。

编辑配置文件/etc/postfix/virtual,进行如下定义,如下图所示:

参数解释:

第一行的含义是将发送给虚拟域@http://accp.com,的邮件实际投递到真实的本地域@http://renet.com第二行的含义是发往虚拟域邮箱[email protected]的邮件将投递到邮件用户zhangsan的邮箱中第三行参数是发往虚拟域邮箱[email protected]的邮件将投递到lisi和zhangsan的邮箱中

在修改配置文件main.cf和virtual后。要使更改立即生效,应分别执行postmap和重启postfix服务

#postmap /etc/postfix/virtual

#service postfix restart

5、webmail邮件界面(squirrelmail)

Webmail是指提供给邮件用户发信、收信使用的网页操作界面,通过访问邮件系统提供的WEB界面,可以和邮件客户端软件实现类似的邮件管理功能。

1)安装httpd和php相关的软件包并启动httpd服务

#yum -y install httpd

#yum -y install php-*

#service httpd start

#chkconfig httpd on

注意:要确保以下两个软件包要安装,否则用户不能通过WEB方式登录邮箱

2)释放并配置squirrelmail程序套件

将squirrelmail程序套件和中文件语言包拷贝到邮件服务器本地(如/root目录),

首先将SquirrelMail解压到WEB服务器的网页文档根目录(默认是/var/www/html),并改名

# tar jxvf squirrelmail-1.4.13.tar.bz2 -C /var/www/html

# cd /var/www/html

# mv squirrelmail-1.4.13 webmail

# cd webmail

然后在SquirrelMail的网页文件目录中解压释放中文语言包

# tar jxvf ~/zh_CN-1.4.13-.tar.bz2

创建及调整数据目录、附件目录

# mkdir -p attach data

# chown -R apache:apache attach/ data/

# chmod 730 attach/

建立并调整 config.php 配置文件

# cp config/config_default.php config/config.php

# vi config/config.php

从样例文件复制生成配置文件,根据需要调整相关参数(只需改动少数几个参数即可)

$squirrelmail_default_language = ‘zh_CN’; 默认语言

$default_charset= ‘zh_CN.UTF-8’; 默认字符集

$domain = ‘http://renet.com’; 邮件域名

$smtpServerAddress =‘127.0.0.1’; 设置发信服务器地址

$smtpPort = 25; SMTP服务器端口

$imap_server_type = ‘dovecot’; 设置IMAP收信服务器类型

$imapPort = 143; IMAP服务端口

$data_dir= ‘/var/www/html/webmail/data/’; 数据目录位置

$attachment_dir = ‘/var/www/html/webmail/attach/’; 附件目录位置

3)在浏览器中登录squirrelmail系统

开启httpd_can_sendmail布尔值为on状态

访问

http://WEB服务器IP或FQDN/webmail

6、设备SMTP的用户认证

当用户通过SMTP协议向外部邮件域发送邮件时,服务器会要求用户提供用户帐号和口令进行身份认证,只有成功通过身份认证的用户才被允许向外部发送邮件,否则将拒绝发信请求

目前,比较常用的SMTP认证机制是通过Cyrus SASL包来实现的,Cyrus SASL最大功能是为应用程序提供了认证函数库。应用程序可以通过函数库所提供的功能定义认证方式,并让SASL通过与邮件服务器主机的沟通从而提供认证的功能。

1)查看系统中是否安装了与cyrus相关的RPM软件包:

2)验证

使用以下命令验正postfix是否支持cyrus风格的sasl认证,如果您的输出为以下结果,则是支持的;

默认情况下,Cyrus SASL使用saslauthd这个守护进程进行密码认证,而密码认证的方法有多种,使用下面的命令可查看当前系统中的Cyrus SASL所支持的密码验证机制

这里准备采用shadow验证方法,也就是直接用/etc/shadow文件中的用户账户及密码进行认证,因此在配置文件/etc/sysconfig/saslauthd中,应确定当前系统所采用的密码验证机制为shadow,如下图:

3)启动saslauthd服务并测试认证功能

#service saslauthd start

#chkconfig saslauthd on

然后用下面的命令测试saslauthd进程认证功能,如下图:

其中lisi为linux系统中的用户账户名,‘’为用户lisi的密码

4)设置postfix启用SMTP认证

在main.cf文件中添加有关SMTP认证的设置部分,下图所示:

重启postfix服务

5)测试SMTP发信认证

通过下列命令获得 lisi的用户名及密码的加密字串:

使用telnet命令进行发信认证:

只要邮件服务器能通过DNS解析internet域名,就能向internet的其他邮件系统发送邮件;internet的其他邮件系统能解析本邮件系统的MX记录就可以接收INTERNET的邮件。

7、邮件过滤功能配置

1)基于主机名/IP地址的邮件过滤

使用smtpd_client_restrictions配置参数,通过设置限制条件check_client_access指向一个含有IP地址、网络地址、主机名称、域名的查询表文件。

修改/etc/postfix/main.cf配置文件,添加如下配置项:

smtpd_client_restrictions = check_client_access hash:/etc/postfix/access

修改/etc/postfix/access文件,添加访问控制策略,拒绝192.168.1.0/24网段、192.168.0.11主机和http://bbc.com域中的主机发送的邮件,如下图所示

使用postmap命令将access文件转换为hash数据库文件access.db

REJECT:拒绝且退回信件

DISCARD:丢弃(拒绝且不回馈信息)

OK:允许

RELAY:转发

重启postfix服务,使修改生效

测试:在192.168.0.11主机执行telnet postfix服务器IP 25进行发邮件测试,如下图:

2)根据发件人的地址过滤邮件

使用smtpd_sender_restrictions配置参数,通过设置限制条件check_sender_access指向一个含有发件人完整邮件地址、域名的查询表文件。

修改/etc/postfix/main.cf配置文件,添加如下配置项:

smtpd_sender_restrictions =check_sender_access hash:/etc/postfix/access

修改/etc/postfix/access文件,添加访问控制策略,拒绝[email protected]邮件地址、任何域的market用户及来自http://qq.com域中任何用户发送的邮件

如下图所示

使用postmap命令将access文件转换为hash数据库文件access.db

重启postfix服务,使修改生效

在一台客户端模拟[email protected]

发邮件,如下图所示:

3)根据收件人的地址过滤邮件

使用smtpd_recipient_restrictions配置参数,通过设置限制条件check_recipient_access指向一个含有收件人邮件地址的查询表文件。

修改/etc/postfix/main.cf配置文件,添加如下配置项:

permit_mynetworks //允许本邮件系统发出的邮件permit_sasl_authenticated //允许通过sasl认证的用户作为发件人reject_unauth_destination //收件人地址域不包括在Postfix授权网络内时拒绝reject_non_fqdn_recipient //收件人地址域不属于合法FQDN时拒绝reject_unknown_recipient_domain //收件人地址域未知或不存在时拒绝

修改/etc/postfix/access文件,添加访问控制策略,拒绝[email protected]用户接收邮件,如下图所示

使用postmap命令将access文件转换为hash数据库文件access.db

重启postfix服务,使修改生效

测试,如下图

ID:snmp161