邮件服务器

MTA:邮件传输代理、SMTP服务器。最著名的是sendmail.

    sendmail, UUCP:单体结构,SUID,配置文件语法难懂

    qmail

    postfix:模块化设计、安全、和sendmail兼容性很好、效率高

    exim

    exchange(windows,异步消息协作平台)

MDA:邮件投递代理

    procmail、maildrop

MRA:邮件检索代理

    cyrus-imap、dovecot

MUA:邮件用户代理

    Windows:outlook express、outlook、foxmail

    Linux:thunderbird、evolution、mutt(文本界面)

Webmail:openwebmail、squirrelmail


SASL:一种用来扩充C/S模式验证能力的机制,Postfix可以利用SASL来判断用户是否有权使用转发服务或辨认谁在使用你的服务器



postfix的配置文件

postfix模块化

    master:/etc/postfix/master.cf

    mail:/etc/postfix/mail.cf

        格式:参数=值。参数必须写在绝对行首,以空白字符开头的行被认为是上一行的延续

postconf:配置postfix的命令行工具

    -d:显示main.cf的默认配置

    -n:显示修改的main.cf的配置

    -m:显示支持的查找表类型

    -A:显示支持的SASL客户端插件类型

    -e 参数=值:更改某参数配置信息,并保存至main.cf文件中


SMTP状态码:

1xx:纯信息

2xx:正确

3xx:上一步操作尚未完成、需要继续补充

4xx:暂时性错误

5xx:永久性错误

SMTP协议命令:

    helo(smtp协议)

    ehlo(esmtp协议)

    mail from:发件人

    rcpt to:收件人

    data:正文。以.结束


编译安装postfix

邮件依赖于DNS,事先需要安装好,如果有sendmail需关掉

service sendmail stop

chkconfig sendmail off


如果有RPM的postfix也需要删掉

yum remove postfix

userdel postfix

groupdel postfix


安装依赖关系

yum install httpd php php-mysql mysql mysql-server mysql-devel openssl-devel dovecot perl-DBD-MySQL tcl tcl-devel libart_lgpl libart_lgpl-devel libtool-ltdl libtool-ltdl-devel expect perl-Unix-Syslog db4 db4-devel cyrus-sasl-* dovecot-mysql perl-CGI perl-GD


创建postfix用户和组

groupadd -g 2525 postfix

useradd -g 2525 -u 2525 -M -s /sbin/nologin postfix

groupadd -g 2526 postdrop

useradd -g 2526 -u 2526 -M -s /sbin/nologin postdrop


service saslauthd start

chkconfig saslauthd on

service mysqld start

chkconfig mysqld on


tar zxvf postfix-2.11.2.tar.gz 

cd postfix-2.11.2

make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl  -DUSE_TLS ' 'AUXLIBS=-L/usr/lib/mysql -lmysqlclient -lz -lm -L/usr/lib/sasl2 -lsasl2 -lssl -lcrypto'

make

make install

postfix start

netstat -tnlp|grep 25

启动脚本

vim /etc/init.d/postfix

#!/bin/bash

# postfix      Postfix Mail Transfer Agent

# chkconfig: 2345 80 30

# description: Postfix is a Mail Transport Agent, which is the program \

#              that moves mail from one machine to another.

# processname: master

# pidfile: /var/spool/postfix/pid/master.pid

# config: /etc/postfix/main.cf

# config: /etc/postfix/master.cf

 

# Source function library.

. /etc/rc.d/init.d/functions

 

# Source networking configuration.

. /etc/sysconfig/network

 

# Check that networking is up.

[ $NETWORKING = "no" ] && exit 3

 

[ -x /usr/sbin/postfix ] || exit 4

[ -d /etc/postfix ] || exit 5

[ -d /var/spool/postfix ] || exit 6

 

RETVAL=0

prog="postfix"

 

