Chinaunix首页 | 论坛 | 博客
  • 博客访问: 54631
  • 博文数量: 65
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 365
  • 用 户 组: 普通用户
  • 注册时间: 2015-01-06 10:38
文章分类
文章存档

2015年(65)

我的朋友

分类: LINUX

2015-03-16 11:00:23

这篇文章介绍如何在 Linux 上建立一个邮件服务器。使用的是  作为 MTA、  作为 IMAP 和 POP3 服务器、Courier-authlib 来作为安全认证程序、MySQL 来存储虚拟用户、ExtMail 作为 WebMail 的前台并且使用 ExtMan 来管理帐号

在建立邮件服务器之前,首先要建立网页服务器来运行 ExtMail 和 ExtMan,可以选择LNMP(Linux+Nginx+MySQL+PHP)环境

首先安装必要的程序

Shell

yum install postfix dovecot* cyrus* expect libtool libtool-ltdl-devel gdbm gdbm-devel

前往  下载 courier-authlib,我们需要手动编译使其支持 MySQL 登陆

Shell

tar jxvf courier-authlib-0.66.1.tar.bz2
cd courier-authlib-0.66.1
./configure \ --prefix=/usr/local/courier-authlib \ --sysconfdir=/etc \ --with-authmysql \ --with-redhat \ --with-authmysqlrc=/etc/authmysqlrc \ --with-authdaemonrc=/etc/authdaemonrc make && make install
# 这一行如果是 systemctl 的话才运行
cp courier-authlib.sysvinit /usr/local/courier-authlib/share/
chmod 0755 /usr/local/courier-authlib/share/courier-authlib.sysvinit
cp courier-authlib.service /usr/lib/systemd/system

如果在 configure 的过程中出现找不到 mysqlclient.so 之类的情况,到 /usr/lib64/mysql 目录下看看是否有 libmysqlclient.so 这个文件,如果没有,创建一个符号连接把旁边的链接过来

然后需要安装 Unix-Syslog,这是 ExtMan 和 ExtMail 所需要的

Shell

yum install perl-DBD-MySQL perl-CGI perl-FCGI perl-DB_File perl-Sys-Syslog perl-ExtUtils-MakeMaker

Shell

wget http:///id/M/MH/MHARNISCH/Unix-Syslog-1.1.tar.gz
tar zxvf Unix-Syslog-1.1.tar.gz
cd Unix-Syslog-1.1 perl Makefile.PL make && make install

添加一个用户(这个 uid 和 gid 以后会用到)

Shell

groupadd vmail -g 3311 useradd vmail -d /var/mailbox -s /sbin/nologin -g 3311 -u 3311

在这些都做完之后就可以开始配置邮件服务器了

修改 /etc/postfix/main.cf

Shell

myhostname = mail.miskcoo.com mydomain = miskcoo.com mynetworks = 127.0.0.0/8 inet_interfaces = all

修改 /etc/dovecot/dovecot.conf

C++

protocols = pop3s imap listen = * base_dir = /var/run/dovecot/ login_trusted_networks = 0.0.0.0/0

修改 /etc/dovecot/conf.d/10-ssl.conf

C++

ssl = yes

修改 /etc/dovecot/conf.d/10-auth.conf

C++

disable_plaintext_auth = yes

关闭 pop3 端口开启 pop3s 端口,修改 /etc/dovecot/conf.d/10-master.conf

C++

