搭建企业邮箱之postfix

3年前 (2017-08-26) gtj linux基础, WEB应用 0评论 已收录 235℃

一:简介

电子邮件系统(Electronic mail system,简称E-mail)类似于传统的邮局,邮递员就是电子邮件中的用户代理MUA(Mail User Agent),邮件传输代理MTA(Mail Transfer Agent)就类似于传统的邮局,邮件投递代理MDA(Mail Delivery Agent)类似于传统邮局的分拣送件,所以电子邮件的主要组成部分为MUA,MTA,MDA。工作原理是用户通过MUA发送一封邮件,然后邮件会被MTA解析分析,之后MTA会根据邮件里的收件方的地址通过N多MTA将邮件通过MDA投递给目标用户的邮箱里。


电子邮件是互联网的应用,遵循互联网的相关协议,现在常用的电子邮件主要是由邮件传输协议SMTP,接收邮件的邮局协议POP3和邮件访问协议IMAP4组成,这些协议都遵循TCP/IP协议。它们分别使用TCP端口的25,110,143端口,这些端口也是可以自己设置的。下面具体介绍下SMTP,POP和IMAP协议。
SMTP的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一种基于文件传输的规范,通过这种规范来完成邮件从发件用户到收件用户的传输。遵循SMTP协议,可以让邮件通过特定的中转方式进行中转传输。
POP邮件协议主要的功能就是从个人计算机上登陆到邮件服务器,然后查找有没有自己的邮件,如果有自己的邮件可以查看下载到本地客户端,也可以从邮件服务器上删除自己的邮件。也可以什么都不做。 POP邮局协议负责从邮件服务器中检索电子邮件也就是负责电子邮件的接收的协议。POP协议支持多用户互联网邮件扩展,任何格式的内容都可以发送。
折叠IMAP协议互联网信息访问协议(IMAP)的诞生是为了代替POP协议,克服POP协议的缺点的协议。IMAP不仅有POP的功能,更能在服务器上操作,进行可以DIY的选择从邮件服务器上接收自己邮件的方式,并且imap可以在服务器上创建自己的相关信息,这些操作都是在服务端的服务器上进行的,通俗的理解IMAP相当于oneline编辑。

二:搭建架构

本次实验采用postfix搭建企业邮箱

三:搭建

1.环境准备

[root@gtj]# iptables –F 清空防火墙规则
[root@gtj]# service iptables save   清空之后,保存防火墙规则。
[root@gtj]#  /usr/sbin/sestatus  -V  查看selinux当前的状态。
[root@gtj]# setenforce 0           设置selinux的状态为permissive模式。

2.安装依赖包

yum install -y autoconf,automake,libtool,rpm-build,mariadb-server,php-xml,php-pdoperl-DBD-MySQL,libtool-ltdl,expect,php-gd,libdbi,ruby,ruby-libs,php,gd,perl-Time-HiRes,xorg-x11-fonts-Type1,perl-CGI,perl-ExtUtils-MakeMaker,gamin,perl-GD,perl-DB_Filegcc gcc-c++ krb5-devel openssl-develpam-devel mariadb-devel postgresql-devel zlib-devel openldap-devel
然后下载下面相关:
groff-1.22.2-8.el7.x86_64.rpm
libmcrypt-2.5.8-13.el7.x86_64.rpm 
mhash-0.9.9.9-10.el7.x86_64.rpm
perl-BSD-Resource-1.29.07-1.el7.x86_64.rpm
perl-Crypt-PasswdMD5-1.3-0.16.el7.noarch.rpm
perl-File-Tail-0.99.3-21.el7.noarch.rpm
perl-Linux-Pid-0.04-18.el7.x86_64.rpm 
perl-Unix-Syslog-1.1-17.el7.x86_64.rpm
php-mcrypt-5.4.16-3.el7.x86_64.rpm 
rrdtool-perl-1.4.8-8.el7.x86_64.rpm
rrdtool-ruby-1.4.8-8.el7.x86_64.rpm

3.启动mysql

systemctl start mariadb
[root@servergtj mail]# mysqladmin -urootpassword 'gtj123456'

4.搭建DNS服务