start() {

# Start daemons.

echo -n $"Starting postfix: "

        /usr/bin/newaliases >/dev/null 2>&1

/usr/sbin/postfix start 2>/dev/null 1>&2 && success || failure $"$prog start"

RETVAL=$?

[ $RETVAL -eq 0 ] && touch /var/lock/subsys/postfix

        echo

return $RETVAL

}

 

stop() {

  # Stop daemons.

echo -n $"Shutting down postfix: "

/usr/sbin/postfix stop 2>/dev/null 1>&2 && success || failure $"$prog stop"

RETVAL=$?

[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/postfix

echo

return $RETVAL

}

 

reload() {

echo -n $"Reloading postfix: "

/usr/sbin/postfix reload 2>/dev/null 1>&2 && success || failure $"$prog reload"

RETVAL=$?

echo

return $RETVAL

}

 

abort() {

/usr/sbin/postfix abort 2>/dev/null 1>&2 && success || failure $"$prog abort"

return $?

}

 

flush() {

/usr/sbin/postfix flush 2>/dev/null 1>&2 && success || failure $"$prog flush"

return $?

}

 

check() {

/usr/sbin/postfix check 2>/dev/null 1>&2 && success || failure $"$prog check"

return $?

}

 

restart() {

stop

start

}

 

# See how we were called.

case "$1" in

  start)

start

;;

  stop)

stop

;;

  restart)

stop

start

;;

  reload)

reload

;;

  abort)

abort

;;

  flush)

flush

;;

  check)

check

;;

  status)

   status master

;;

  condrestart)

[ -f /var/lock/subsys/postfix ] && restart || :

;;

  *)

echo $"Usage: $0 {start|stop|restart|reload|abort|flush|check|status|condrestart}"

exit 1

esac

 

exit $?

#end

chmod +x /etc/init.d/postfix

newaliases

chkconfig --add postfix

service postfix start



进行一些基本配置,测试启动postfix并进行发信

vim /etc/postfix/main.cf    #修改以下几项为您需要的配置

myhostname = shilei.com    #我的主机名

mydomain = shilei.com    #我的域名,即做发件地址伪装

myorigin = shilei.com    #我发出去的邮件以什么结尾

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain    #指定postfix接受邮件时接收人的域名,即postfix要接受哪个域名的邮件

mynetworks = 10.10.0.0/16, 127.0.0.0/8    #指定所在网络的网络地址,postfix根据其值来区别用户是本地还是远程,如果是本地用户则允许访问


基于客户端的访问控制概览

/etc/rc.d/init.d/saslauthd

/etc/sysconfig/saslauthd

saslauthd -v:显示当前主机saslauthd服务所支持的认证机制、默认为pam

connection:smtpd_client_restrictions =    客户端发起连接请求时的访问权限

helo:smtpd_helo_restrictions =    限定谁才可以发送helo指定

mail from:smtpd_sender_restrictions =   限定谁可以发送mail from指定

rcpt to:smtpd_recipient_restrictions =   限定谁可以发送rcpt指定

data:smtpd_data_restrictions =   限定谁可以发送data指定


postfix的默认配置如下:

smtpd_client_restrictions =

smtpd_data_restrictions =

smtpd_end_of_data_restrictions =

smtpd_etrn_restrictions =

smtpd_helo_restrictions =

smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination

smtpd_sender_restrictions =


实例1:禁止10.10.0.10主机通过工作在10.10.21.225上的postfix服务发送邮件。访问表使用hash的格式。

vim /etc/postfix/access    编译此文件做为客户端检查的控制文件,在里面定义如下一行

10.10.0.10      REJECT

postmap /etc/postfix/access   将此文件转换为hash格式

配置postfix使用此文件对客户端进行检查.编辑/etc/postfix/main.cf文件,添加如下参数

vim /etc/postfix/main.cf

smtpd_client_restrictions = check_clent_access hash:/etc/postfix/access

postconf -n    显示配置文件新生成的内容

service postfix restart


实例2:禁止来自qq.com的域发送邮件