service pop3-login {
  inet_listener pop3 { #port = 110 port = 0
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}

然后关闭 Sendmail 服务(如果有的话),并且启动 Postfix 和 Dovecot

Shell

systemctl disable sendmail
systemctl stop sendmail
systemctl start postfix
systemctl enable postfix
systemctl start dovecot
systemctl enable dovecot
systemctl start saslauthd
systemctl enable saslauthd

现在开始安装 ExtMan 和 ExtMail,前往  下载 ExtMail(WebMail 帐号登陆) 和 ExtMan(WebMail 帐号管理)

Shell

# 创建目录 mkdir /var/www/extsuite # 解压并且复制 ExtMail tar zxvf extmail-1.2.tar.gz
mv extmail-1.2/ /var/www/extsuite/extmail
cp /var/www/extsuite/extmail/webmail.cf.default /var/www/extsuite/extmail/webmail.cf # 解压并且复制 ExtMan 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

修改 /var/www/extsuite/extmail/webmail.cf

C++

SYS_CONFIG = /var/www/extsuite/extmail/ SYS_LANGDIR = /var/www/extsuite/extmail/lang SYS_TEMPLDIR = /var/www/extsuite/extmail/html SYS_SESS_DIR = /var/www/extsuite/tmp/extmail SYS_UPLOAD_TMPDIR = /var/www/extsuite/tmp/extmail/upload SYS_LOG_FILE = /var/log/extmail.log SYS_USER_LANG = zh_CN SYS_APP_TYPE = WebMail SYS_USER_TEMPLATE = default SYS_USER_CHARSET = utf-8 SYS_USER_TRYLOCAL = 1 SYS_USER_TIMEZONE = +0800 SYS_MIN_PASS_LEN = 8 SYS_AUTH_TYPE = mysql SYS_MAILDIR_BASE = /var/mailbox SYS_AUTH_SCHEMA = virtual SYS_CRYPT_TYPE = md5crypt SYS_MYSQL_USER = extmail SYS_MYSQL_PASS = extmail  # 修改为你的数据库密码,默认是 extmail SYS_MYSQL_DB = extmail SYS_MYSQL_HOST = localhost SYS_MYSQL_SOCKET = /var/lib/mysql/mysql.sock SYS_AUTHLIB_SOCKET = /usr/local/courier-authlib/var/spool/authdaemon/socket

编辑 /var/www/extsuite/extman/webman.cf

C++

SYS_CONFIG = /var/www/extsuite/extman/ SYS_LANGDIR = /var/www/extsuite/extman/lang SYS_TEMPLDIR = /var/www/extsuite/extman/html SYS_MAILDIR_BASE = /var/mailbox SYS_SESS_DIR = /var/www/extsuite/tmp/extman/ SYS_MYSQL_USER = extmail SYS_MYSQL_PASS = extmail     # 修改为你的数据库密码,默认是 extmail SYS_MYSQL_DB = extmail SYS_MYSQL_HOST = localhost SYS_MYSQL_SOCKET = /var/lib/mysql/mysql.sock

然后建立临时目录

Shell

cd /var/www/extsuite mkdir tmp mkdir tmp/extmail mkdir tmp/extmail/upload mkdir tmp/extman chown vmail.vmail -R tmp

现在导入数据库,首先进入 /var/www/extsuite/extman/docs 目录,然后登陆 mysql 服务

Shell

mysql -u root -p

之后运行

MySQL

/* 这两行导入数据库,并且增加 extmail 用户 */ source extmail.sql
source init.sql /* 这两行修改 extmail 用户密码 */ GRANT all privileges on extmail.* TO extmail@localhost IDENTIFIED BY 'your-passwd'; GRANT all privileges on extmail.* TO extmail@127.0.0.1 IDENTIFIED BY 'your-passwd'; /* 这两行的 3311 就是原先 vmail 的 uid 和 gid */ ALTER TABLE mailbox ALTER uidnumber SET DEFAULT 3311; ALTER TABLE mailbox ALTER gidnumber SET DEFAULT 3311;

现在开始配置 Postfix 使其支持虚拟用户,首先生成配置文件

Shell

mkdir -p /etc/postfix/mysql
cp /var/www/extsuite/extman/docs/mysql_virtual_* /etc/postfix/mysql/

编辑 /etc/postfix/main.cf 在末尾添加如下内容

C++

broken_sasl_auth_clients = yes local_transport = dovecot virtual_mailbox_base = /var/mailbox virtual_mailbox_maps = mysql:/etc/postfix/mysql/mysql_virtual_mailbox_maps.cf virtual_mailbox_domains = mysql:/etc/postfix/mysql/mysql_virtual_domains_maps.cf virtual_alias_domains = virtual_alias_maps = mysql:/etc/postfix/mysql/mysql_virtual_alias_maps.cf virtual_uid_maps = static:3311 virtual_gid_maps = static:3311 virtual_transport = virtual smtpd_sasl_authenticated_header = yes smtpd_sasl_local_domain = '' smtpd_sasl_security_options = noanonymous smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_auth_enable = yes smtpd_client_restrictions = permit_sasl_authenticated smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, permit

编辑 /etc/postfix/master.cf

Shell

#submission inet n       -       -       -       -       smtpd #  -o syslog_name=postfix/submission #  -o smtpd_tls_security_level=encrypt #  -o smtpd_sasl_auth_enable=yes #  -o smtpd_client_restrictions=permit_sasl_authenticated,reject #  -o milter_macro_daemon_name=ORIGINATING 改为
submission inet n       -       -       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

并且在末尾添加(/usr/libexec/dovecot/deliver 的位置可能不一样)

C++

dovecot   unix  -       n       n       -       -       pipe
    flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -d ${recipient}

编辑 /etc/dovecot/conf.d/10-auth.conf

C++

disable_plaintext_auth = yes #!include auth-system.conf.ext !include auth-sql.conf.ext #!include auth-ldap.conf.ext #!include auth-passwdfile.conf.ext #!include auth-checkpassword.conf.ext #!include auth-vpopmail.conf.ext #!include auth-static.conf.ext

编辑 /etc/dovecot/conf.d/10-mail.conf

C++

mail_location = maildir:/var/mailbox/%d/%n/Maildir mail_uid = 3311 mail_gid = 3311 first_valid_uid = 3311 last_valid_uid = 3311

编辑 /etc/dovecot/conf.d/10-logging.conf

C++

log_path = /var/log/dovecot.log info_log_path = /var/log/dovecot.info log_timestamp = "%Y-%m-%d %H:%M:%S "

编辑 /etc/dovecot/conf.d/10-master.conf

C++

service auth { # auth_socket_path points to this userdb socket by default. It's typically # used by dovecot-lda, doveadm, possibly imap process, etc. Users that have # full permissions to this socket are able to get a list of all usernames and # get the results of everyone's userdb lookups. # # The default 0666 mode allows anyone to connect to the socket, but the # userdb lookups will succeed only if the userdb returns an "uid" field that # matches the caller process's UID. Also if caller's uid or gid matches the # socket's uid or gid the lookup succeeds. Anything else causes a failure. # # To give the caller full permissions to lookup all users, set the mode to # something else than 0666 and Dovecot lets the kernel enforce the # permissions (e.g. 0777 allows everyone full permissions). unix_listener auth-userdb { #mode = 0666 #user =  #group =  } # Postfix smtp-auth # 你要修改的是这部分 unix_listener /var/spool/postfix/private/auth {
    mode = 0666 user = postfix group = postfix
  } # Auth process is run as this user. #user = $default_internal_user }

编辑 /etc/dovecot/conf.d/auth-sql.conf.ext

C++

passdb {
  driver = sql

  # Path for SQL configuration file, see example-config/dovecot-sql.conf.ext
  args = /etc/dovecot/dovecot-sql.conf.ext
}

userdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}