[root@servergtj ~]# yum -y install bind bind-chroot  
[root@servergtj ~]# service named start    开启DNS服务
vim/etc/named.conf,然后在末尾增加一下内容,vim/etc/named.conf
options { 
      listen-on port 53 { any; };  //any的意思是允许任何IP地址进行查询。       
listen-on-v6 port 53 { ::1;};     
allow-query   { any; }; //这里同上一个注释      
recursion yes;       
dnssec-enable yes;  
dnssec-validation yes;     
dnssec-lookaside auto;    
include"/etc/named.rfc1912.zones"; 区域文件定义
vi named.rfc1912.zones设置一个正向的域和一个反向的域(一个正向域必须有一个反向域)在配置文件的最后添加zone "mydream123.com" IN {
        type master;
        file "mydream123.com.zone";          allow-update { none; };
};
zone "0.168.192.in-addr.arpa" IN {
type master;
file "0.25.172.in-appr.zone"; 
 allow-update { none; };
}; 
[root@servergtj named]# cp  named.localhost mydream123.com.zone
然后修改配置文件/var/named/mydream123.com.zone。
vi /var/named/mydream123.com.zone
每一个域名后面必须有点(.)
@       IN SOA  mydream123.com. Admin
        NS      mydream123.com.  后面的.是不能少的。
         MX 5    mail.mydream123.com. 先解析到这个地址。mail     A    192.168.10.103
配置好正向解析域之后,配置反向解析域。操作如下: 
[root@servergtj named]# cp named.loopback 192.168.0.in-appr.zone 
然后修改配置文件
/var/named/192.168.0.in-appr.zone。
vi 192.168.0.in-appr.zone  
         NS      mydream123.com.
 103    PTR     mail.mydream123.com. 
设置好正向解析域和反向解析域之后,重启DNS服务让配置生效。
/etc/init.d/named restart
把DNS解析指向192.168.10.103。
192.168.10.103  mail.mydream123.com
可以用nslookup测试能不能解析到正确的地址

5.创建相关数据库

tar zxf extman-1.1.tar.gz
cd   extman-1.1/docs
sed -i 's/ TYPE=MyISAM.*;/;/' extmail.sql
mysql  -uroot  -pgtj123456 < extmail.sql  向数据库里导入相关表。
mysql -uroot  -pgtj123456< init.sql     初始化数据库
chkconfig mysqld on 让数据库开机自启

6.安装courier-authlib

rpm -ivh courier-authlib-0.66.3-1.el7.x86_64.rpm
cd /etc/authlib
vim authdaemonrc
修改如下三个选项
authmodulelist="authmysql"
authmodulelistorig="authmysql"
DEBUG_LOGIN=2
修改的前两个内容代表调用mysql认证,最后一行的意思是显示调用courier-authlib时产生的日志,以便方便之后发生错误时排错。
修改 authmysqlrc
vim authmysqlrc
MYSQL_SERVER localhost
MYSQL_USERNAME extmail 
MYSQL_PASSWORD extmail  
MYSQL_PORT      3306   //数据库服务的端口
MYSQL_UID_FIELD    ‘2000’ 
MYSQL_GID_FIELD     ‘2000’ 
MYSQL_USER_TABLE     mailbox  
MYSQL_SOCKET   /var/lib/mysql/mysql.sock
MYSQL_DATABASE   extmail
MYSQL_SELECT_CLAUSE SELECT
username,password,"",uidnumber,gidnumber,CONCAT('/home/data/domains/',homedir),
CONCAT('/home/data/domains/',maildir),quota,name FROM mailbox WHERE username= '$(local_part)@$(domain)'
MYSQL_SELECT_CLAUSE 参数必须为一行内容。不然启动中间件courier-authlib会报错,导致启动不了。
chmod 755 /var/spool/authdaemon/  这个必须添加的权限,不然的话无法启用courier-authlib认证服务。
systemctl start courier-authlib 
chkconfig couier-authlib 启动开机自启程序
然后我们通过ps -ef |grep courier-authlib 这个指令检查有没有启动成功。

7.POP与IMAP支持

yum localinstall courier-imap-4.16.2-1.x86_64.rpm courier-unicode-1.3-1.el7.x86_64.rpm
安装完成之后就可以正常启动 courier-imap了。指令如下:
systemctl start courier-imap
chkconfig courier-imap 加入开机自启服务
然后通过ps -ef |grep courier-imap 验证是否启动成功。如图3.8说明courier-imap启动成功。

8.sasl认证

rpm -ivh cyrus-sasl-2.1.26-17.el7.src.rpm
cd  ~/rpmbuild/SPECS/
vi cyrus-sasl.spec
在配置文件242行的地方加入如下语句
--with-authdaemond=/var/spool/authdaemon/socket \
通过rpmbuild -ba cyrus-sasl.spec检测配置,软件有没有错误,如果没有错误才可以继续执行以下
行如下的操作。
for i in $(rpm -qa | grep sasl | awk -F"-2.1.26" '{ print $1 }') ; do rpm -e $i --nodeps >/dev/null ; done
rpm -ivh ../RPMS/x86_64/cyrus-sasl-*
生成sasl的相关配置文件 ,Postfix 会调用smtp.conf配置文件,手工创建该文件,并且在这个配置文件中声名使用authlib来认证。操作如下:
cat > /etc/sasl2/smtpd.conf << ENDF
pwcheck_method:authdaemond
log_level:3
mech_list:PLAIN LOGIN
authdaemond_path:/var/spool/authdaemon/socket
ENDF

然后通过postconf –a 检测postfix是不是支持sasl认证


9.配置postfix

因为rhel系统默认自带sendmail程序,sendmail程序和postfix会发生冲突,所以我们在安装postfix之前先把sendmail卸载了,然后再安装postfix。操作如下:
通过rpm –qa来查看有没有安装sendmail。

[root@servergtj named]# rpm -qa |grep sendmail 查看到的结果是存在sendmail相关的软件的。然后我们用rpm –e来卸载和sendmail相关的软件,然后检测还有没有,如果没有的话再安装postfix软件。
[root@servergtj named]# rpm -e sendmail sendmail-cf sendmail-doc –nodeps 卸载sendmail相关软件。
[root@servergtj named]# kilall  -9   sendmail  强制删除sendmail进程
然后通过提前准备好的postfix的安装包通过yum的方式安装postfix。命令如下:
[root@servergtj named]# yum install postfix 
安装好postfix之后,接下来要对postfix进行配置了。这些配置是实验的重中之中,所以一定要小心配置,不然会出很多自己很难解决和发现的错误。因为配置还是很复杂的,所以实验中修改了多次的配置文件。首先修改postfix主配置文件,修改一些基本配置项,比如主机名,监听地址等等。
vim  /etc/postfix/main.cf 
myhostname = mail.mydream123.com
mydomain = mydream123.com
myorigin=$mydomain  //发件者的域名
inet_interfaces =   postfix //监听的网络接口
mynetworks=127.0.0.0/8 192.168.0.0/24  //信任的客户端
mydestination = $myhostname, localhost.$mydomain, localhost //收件人使用的域名
通过cat /etc/sysconfig/network 查看myhostname,mydomain。
实验中postfix需要支持虚拟域,在配置文件后面加入虚拟域支持相关的参数。操作如下:
message_size_limit = 14680064 //该项限制了postfix队列文件的大小。
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_base = /home/data/domains
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_limit_maps.cf
virtual_transport = maildrop  //用maildrop进行邮件的投递
maildrop_destination_recipient_limit = 1
smtpd_recipient_restrictions =   //进行地址过滤
permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unauth_destination,
reject_unauth_pipelining,
reject_invalid_hostname,
# SMTP sender login matching config
smtpd_sender_restrictions =
permit_mynetworks,
reject_sender_login_mismatch,
reject_authenticated_sender_login_mismatch,
reject_unauthenticated_sender_login_mismatch
smtpd_sender_login_maps =
mysql:/etc/postfix/mysql_virtual_sender_maps.cf,
mysql:/etc/postfix/mysql_virtual_alias_maps.cf
# SMTP AUTH config here
broken_sasl_auth_clients = yes  //启用smtp关于sasl的认证
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous sasl //认证拒绝匿名用户

cp extman-1.1/docs/mysql_virtual_* /etc/postfix
systemctl start postfix 
chkconfig postfix on

10.MDA的安装

邮件投递代理MDA用的是maildrop,安装maildrop用来扩展邮件投递功能, maildrop是一个非常优秀的MDA ,在投递邮件时让postfix使用 maildrop来投递邮件。操作如下:

rpm -ivh maildrop-2.8.3-2.x86_64.rpm
groupadd -g 1000 vgroup
useradd -g 1000 -u 1000 -s /sbin/nologin -d /dev/null vuser
如果 uid 1000 已经被占用,则可以更换 uid ,如下所示:
groupadd -g 2000 vgroup
useradd -g 2000 -u 2000 -s /sbin/nologin -d /dev/null vuser
bash id-sql.sh -u 2000 -g 2000 -n root -p uplooking
配置/etc/postfix/master.cf 文件 ,让 postfix 可以调用 maildrop 。
vi /etc/postfix/master.cf 在最后面加入下面内容 :
maildrop unix - n n - - pipe
flags=DRhu user=vuser argv=/usr/bin/maildrop -d ${user}@${nexthop}
${recipient} ${user} ${extension} ${nexthop}//这个可以不是一行内容。
创建邮件存储目录 并建个测试域。操作如下:
mkdir -p /home/data/domains/extmail.org/postmaster
maildirmake /home/data/domains/extmail.org/postmaster/Maildir
chown -R vuser:vgroup /home/data/domains/
service postfix restart
测试 maildrop是否能够正常工作。操作如下:
echo "test" | maildrop -V 10 -d postmaster@extmail.org
maildrop: authlib: groupid=1000
maildrop: authlib: userid=1000
maildrop: authlib: logname=postmaster@extmail.org,
home=/home/data/domains/extmail.org/postmaster,
mail=/home/data/domains/extmail.org/postmaster/Maildir/
maildrop: Changing to /home/data/domains/extmail.org/postmaster
Message start at 0 bytes, envelope sender=postmaster@extmail.org
maildrop: Attempting .mailfilter
maildrop: Delivery complete.

出现上以信息就证明了authlib和maildrop 是正常工作的。如图下图说明我们配置的是正确的。

11.Webmail安装

vim   /etc/httpd/conf/httpd.conf 修改下面两项就可以了
User vuser
Group vgroup
[root@gtj~]# chgrp vgroup /usr/sbin/suexec
[root@gtj ~]# cd /etc/httpd/conf.d/
[root@gtj conf.d]# vim extmail.conf
Alias /extman/cgi/ /var/www/extsuite/extman/cgi/
Alias /extman /var/www/extsuite/extman/html/
<Location "/extman/cgi">
SetHandler cgi-script
Options +ExecCGI
</Location>
# config for ExtMail
Alias /extmail/cgi/ /var/www/extsuite/extmail/cgi/
Alias /extmail /var/www/extsuite/extmail/html/
<Location "/extmail/cgi">
SetHandler cgi-script
Options +ExecCGI
</Location>

这样就完成了apache的相关配置,然后安装extmail和extman
找到开始准备好的extmail和extman的安装包,首先我们找到并解压extman 和 extmail,然后cp 到 apache的网站根目录下。然后cd到 /var/www/extsuite/extmail 目录下,配置extman和extmail。生成主配置文件,并在主配置文件中修改相应选项。做如下操作:

mkdir   /var/www/extsuite
cp -r extmail-1.2 /var/www/extsuite/extmail
cp  -r  extman-1.1   /var/www/extsuite/extman
cp webmail.cf.default webmail.cf
修改 webmail.cf  下面的选项
SYS_MAILDIR_BASE = /home/data/domains
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail
cd到 /var/www/extsuite/extman 目录下
cp webman.cf.default webman.cf
修改 webman.cf  下面的选项为邮件目录 :
SYS_MAILDIR_BASE = /home/data/domains
SYS_SESS_DIR = /tmp
以下参数选配
SYS_DEFAULT_UID = 2000
SYS_DEFAULT_GID = 2000
SYS_CAPTCHA_ON =   0
extman为我们提供了一个友好的图形化日志分析工具,可以对其进行简单的配置并启用这个后台日志分析工具。操作如下:
cd    /var/www/extsuite/extman/addon/
cp -r mailgraph_ext /usr/local/
然后我们启动这个日志分析工具。
/usr/local/mailgraph_ext/mailgraph-init start
echo '/usr/local/mailgraph_ext/mailgraph-init start' >> /etc/rc.local
通过几次的实验发现extman与extmail的perl代码中有些小问题,为保证稳定运行,要修改一下,操作如下:
tar xf Encode-IMAPUTF7-1.05.tar.gz
cd Encode-IMAPUTF7-1.05
perl Makefile.PL
cp lib/Encode/IMAPUTF7.pm /var/www/extsuite/extman/libs/Encode/IMAPUTF7.pm
vi /var/www/extsuite/extmail/cgi/index.cgi
#!/usr/bin/perl -wT
修改成
#!/usr/bin/perl -w
重启一下服务,测试一下:
systemctl restart httpd
systemctl restart postfix
chown -R vuser:vgroup /var/lib/php/session/

12.访问测试

打开浏览器 , 输入 http://mail.mydream123.xyz/extman
用户为:root@extmail.org 密码 为 : extmail*123* 进入webmail的后台管理界面。然后可以看到很多选项。

13.关于垃圾邮件过滤

可以通过spamassassin进行垃圾邮件过滤。

博主

这货来去如风,什么鬼都没留下!!!

相关推荐

嗨、骚年、快来消灭0回复。

×
订阅图标按钮
Less is more!!!