vim /etc/postfix/access

qq.com    REJECT

postmap /etc/postfix/access

vim /etc/postfix/main.cf

smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/access


实例3:禁止向qq.com域发送邮件

建立/etc/postfix/deny文件(文件名任取),在里面定义如下一行:

qq.comREJECT

postmap /etc/postfix/deny    将此文件转换为hash格式

编辑/etc/postfix/main.cf文件,添加如下参数:

smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/deny,permit_mynetworks, reject_unauth_destination


为postfix开启基于cyrus-sasl的认证功能

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

# postconf -a

cyrus

dovecot


vi /etc/postfix/main.cf

添加以下内容:

############################CYRUS-SASL############################

broken_sasl_auth_clients = yes

smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,

reject_invalid_hostname,reject_non_fqdn_hostname,reject_unknown_sender_domain,reject_non_fqdn_sender,reject_non_fqdn_recipient,reject_unknown_recipient_domain,reject_unauth_pipelining,reject_unauth_destination

smtpd_sasl_auth_enable = yes

smtpd_sasl_local_domain = $myhostname

smtpd_sasl_security_options = noanonymous

smtpd_sasl_path = smtpd

smtpd_banner = Welcome to our $myhostname ESMTP,Warning: Version not Available!


vim /usr/lib/sasl2/smtpd.conf

添加如下内容:

pwcheck_method: saslauthd

mech_list: PLAIN LOGIN

重启服务

service saslauthd restart


测试

telnet 127.0.0.1 25

ehlo hai

auth login

##echo -n "xx" |openssl base64

输入用户帐号、密码


安装Courier authentication library

courier-authlib是Courier组件中的认证库,其认证功能通常包括验正登录时的帐号和密码、获取一个帐号相关的家目录或邮件目录等信息、改变帐号的密码等。而其认证的实现方式也包括基于PAM通过/etc/passwd和/etc/shadow进行认证,基于GDBM或DB进行认证,基于LDAP/MySQL/PostgreSQL进行认证等

tar xvf courier-authlib-0.66.1.tar.bz2

cd courier-authlib-0.66.1

./configure \

    --prefix=/usr/local/courier-authlib \

    --sysconfdir=/etc \

    --without-authpam \

    --without-authshadow \

    --without-authvchkpw \

    --without-authpgsql \

    --with-authmysql \

    --with-mysql-libs=/usr/lib/mysql \

    --with-mysql-includes=/usr/include/mysql \

    --with-redhat \

    --with-authmysqlrc=/etc/authmysqlrc \

    --with-authdaemonrc=/etc/authdaemonrc \

    --with-mailuser=postfix \

    --with-mailgroup=postfix \

    --with-ltdl-lib=/usr/lib \

    --with-ltdl-include=/usr/include

make&&make install

chmod 755 /usr/local/courier-authlib/var/spool/authdaemon

cp /etc/authdaemonrc.dist /etc/authdaemonrc

cp /etc/authmysqlrc.dist /etc/authmysqlrc

vim /etc/authdaemmon

    authmodulelist="authmysql"

    authmodulelistorig="authmysql"

    daemons=10

vim /etc/authmysqlrc

    MYSQL_SERVER localhost

    MYSQL_PORT 3306                   (指定你的mysql监听的端口,这里使用默认的3306)

    MYSQL_USERNAME  extmail      (这时为后文要用的数据库的所有者的用户名)

    MYSQL_PASSWORD extmail        (密码)

    MYSQL_SOCKET  /var/lib/mysql/mysql.sock

    MYSQL_DATABASE  extmail

    MYSQL_USER_TABLE  mailbox

    MYSQL_CRYPT_PWFIELD  password

    MYSQL_UID_FIELD  '2525'

    MYSQL_GID_FIELD  '2525'

    MYSQL_LOGIN_FIELD  username

    MYSQL_HOME_FIELD  concat('/var/mailbox/',homedir)

    MYSQL_NAME_FIELD  name

    MYSQL_MAILDIR_FIELD  concat('/var/mailbox/',maildir)