新建文件 /etc/dovecot/auth-sql.conf.ext

C++

driver = mysql
connect = host=localhost dbname=extmail user=extmail password=your-password  # 替换成你的密码
default_pass_scheme = CRYPT
user_query = SELECT CONCAT('/var/mailbox/', maildir) AS maildir, uidnumber AS uid, gidnumber AS gid FROM mailbox WHERE username = '%u' AND active='1' password_query = SELECT username AS user,password AS password FROM mailbox WHERE username = '%u' AND active='1'

现在编辑 Courier-authlib 的配置文件

Shell

chmod 755 /usr/local/courier-authlib/var/spool/authdaemon
cp /etc/authdaemonrc.dist  /etc/authdaemonrc
cp /etc/authmysqlrc.dist  /etc/authmysqlrc

编辑 /etc/authdaemonrc

Shell

authmodulelist="authmysql"  authmodulelistorig="authmysql"

编辑 /etc/authmysqlrc

C++

MYSQL_SERVER  localhost
MYSQL_PORT 3306 MYSQL_USERNAME  extmail #连接数据库的用户名 MYSQL_PASSWORD  your-password #连接数据库的密码  MYSQL_SOCKET  /var/lib/mysql/mysql.sock
MYSQL_DATABASE  extmail 
MYSQL_USER_TABLE  mailbox 
MYSQL_CRYPT_PWFIELD  password 
MYSQL_UID_FIELD '3311' MYSQL_GID_FIELD '3311' MYSQL_LOGIN_FIELD  username 
MYSQL_HOME_FIELD  concat('/var/mailbox/',homedir) 
MYSQL_NAME_FIELD  name 
MYSQL_MAILDIR_FIELD  concat('/var/mailbox/',maildir)

