Linux 邮件服务器 之跟我一步一步来实现一个邮件系统【转】
转自:http://tchuairen.blog.51cto.com/3848118/1686875/
上一篇介绍了邮件服务器的各组件功能和原理,这次来由浅的入深来一步步实现一个邮件系统。
实验环境:
操作系统 | CentOS release 5.11 64位 |
postfix-2.11.6 | |
courier-authlib-0.64.0 | |
cyrus-sasl-2.1.22-7.el5_8.1 | |
cyrus-sasl-plain-2.1.22-7.el5_8.1 | |
dovecot.x86_64 0:1.0.7-8.el5_9.1 | |
extman-1.1 | |
extmail-1.2 | |
Unix-Syslog-1.1 |
一、安装postfix,建立基本配置
postfix安装过程(略)详细可见上一篇博文
http://tchuairen.blog.51cto.com/3848118/1684872
1、编辑配置文件" /etc/postfix/main.cf " 定义如下内容:
1
2
3
4
5
|
myhostname = mail.qupeiyin.net myorigin = $mydomain mydomain = qupeiyin.net mydestination = $myhostname, localhost.$mydomain, localhost,$mydomain mynetworks = 127.0.0.0 /8 ,mynetworks |
参数说明:
myhostname | 主机名,与host那么相同。 |
myorigin | 发件人地址域 |
mydomain | 所在域 |
mydestination | 目标收件地址 |
mynetworks | 可以被中继的客户端网段 |
alias_map = hash:/etc/aliases | 别名查找表 |
2、安装dovecot实现邮件接收
yum install dovecot -y
编辑配置文件 /etc/dovecot/dovecot.conf
启用协议
protocols = imap pop3
启动dovecot服务
/etc/init.d/dovecot start
启动成功后会监听端口:imap4:143/tcp,pop3:110/tcp 以明文方式工作;
3、postfix + SASL 用户认证
saslauthd -v 显示当前主机saslauthd服务所支持的验证方式
修改验证方式
vim /etc/sysconfig/saslauthd
启动saslauthd服务
/etc/init.d/saslauthd start
设置开机启动
chkconfig saslauthd on
测试验证机制是否可用,出现OK表示正常;
testsaslauthd -u username-p pass
0: OK "Success."
邮箱格式:
mbox:一个文件存储所有邮件
maildir:一个文件存储一封邮件,所有邮件存储在一个目录中;
#home_mailbox = Mailbox 定义邮箱格式
#home_mailbox = Maildir/
#mail_spool_directory = /var/mail 定义maildir格式邮箱文件的保存路径
4、让postfix支持sasl认证功能
编辑配置文件 /etc/postfix/main.cf 添加如下内容:
1
2
3
4
5
6
7
|
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 Server ! |
参数说明:
broken_sasl_auth_clients | 是否要通过SASL验证客户端身份 |
smtpd_recipient_restrictions | 定义收件人限制 |
smtpd_sasl_auth_enable = yes | 启用SASL认证功能 |
smtpd_sasl_local_domain = $myhostname | 基于SASL认证的时候指定本地的域 |
smtpd_sasl_security_options | SASL认证的安全选项,noanonymous表示不支持匿名用户 |
smtpd_sasl_path = smtpd | 指定使用SASL的服务器程序 |
smtpd_banner | 定义登陆时候的欢迎信息 |
参数说明(二):
permit_mynetworks | 允许本地网络 |
permit_sasl_authenticated | 允许SASL验证通过的用户 |
reject_invalid_hostname | 拒绝不合法的主机名的主机来收发邮件 |
reject_non_fqdn_hostname | 拒绝不是fqdn格式主机名的主机 |
reject_unknown_sender_domain | 拒绝无法识别的发件人域 |
reject_non_fqdn_sender | 拒绝没有fqdn的发件人 |
reject_non_fqdn_recipient | 拒绝没有fqdn的收件人 |
reject_unknown_recipient_domain | 拒绝无法识别的收件人域 |
reject_unauth_pipelining | 无法验证的管道 |
reject_unauth_destination | 拒绝无法验证的目标地址 |
编辑配置文件/usr/lib64/sasl2/smtpd.conf 添加如下内容:
pwcheck_method:saslauthd
mech_list:PLAIN LOGIN
log_level:3
当需要调试的时候,打开log_level可以输出更为详细的信息。
5、实现postfix基于客户端的访问控制
在配置文件"/etc/postfix/main.cf"使用如下参数控制:
1
2
3
4
5
|
smtpd_client_restrictions= smtpd_data_restrictions= smtpd_helo_restrictions= smtpd_recipient_restrictions = permit_mynetworks,reject_unauth_destination smtpd_sender_restrictions= |
参数说明:
smtpd_client_restrictions | 用于限定符合条件的才允许连接服务器 |
smtpd_data_restrictions | 用于限定符合条件的用户才允许发送data指令 |
smtpd_helo_restrictions | 用于限定符合条件的用户才允许发送helo指令 |
smtpd_recipient_restrictions | 用于限定符合条件的用户才允许发送rcpt to指令 |
smtpd_sender_restrictions | 用于限定符合条件的用户才允许发送mail from指令 |
内置限制条件:(更多参考postfix手册)
reject_unauth_destination-拒绝未经认证的目标
permit_mynetworks-该网段的主机可以被中继
编辑配置文件 /usr/lib64/sasl2/smtpd.conf 添加以下内容:
pwcheck_method:saslauthd
mech_list:PLAIN LOGIN
访问控制文件
/etc/postfix/access
python@admin.com reject
microsoft.com ok
规则编写格式:
pattern action
邮件地址的pattern格式如下:
user@domain | 用于匹配指定邮件地址 |
domain.tld | 用于匹配以此域名作为邮件地址中的域名部分的所有邮件地址 |
user@ | 用于匹配以此作为邮件地址中用户名部分的所有邮件地址 |
主机名称/地址 pattern格式如下:
ip 用于匹配特定的IP地址或网络内的所有主机
network /mask CIDR格式,匹配指定网络内的所有主机
关于action
ok 接受其pattern匹配的邮件地址或主机名称/地址
拒绝部分:
4NN text
5NN text
其中4NN类表示过一会重试,5NN类表示严重错误。
REJECT optional text 拒绝;text为可选信息
DEFER optional text 拒绝;text为可选信息
自定义访问表的条件通常使用check_client_access,check_helo_access,check_sender_access,check_recipient_access 进行,他们后面通常跟上type:mapname格式的访问类型和名称。其中,check_sender_access,check_recipient_access 用来检查客户端提供的邮件地址,其访问表中可以使用完整的邮件地址,如admin@tuchao.com;也可以只使用域名,如果tuchao.com,还可以只有用户名的部分,如hadoop@。
实例演示(一):
拒绝ip:115.204.89.87 windows 客户端发送邮件
1、编辑 /etc/postfix/access 作为客户端检查控制文件,添加如下一行:
115.204.89.87 REJECT
2、将此文件转换为hash格式
postmap /etc/postfix/access
3、配置postfix使用此文件对客户端进行检查
编辑配置文件 vim /etc/postfix/main.cf 加入一行:
smtpd_client_restrictions = check_client_access hash:/etc/postfix/access
注:这里的hash类型就代表了.db的文件,所以这里不要写后缀。
4、让postfix重新载入配置文件
/etc/init.d/postfix reload
现在使用windows上的客户端发邮件,就会看到被拒绝了;
实例演示(二):
拒绝所在域为 huairen.com 的发件人发送邮件。
1、编辑 /etc/postfix/access 作为客户端检查控制文件,添加如下一行:
huairen.com REJECT
2、将此文件转换为hash格式
postmap /etc/postfix/access
3、配置postfix使用此文件对客户端进行检查
编辑配置文件 vim /etc/postfix/main.cf 加入一行:
smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/access
4、让postfix重新载入配置文件
/etc/init.d/postfix reload
修改客户端的发件人地址,我这里使用的Outlook。 文件—账户设置—找到自己的邮箱地址—更改;
然后尝试发一封邮件出去
可以明显看到拒绝信息,Sender address rejected:Access denied
实例演示(三):
拒绝所有邮件头部用户名为tuchao的地址发邮件
1、添加一个访问控制文件 /etc/postfix/mailhostdeny 作为客户端检查控制文件,添加如下一行:
tuchao@ REJECT
2、将此文件转换为hash格式
postmap /etc/postfix/mailhostdeny
3、配置postfix使用此文件对客户端进行检查
编辑配置文件 vim /etc/postfix/main.cf 加入一行:
smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/mailhostdeny,permit_mynetworks,reject_unauth_destination
注:在smtpd_recipient_restrictions配置中,必须要有两个内置参数permit_mynetworks,reject_unauth_destination,如果需要加入其他参数,这两个内置参数放到最后。
4、让postfix重新载入配置文件
/etc/init.d/postfix reload
尝试给tuchao@qupeiyin.net发送邮件
可以看到收件人不符合要求被拒绝了
邮件别名的使用
编辑别名配置文件 /etc/aliases 加入如下两行:
a: python
tuchao: 1183710107@qq.com
newaliases 执行此命令用于生成别名文件的hash格式,便于查找,每次修改过aliases文件都要执行。
说明:a:表示把所有发给本地a用户的邮件,全部转发给本地的python用户,这里a用户不存在也没关系服务器能识别到别名就可以了。 把所有发给本地tuchao用户的邮件。全部转发至1183710107@qq.com。
给a用户发送邮件测试
给tuchao用户发邮件
过程中遇到的错误记录
错误一、-ERR Plaintext authentication disallowed on non-secure (SSL/TLS) connections.
RHEL5的dovecot都是不需要做任何修改,默认就可以使用的。
RHEL6对dovecot做了比较严格的默认配置,如果使用默认配置,客户端出现错:
-ERR Plaintext authentication disallowed on non-secure (SSL/TLS) connections.
需要修改dovecot主配置文件/etc/dovecot/dovecot.conf:
protocols = imap pop3 lmtp
login_trusted_networks = 0.0.0.0/0
设置/etc/dovecot/conf.d/10-mail.conf配置文件如下:
mail_location = mbox:~/mail:INBOX=/var/mail/%u
设置完mail_location值后,需要重启dovecot服务,同时需要创建相关的目录,否则还会出现如下错误:
freebsd# telnet 192.168.50.24 110
Trying 192.168.50.24...
Connected to 192.168.50.24.
Escape character is '^]'.
+OK Dovecot ready. <2781.1.4d106bc3.JFuUEG+bO68ixpY2W1zihg==@rhel6.766.com>
user oracle
+OK
pass oracle
-ERR [IN-USE] Couldn't open INBOX: Internal error occurred. Refer to server log for more information. [2010-12-21 16:56:40]
Connection closed by foreign host.
[root@rhel6 ~]# tail -f /var/log/maillog
Dec
21 16:56:40 rhel6 dovecot: pop3-login: Login: user=<oracle>,
method=PLAIN, rip=192.168.50.211, lip=192.168.50.24, mpid=10115, secured
Dec
21 16:56:41 rhel6 dovecot: pop3(oracle): Error:
chown(/u01/oracle/mail/.imap/INBOX, -1, 12(mail)) failed: Operation not
permitted (egid=501(dba), group based on
/var/mail/oracle)
Dec 21 16:56:41 rhel6 dovecot: pop3(oracle): Error: mkdir(/u01/oracle/mail/.imap/INBOX) failed: Operation not permitted
Dec
21 16:56:41 rhel6 dovecot: pop3(oracle): Error: Couldn't open INBOX:
Internal error occurred. Refer to server log for more information.
[2010-12-21 16:56:40]
Dec 21 16:56:41 rhel6 dovecot: pop3(oracle): Couldn't open INBOX top=0/0, retr=0/0, del=0/0, size=0
在该用户家目录下创建相应的目录:
su - tuchao
mkdir -p mail/.imap/INBOX
错误二、Temporary lookup failure
通过查看日志发现是没有aliase文件导致的,所以果断的添加的这么个文件,然后postmap一下就可以了。
postmap /etc/aliases
二、构建基于虚拟用户的虚拟域邮件系统架构
1、编译安装courier-authlib
官网:http://www.courier-mta.org/download.html#authlib
安装依赖的程序包,如果使用MySQL认证的话,需要安装MySQL。
yum install libtool openssl-devel tcl tcl-devel libart-lgpl libart-lgpl-devel expect libtool-ltdl libtool-ltdl-devel -y
编译参数
./configure \
--prefix=/usr/local/courier-authlib \
--sysconfdir=/etc \
--without-authpam \
--without-authvchkpw \
--without-authpgsql \
--with-authmysql \
--with-mysql-libs=/alidata/server/mysql/lib/ \
--with-mysql-includes=/alidata/server/mysql/include/ \
--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/ \
LDFLAGS="-L/usr/lib64 -L/lib64"
--sysconfdir 配置文件的安装目录
--without-authpam 不支持pam认证
--with-redhat 实现基于redhat系统的优化,如果不是redhat系统不用加此参数;
--with-authmysqlrc 存放courier-authlib给mysql的配置文件路径
--with-authdaemonrc 存放该服务的配置文件路径
make && make install
可以使用 --with-authdaemonvar=/var/spool/authdaemon 选项来指定进程套接字目录路径
编译过程中遇到的错误:
1、在./configure的时候出现错误 configure: error: invalid ltdl library directory: `/usr/lib64/'
笔者在centos6.5 64位的系统上试了多次,也确保安装了libtool-ltdl libtool-ltdl-devel,依旧不行。
思路:当什么依赖的库和程序都安装了后,还是提示找不到,这时候就要考虑依赖的库与程序的版本不对应。
怀疑是courier-authlib 版本太新和系统库不匹配,于是将courier-authlib0.66.3 降低版本到 0.66.1 , 0.65.0,0.64.0
这时候应该不是软件版本问题,怀疑系统版本的库与该程序不兼容。
尝试将centos6替换为centos5.11 X86_64 ,编译courier-authlib0.64.0 没有再出现此错误。
2、编译出现错误 configure:error The Courier Unicode Library 1.2 appears not to be installed
提示Courier Unicode Library 没有安装,需要下载courier-unicode-1.2.tar.bz2 安装即可。
./configure
make && make install
3、./configure 出现错误 configure: error: –with-authmysql specified but no mysqlclient.so
是因为本机上有两个MySQL,卸载原来的MySQL就可以了。
4、编译出现错误 libltdl.so: could not read symbols: File in wrong format
是由于64位机器的原因,解决办法在configure的选项中加上 LDFLAGS="-L/usr/lib64 -L/lib64"
参考文档:http://wuliangxx.iteye.com/blog/656856
配置courier-authlib
建立配置文件,和configure 参数定义的名称一致
--with-authmysqlrc=/etc/authmysqlrc
--with-authdaemonrc=/etc/authdaemonrc
cp /etc/authdaemonrc.dist /etc/authdaemonrc
cp /etc/authmysqlrc.dist /etc/authmysqlrc
编辑配置文件"/etc/authdaemonrc" 修改以下参数:
authmodulelist="authmysql"
authmodulelistorig="auauthmysql"
daemons=10
authdaemonvar=/usr/local/courier-authlib/var/spool/authdaemon
DEBUG_LOGIN=0
参数说明:
authmodulelist 指定支持认证的模块列表
authmodulelistorig 指定源模块列表
daemons 开启的进程数,根据负载合理设置。
authdaemonvar 指定进程套接字目录路径
DEBUG_LOGIN 是否启动DEBUG模式记录日志,0表示不启用,2表示启用。
编辑配置文件 /etc/authmysqlrc
1
2
3
4
5
6
7
8
9
10
11
12
13
|
MYSQL_SERVER localhost MYSQL_USERNAME root MYSQL_PASSWORD redhat MYSQL_SOCKET /tmp/mysql .sock 连接MySQL的套接字文件 MYSQL_DATABASE extmail 指定数据库名 MYSQL_USER_TABLE mailbox 指定用户表 MYSQL_CRYPT_PWFIELD password 指定保存密码的表字段名 MYSQL_UID_FIELD 2525 指定postfix的Uid MYSQL_GID_FIELD 2525 指定postfix的Gid MYSQL_LOGIN_FIELD username 指定保存用户名的表字段名 MYSQL_HOME_FIELD concat( '/var/mailbox' ,homedir) 指定用户的邮筒位置 MYSQL_NAME_FIELD name 指定用户的全名保存在哪个字段上 MYSQL_MAILDIR_FIELD concat( '/var/mailbox/' ,maildir) 创建和用户同名的邮件目录 |
提供服务启动脚本
cp courier-authlib-0.64.0/courier-authlib.sysvinit /etc/init.d/courier-authlib
chmod +x /etc/init.d/courier-authlib
chkconfig --add courier-authlib
chkconfig courier-authlib on
启动服务
service courier-authlib start
2、配置postfix支持虚拟域和虚拟用户
1、编辑配置文件 /etc/postfix/main.cf 添加以下内容:
1
2
3
4
5
6
7
8
9
|
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_uid_maps = static:2525 virtual_gid_maps = static:2525 virtual_transport = virtual mydestination = local_recipient_maps = |
virtual_transport 指定用户的投递代理
maiildrop_destination_recipient_limit = 1 定义限制,一次只投递一封邮件到一个用户邮箱。
maildrop_destination_concurrency_limit =1 一次并发只投递一封邮件
配额限制
message_size_limit = 14336000
virtual_mailbox_limit = 20971520
message_size_limit 定义单个邮件的最大大小
virtual_mailbox_limit 每个用户的邮箱最大可用空间
配置postfix和courier-authlib
新建虚拟用户邮箱所在的目录,并将权限赋予postfix用户。
mkdir /var/mailbox
chown -R postfix /var/mailbox
修改配置文件 /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
authdaemond_path 此参数指定的路径,是和/etc/authdaemonrc文件中authdaemonvar参数定义的路径相对应。
下载extman源码,使用其doc目录下的extmail.sql和init.sql建立数据库:
tar xf extman-1.1.tar.gz
cd extman-1.1/docs
mysql <extmail.sql
mysql <init.sql
复制需要的配置文件
cp mysql* /etc/postfix/
并且将复制过去的5个配置文件,根据实际mysql的帐号配置做相应的修改。
对于MySQL5.1以后的版本,需要将脚本extmail.sql使用如下命令进行语法修改:
sed -i 's/TYPE=MyISAM/ENGINE=InnoDB/g' extmail.sql
如果还出现错误 BLOB/TEXT column 'question' can't have a default value 则进入脚本修改SQL语句,将text字段的default参数删除即可。
授权用户extmail访问extmail数据库的权限
GRANT ALL PRIVILEGES ON extmail.* TO 'extmail'@'localhost' IDENTIFIED BY 'extmail123';
GRANT ALL PRIVILEGES ON extmail.* TO 'extmail'@'127.0.0.1' IDENTIFIED BY 'extmail123';
启用虚拟域以后,需要取消中心域,即注释掉配置文件“/etc/postfix/main.cf”的几个参数:myhostname,myorigin,mydomain,mydestination; 也可以把mydestination 改成自己需要的;
重启postfix
service postfix restart
这是会发现无法给之前配置的域收发邮件了,因为之前的参数我们已经注释了。 这时域的配置保存在exmail库中的domain表中。
配置dovecot
vim /etc/dovecot.conf
1
2
3
4
5
6
7
8
9
|
auth default { mechanisms = plain passdb sql { args = /etc/dovecot-mysql .conf } userdb sql { args = /etc/dovecot-mysql .conf } } |
参数说明:
mail_location = maildir:/var/mailbox/%d/%n/Maildir
这两个为dovecot支持的两个弘:
%d 表示域名
%n 表示用户名
建立配置文件:vim /etc/dovecot-mysql.conf
1
2
3
4
5
6
|
mail_location = maildir: /var/mailbox/ %d/%n /Maildir driver = mysql connect = host=localhost dbname=extmail user=extmail password=extmail123 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服务器是本地主机,如果mysql.sock文件路径不是默认的/var/lib/mysql/mysql.sock,可以使用host="socket" 来指定新位置:
connect = host=/tmp/mysql.sock dbname=extmail user=extmail password=extmail123
重启dovecot服务
service dovecot restart
安装Extmail-1.2
tar zxvf extmail-1.2.tar.gz
cd extmail-1.2
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
修改主配置文件 /var/www/extsuit/extmail/webmail.cf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
SYS_CONFIG = /var/www/extsuite/extmail/ SYS_LANGDIR = /var/www/extsuite/extmail/lang SYS_TEMPLDIR = /var/www/extsuite/extmail/html SYS_HTTP_CACHE = 0 SYS_SMTP_HOST = 127.0.0.1 SYS_SMTP_PORT = 25 SYS_SMTP_TIMEOUT = 5 SYS_SPAM_REPORT_ON = 0 SYS_USER_LANG = zh_CN SYS_MAILDIR_BASE = /var/mailbox SYS_MYSQL_USER = extmail SYS_MYSQL_PASS = extmail123 SYS_MYSQL_DB = extmail SYS_MYSQL_HOST = localhost SYS_MYSQL_SOCKET = /tmp/mysql .sock SYS_MYSQL_TABLE = mailbox SYS_MYSQL_ATTR_USERNAME = username SYS_MYSQL_ATTR_DOMAIN = domain SYS_MYSQL_ATTR_PASSWD = password SYS_AUTHLIB_SOCKET = /usr/local/courier-authlib/var/spool/authdaemon/socket |
SYS_CONFIG 指定程序目录
SYS_LANGDIR 指定语言字符集的目录
SYS_TEMPLDIR 指定临时文件的目录
SYS_HTTP_CACHE http是否要缓存
SYS_SMTP_HOST 指定smtp服务器
SYS_SMTP_PORT smtp服务端口号
SYS_SMTP_TIMEOUT 指定超时时间
SYS_SPAM_REPORT_ON 发现垃圾邮件是否报告
SYS_USER_LANG 指定语言支持
SYS_MAILDIR_BASE 指定用户的邮筒文件夹
SYS_MYSQL_TABLE 指定在mysql中对应的表
SYS_MYSQL_ATTR_USERNAME 用户名对应的字段属性
SYS_MYSQL_ATTR_DOMAIN 域对应的字段属性
SYS_MYSQL_ATTR_PASSWD 用户密码对应的字段属性
SYS_AUTHLIB_SOCKET 指定courier-authlib socket文件位置
配置httpd
由于extmail要进行本地邮件的投递操作,故必须将运行httpd服务器用户的身份修改为你的邮件投递代理的用户,如果打开apache的suexec功能,可以实现虚拟主机运行身份的指定。 此例中的MDA为postfix自带,所以指定为postfix用户。
1
2
3
4
5
6
7
|
<VirtualHost *:8081> ServerName mail.qupeiyin.net DocumentRoot /var/www/extsuite/extmail/html/ ScriptAlias /extmail/cgi /var/www/extsuite/extmail/cgi Alias /extmail /var/www/extsuite/extmail/html/ CustomLog logs /mail .qupeiyin.net.log common < /VirtualHost > |
如果不打开apache的suexec功能,也可以让整个apache用postfix用户跑
User postfix
Group postfix
修改cgi执行文件属主为apache服务运行的身份用户
chown -R postfix.postfix /var/www/extsuite/extmail/cgi/
安装Unix-Syslog解决依赖关系
可以去http://search.cpan.org/搜索下载源码包
tar xf Unix-Syslog-1.1.tar.gz
cd Unix-Syslog-1.1
perl Makefile.PL
make && make install
配置extman
tar xf 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
编辑配置文件 /var/www/extsuite/extman/webman.cf
SYS_MAILDIR_BASE = /var/mailbox
SYS_SESS_DIR = /tmp/extman/
SYS_CAPTCHA_ON = 0
SYS_DEFAULT_UID = 2525
SYS_DEFAULT_GID = 2525
SYS_MYSQL_USER = root
SYS_MYSQL_PASS = redhat
SYS_MYSQL_DB = extmail
SYS_MYSQL_HOST = localhost
SYS_MYSQL_SOCKET = /var/lib/mysql/mysql.sock
创建用于保存session的目录
mkdir /tmp/extman
chown postfix /tmp/extman/
修改cgi目录属主
chown -R postfix.postfix /var/www/extsuite/extman/cgi/
在httpd主配置文件中Extmail的虚拟主机部分,添加如下两行:
ScriptAlias /extman/cgi /var/www/extsuite/extman/cgi
Alias /extman /var/www/extsuite/extman/html
重启httpd服务器
service httpd restart
功能测试:
现在来访问我们的extmail
选择登陆邮箱管理,空密码帐号,直接点登陆跳到下一个界面:
初始密码为:extmail*123*
登陆之后可进入邮箱控制台
现在登陆一个用户来发送邮件
点击发送后,QQ邮箱立马就收到了。
一套邮件系统就基本实现了,这里还没加上反垃圾邮件功能和SSL加密功能。
这些功能可参考:
extmail官网:http://www.extmail.org/
本文出自 “突破舒适区” 博客,请务必保留此出处http://tchuairen.blog.51cto.com/3848118/1686875
Linux 邮件服务器 之跟我一步一步来实现一个邮件系统【转】的更多相关文章
- Linux邮件服务器架构
// 上面的过程只是实现了简单的本地用户的文件发送功能,只需要安装mailutil,不需要安装配置sendmail,看鸟哥的Linux私房菜中写的应该是本地用户发送邮件不需要sendmail.只有当非 ...
- linux邮件服务器postfix配置实例
linux邮件服务器postfix配置实例(超级详细!!!) 2013-03-13 13:30:21 标签:邮件服务器 linux 1. 系统安装:1)centos4.3 选上MAIL组件里的全部.2 ...
- 教你如何架设linux邮件服务器postfix
检查linux是否有安装postfix和dovecot 检查命令如下: Rpm -qa |grep postfix; Rpm –qa |grep dovecot; 如果没有显示任何数据,表明没有安 ...
- linux 邮件服务器
邮件通信系统协议及概念:软件角色:MUA:邮件客户端MTA:邮件服务端MDA:邮件服务端模块邮件客户端:Mail User Agent,邮件用户代理邮件服务端:Mail Transfer Agent, ...
- linux 邮件服务器—Extmail
环境: Centos 6.5 :172.16.9.13 (DNS 服务器) Centos 6.5: 172.16.9.11 (postfix 邮件服务器) 安装软件: yum -y install p ...
- 二十六、linux邮件服务器
1.安装: yum install -y sendmail 因为是最小安装,需要包没有安装 yum install -y mailx 2.日志:/var/log/maillog 3.启动:/etc ...
- 烂泥:Postfix邮件服务器搭建之准备工作
说实话,Postfix邮件服务器的搭建是一件很麻烦的事情,需要各种软件之间的配置和调试.在写这篇文章之前,我也是搭建测试了不下于10次才算把整个流程给走通,今天刚好有时间把整个搭建过程记录下来. 在正 ...
- 转-阿里云CentOS Linux服务器上用postfix搭建邮件服务器
http://www.cnblogs.com/dudu/archive/2012/12/12/linux-postfix-mailserver.html 注:本文的邮件服务器只用于发送邮件,也就是ST ...
- linux搭建邮件服务器
一.概述: 在配置邮件服务器之前,先解释几个概念. 通常使用Email都很容易,但是Internet的邮件系统是通过几个复杂的部分连接而成的,对于最终用户而言,我们熟悉的Outlook,Foxmail ...
随机推荐
- CSS3 :animation 动画
CSS3动画分为二部份: 1.定义动画行为: 使用@keyframes定义动画行为,有两种方式: 方式一:仅定义动画起始样式,与动画结束样式 @keyframes (动画行为名称) { from {b ...
- spring与mybatis整合(基于配置文件)
本文主要介绍了如何将mybatis和spring整合在一起使用,本人使用的是mybatis3.05 + spring3.1.0M2 ,使用dbcp作为数据库连接池. 1.编写数据访问接口(UserDa ...
- [leetcode-636-Exclusive Time of Functions]
Given the running logs of n functions that are executed in a nonpreemptive single threaded CPU, find ...
- python基础之删除文件及删除目录的方法
下面来看一下python里面是如何删除一个文件及文件夹的~~ 1 2 3 4 5 6 7 8 #首先引入OS模块 import os #删除文件: os.remove() #删除空目录: os.r ...
- IntelliJ IDEA 创建maven项目
说明 创建Maven项目的方式:手工创建 好处:参考IntelliJ IDEA 14 创建maven项目二(此文章描述了用此方式创建Maven项目的好处)及idea14使用maven创建web工程(此 ...
- input标签与label标签的“合作关系”
一直忽略了input和label的关系.一次在做自定义单选框的时候又重新捡起来这对“兄弟”. label的for属性和input的id值一致的话,input和label就会组成一个组.例如: < ...
- c# 调用 matlab 引发初始化错误 异常
1. 除了matlab 编译的DLL 意外还需要引用 MWArray.dll 这个dill 在安装了 MCRInstaller.exe(matlab运行环境之后就会有了): 2. 最重要的一点.ne ...
- 《软件调试的艺术》学习笔记——GDB使用技巧摘要
<软件调试的艺术>学习笔记——GDB使用技巧摘要 <软件调试的艺术>,因为名是The Art of Debugging with GDB, DDD, and Eclipse. ...
- vue父组件中修改子组件样式
1. 使用全局样式 <style> /* 全局样式 */ </style> <style scoped> /* 本地样式 */ </style> 2. ...
- 深入浅出JavaScript变量作用域
在学习JavaScript的变量作用域之前,我们应当明确几点: JavaScript的变量作用域是基于其特有的作用域链的. JavaScript没有块级作用域. 函数中声明的变量在整个函数中都有定义. ...