提供SysV服务脚本

cp courier-authlib.sysvinit /etc/rc.d/init.d/courier-authlib

chmod 755 /etc/init.d/courier-authlib

chkconfig --add courier-authlib

chkconfig --level 2345 courier-authlib on

配置postfix和courier-authlib

新建虚拟用户邮箱所在的目录,并将其权限赋予postfix用户:

mkdir �Cpv /var/mailbox

chown �CR postfix /var/mailbox

接下来重新配置SMTP 认证,编辑 /usr/lib/sasl2/smtpd.conf ,确保其为以下内容:

pwcheck_method: authdaemond

log_level: 3

mech_list:PLAIN LOGIN

authdaemond_path:/usr/local/courier-authlib/var/spool/authdaemon/socket


让postfix支持虚拟域和虚拟用户

1、编辑/etc/postfix/main.cf,添加如下内容:

########################Virtual Mailbox Settings########################

virtual_mailbox_base = /var/mailbox

virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf

virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf

virtual_alias_domains =

virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf

virtual_uid_maps = static:2525

virtual_gid_maps = static:2525

virtual_transport = virtual

maildrop_destination_recipient_limit = 1

maildrop_destination_concurrency_limit = 1

##########################QUOTA Settings########################

message_size_limit = 14336000

virtual_mailbox_limit = 20971520

virtual_create_maildirsize = yes

virtual_mailbox_extended = yes

virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf

virtual_mailbox_limit_override = yes

virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please Tidy your mailbox and try again later.

virtual_overquota_bounce = yes


2、使用extman源码目录下docs目录中的extmail.sql和init.sql建立数据库:

tar zxvf  extman-1.1.tar.gz

cd extman-1.1/docs

mysql -u root -p < extmail.sql

mysql -u root -p < init.sql

cp mysql*  /etc/postfix/


3、授予用户extmail访问extmail数据库的权限

mysql> GRANT all privileges on extmail.* TO extmail@localhost IDENTIFIED BY 'extmail';

mysql> GRANT all privileges on extmail.* TO [email protected] IDENTIFIED BY 'extmail';

说明:启用虚拟域以后,需要取消中心域,即注释掉myhostname, mydestination, mydomain, myorigin几个指令;当然,你也可以把mydestionation的值改为你自己需要的。


配置dovecot

vi /etc/dovecot.conf

mail_location = maildir:/var/mailbox/%d/%n/Maildir

……