编辑 /etc/sasl2/smtpd.conf

C++

pwcheck_method: authdaemond log_level: 3 mech_list: PLAIN LOGIN authdaemond_path: /usr/local/courier-authlib/var/spool/authdaemon/socket

运行

Shell

saslpasswd2 /etc/sasldb2

现在启动 courier-authlib 的服务程序

Shell

systemctl enable courier-authlib
systemctl start courier-authlib

好!现在来测试一下

Shell

/usr/local/courier-authlib/sbin/authtest -s login postmaster@extmail.org extmail

如果你看见下面的输出,那么就说明成功了

Shell

Authentication succeeded. Authenticated: postmaster@extmail.org  (uid 3311, gid 3311) Home Directory: /var/mailbox/extmail.org/postmaster Maildir: /var/mailbox/extmail.org/postmaster/Maildir/ Quota: (none) Encrypted Password: $1$phz1mRrj$3ok6BjeaoJYWDBsEPZb5C0 Cleartext Password: extmail Options: (none)

接下来我们来配置 nginx 来让外部能够访问站点,编辑 /usr/local/nginx/conf/nginx.conf(如果用的是 yum 安装是 /etc/nginx/nginx.conf)

C++

php">
http { include mime.types;
    default_type  application/octet-stream; #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ' #                  '$status $body_bytes_sent "$http_referer" ' #                  '"$http_user_agent" "$http_x_forwarded_for"'; #access_log  logs/access.log  main; sendfile        on; #tcp_nopush     on; #keepalive_timeout  0; keepalive_timeout 65;

    gzip  on; # 如果你的 .conf 原先没有类似的语句,那么加入这段,并且新建一个文件夹叫做 conf.d include conf.d/*.conf;

编辑 /usr/local/nginx/conf/conf.d/extsuite.conf

C++

server
{
        server_name test.miskcoo.com;
        root /var/www/extsuite;
        location / {  alias /var/www/extsuite/extmail/html;
        }
        loion /extman {  alias /var/www/extsuite/extman/html;
        }
        location ~ \.cgi$ {  fastcgi_pass 127.0.0.1:8888;  fastcgi_param GATEWAY_INTERFACE CGI/1.1;  fastcgi_param SERVER_SOFTWARE nginx;  fastcgi_param QUERY_STRING $query_string;  fastcgi_param REQUEST_METHOD $request_method;  fastcgi_param CONTENT_TYPE $content_type;  fastcgi_param CONTENT_LENGTH $content_length;  fastcgi_param SCRIPT_NAME $fastcgi_script_name;  fastcgi_param REQUEST_URI $request_uri;  fastcgi_param DOCUMENT_ROOT $document_root;  fastcgi_param SERVER_PROTOCOL $server_protocol;  fastcgi_param REMOTE_ADDR $remote_addr;  fastcgi_param REMOTE_PORT $remote_port;  fastcgi_param SERVER_ADDR $server_addr;  fastcgi_param SERVER_PORT $server_port;  fastcgi_param SERVER_NAME $server_name;
        }
}

然后重新启动 nginx 服务

Shell

systemctl rest nginx

然后编辑 /usr/lib/systemd/system/extsuite-cgi.service 来创建一个脚本自动启动

C++

[Unit] Description=ExtMail and ExtMan CGI Server [Service] Type=forking RemainAfterExit=true ExecStart=/var/www/extsuite/extmail/dispatch-init start ExecS=/var/www/extsuite/extmail/dis- stop [Install] WantedBy=multi-user.target

之后运行

Shell

systemctl start extsuite-cgi
systemctl enable extsuite-cgi

现在你可以访问你的 WebMail 了!

  • 本文来自:
阅读(1845) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~