auth default {

    mechanisms = plain

    passdb sql {

        args = /etc/dovecot-mysql.conf

    }

    userdb sql {

        args = /etc/dovecot-mysql.conf

    }

    ……


vim /etc/dovecot-mysql.conf                 

driver = mysql

connect = host=localhost dbname=extmail user=extmail password=extmail

default_pass_scheme = CRYPT

password_query = SELECT username AS user,password AS password FROM mailbox WHERE username = '%u'                            

user_query = SELECT maildir, uidnumber AS uid, gidnumber AS gid FROM mailbox WHERE username = '%u'


说明:如果mysql服务器是本地主机,即host=localhost时,如果mysql.sock文件不是默认的/var/lib/mysql/mysql.sock,可以使用host=“sock文件的路径”来指定新位置;

接下来启动dovecot服务:

service dovecot start

chkconfig dovecot on


安装Extmail-1.2

说明:如果extmail的放置路径做了修改,那么配置文件webmail.cf中的/var/www路径必须修改为你所需要的位置。本文使用了默认的/var/www,所以,以下示例中并没有包含路径修改的相关内容。

1、安装

# tar zxvf extmail-1.2.tar.gz

# mkdir -pv /var/www/extsuite

# mv extmail-1.2 /var/www/extsuite/extmail

# cp /var/www/extsuite/extmail/webmail.cf.default  /var/www/extsuite/extmail/webmail.cf


2、修改主配置文件

#vi /var/www/extsuite/extmail/webmail.cf

部分修改选项的说明:

SYS_MESSAGE_SIZE_LIMIT = 5242880    用户可以发送的最大邮件

SYS_USER_LANG = en_US    语言选项,可改作:SYS_USER_LANG = zh_CN

SYS_MAILDIR_BASE = /home/domains    此处即为您在前文所设置的用户邮件的存放目录,可改作:

SYS_MAILDIR_BASE = /var/mailbox


SYS_MYSQL_USER = db_user

SYS_MYSQL_PASS = db_pass

以上两句句用来设置连接数据库服务器所使用用户名、密码和邮件服务器用到的数据库,这里修改为:

SYS_MYSQL_USER = extmail

SYS_MYSQL_PASS = extmail


SYS_MYSQL_HOST = localhost指明数据库服务器主机名,这里默认即可


SYS_MYSQL_TABLE = mailbox

SYS_MYSQL_ATTR_USERNAME = username

SYS_MYSQL_ATTR_DOMAIN = domain

SYS_MYSQL_ATTR_PASSWD = password

以上用来指定验正用户登录里所用到的表,以及用户名、域名和用户密码分别对应的表中列的名称;这里默认即可


SYS_AUTHLIB_SOCKET = /var/spool/authdaemon/socket

此句用来指明authdaemo socket文件的位置,这里修改为:

SYS_AUTHLIB_SOCKET = /usr/local/courier-authlib/var/spool/authdaemon/socket


3、apache相关配置

由于extmail要进行本地邮件的投递操作,故必须将运行apache服务器用户的身份修改为您的邮件投递代理的用户;本例中打开了apache服务器的suexec功能,故使用以下方法来实现虚拟主机运行身份的指定。此例中的MDA为postfix自带,因此将指定为postfix用户:

<VirtualHost *:80>

ServerName mail.magedu.com

DocumentRoot /var/www/extsuite/extmail/html/

ScriptAlias /extmail/cgi /var/www/extsuite/extmail/cgi

Alias /extmail /var/www/extsuite/extmail/html

SuexecUserGroup postfix postfix

</VirtualHost>


修改 cgi执行文件属主为apache运行身份用户:

# chown -R postfix.postfix /var/www/extsuite/extmail/cgi/


如果您没有打开apache服务器的suexec功能,也可以使用以下方法解决:

# vim /etc/httpd/httpd.conf

User postfix

Group postfix


<VirtualHost *:80>

ServerName mail.magedu.com

DocumentRoot /var/www/extsuite/extmail/html/

ScriptAlias /extmail/cgi /var/www/extsuite/extmail/cgi

Alias /extmail /var/www/extsuite/extmail/html

</VirtualHost>


4、依赖关系的解决


extmail将会用到perl的Unix::syslogd功能,您可以去http://search.cpan.org搜索下载原码包进行安装。

# tar zxvf Unix-Syslog-0.100.tar.gz

# cd Unix-Syslog-0.100

# perl Makefile.PL

# make

# make install


5、启动apache服务

# service httpd start

# chkconfig httpd on


安装Extman-1.1


1、安装及基本配置


# tar zxvf  extman-1.1.tar.gz

# mv extman-1.1 /var/www/extsuite/extman


修改配置文件以符合本例的需要:

# cp /var/www/extsuite/extman/webman.cf.default  /var/www/extsuite/extman/webman.cf

# vi /var/www/extsuite/extman/webman.cf


SYS_MAILDIR_BASE = /home/domains

此处即为您在前文所设置的用户邮件的存放目录,可改作:

SYS_MAILDIR_BASE = /var/mailbox


SYS_DEFAULT_UID = 1000

SYS_DEFAULT_GID = 1000

此两处后面设定的ID号需更改为前而创建的postfix用户和postfix组的id号,本文使用的是2525,因此,上述两项需要修改为:

SYS_DEFAULT_UID = 2525

SYS_DEFAULT_GID = 2525


SYS_MYSQL_USER = webman

SYS_MYSQL_PASS = webman

修改为:

SYS_MYSQL_USER = extmail

SYS_MYSQL_PASS = extmail


而后修改cgi目录的属主:

# chown -R postfix.postfix /var/www/extsuite/extman/cgi/


在apache的主配置文件中Extmail的虚拟主机部分,添加如下两行:

ScriptAlias /extman/cgi /var/www/extsuite/extman/cgi

Alias /extman /var/www/extsuite/extman/html


创建其运行时所需的临时目录,并修改其相应的权限:

#mkdir  -pv  /tmp/extman

#chown postfix.postfix  /tmp/extman


修改

SYS_CAPTCHA_ON = 1

SYS_CAPTCHA_ON = 0


好了,到此为止,重新启动apache服务器后,您的Webmail和Extman已经可以使用了,可以在浏览器中输入指定的虚拟主机的名称进行访问,如下:

http://mail.magedu.com


选择管理即可登入extman进行后台管理了。默认管理帐号为:[email protected]  密码为:extmail*123*


说明:

(1) 如果您安装后无法正常显示校验码,安装perl-GD模块会解决这个问题。如果想简单,您可以到以下地址下载适合您的平台的rpm包,安装即可:  http://dries.ulyssis.org/rpm/packages/perl-GD/info.html

(2) extman-1.1自带了图形化显示日志的功能;此功能需要rrdtool的支持,您需要安装此些模块才可能正常显示图形日志。



2、配置Mailgraph_ext,使用Extman的图形日志:(下面所需的软件包面要自己下载)


接下来安装图形日志的运行所需要的软件包Time::HiRes、File::Tail和rrdtool,其中前两个包您可以去http://search.cpan.org搜索并下载获得,后一个包您可以到 http://oss.oetiker.ch/rrdtool/pub/?M=D下载获得; 注意安装顺序不能改换。


安装Time::HiRes

#tar zxvf Time-HiRes-1.9707.tar.gz

#cd Time-HiRes-1.9707

#perl Makefile.PL

#make

#make test

#make install


安装File::Tail

#tar zxvf File-Tail-0.99.3.tar.gz

#cd File-Tail-0.99.3

#perl Makefile

#make

#make test

#make install


安装rrdtool-1.2.23

#tar zxvf rrdtool-1.2.23.tar.gz

#cd rrdtool-1.2.23

#./configure --prefix=/usr/local/rrdtool

#make

#make install


创建必要的符号链接(Extman会到这些路径下找相关的库文件)

#ln -sv /usr/local/rrdtool/lib/perl/5.8.5/i386-linux-thread-multi/auto/RRDs/RRDs.so   /usr/lib/perl5/5.8.5/i386-linux-thread-multi/

#ln -sv /usr/local/rrdtool/lib/perl/5.8.5/RRDp.pm   /usr/lib/perl5/5.8.5

#ln -sv /usr/local/rrdtool/lib/perl/5.8.5/i386-linux-thread-multi/RRDs.pm   /usr/lib/perl5/5.8.5


复制mailgraph_ext到/usr/local,并启动之

# cp -r /var/www/extsuite/extman/addon/mailgraph_ext  /usr/local  

# /usr/local/mailgraph_ext/mailgraph-init start 


启动cmdserver(在后台显示系统信息) 

# /var/www/extsuite/extman/daemon/cmdserver --daemon


添加到自动启动队列

# echo “/usr/local/mailgraph_ext/mailgraph-init start” >> /etc/rc.d/rc.local

# echo “/var/www/extsuite/extman/daemon/cmdserver -v -d” >> /etc/rc.d/rc.local 


使用方法: 等待大约15分钟左右,如果邮件系统有一定的流量,即可登陆到extman里,点“图形日志”即可看到图形化的日志。具体每天,周,月,年的则点击相应的图片进入即可。 


你可能感兴趣的:(邮件服务器)