部署開源郵件系統?推薦使用國產的Extmail郵件系統,ExtMail Project 是一個活躍的開源郵件系統項目,目前由ExtMail 團隊維護,該項於2005年9月18日正式啓動,最初以WebMail軟件爲主,至今已逐步造成了ExtMail軟件系列,目前ExtMail 1.3 已經在開發中,期待中!php
一 部署Extmail前html
- 1 整個 extmail郵件系統,是由多個軟件構成的:
- 軟件名稱 功能 (注意:沒有列出反垃圾郵件軟件與殺毒軟件)
- ExtMan Web賬戶管理後臺(含mailgraph_ext 圖形日誌分析)
- ExtMail WebMail(perl 程序)
- Apache Web服務器(MUA 經過瀏覽器收發郵件)
- Postfix SMTP服務器,郵件傳輸代理(MTA)
- Maildrop 郵件投遞代理(MDA)
- Courier-imap IMAP和POP3 服務器
- Cyrus-sasl2 標準的SASL實現庫,能夠支持Courier Cyrus SMTP認證庫
- Courier-authlib 負責courier-imap,maildrop的認證 Courier 數據認證庫(mysql)
- MySQL 數據庫,儲存虛擬(域|用戶|別名)等信息.
- 2 肯定postfix 支持的smtp認證方式,與支持的查詢表(必須包含mysql格式)
- smtp 認證方式
- postconf -a
- cyrus (sasl庫)
- dovecot
- 支持的查詢表
- postconf -m
- btree
- cidr
- environ
- hash
- ldap
- mysql (包含mysql)
- nis
- pcre
- proxy
- regexp
- static
- tcp
- unix
- 注意: redhat/centos 自帶的postfix不支持mysql方式的查詢表,因此你可能須要以源碼的方式從新安裝postfix 而且開啓mysql支持!!!
- 3 extmail 發信,收信,(web登錄)認證邏輯圖
- +++++++++++++++++++++++++++++++++++++++++++++++++
- + smtp/25 + po3/110 + http/80 +
- + postfix + courier-imap + apache +
- +++++++++++++++++++++++++++++++++++++++++++++++++
- + cyrus-sasl2 +
- +++++++++++++++++++++++++++++++++++++++++++++++++
- + courier-authlib +
- +++++++++++++++++++++++++++++++++++++++++++++++++
- + mysql +
- +++++++++++++++++++++++++++++++++++++++++++++++++
- 3.1 smtp認證流程
- smtp/25
- postfix
- | <-- smtp 認證
- cyrus-sasl2
- | <-- smtpd.conf 配置文檔(設置了authdaemond的Unix套接字的路徑)
- courier-authlib
- | <-- authmysqlrc 配置文檔(設置了mysql相關信息)
- mysql
- | -- I:儲存虛擬(域|用戶|別名)等信息.
- 3.2 smtp認證 相關的配置文檔
- postfix
- 10.0.100.88 [~]$ rpm -qf /usr/lib64/sasl2/smtpd.conf
- postfix-2.6.2-5hzq
- 10.0.100.88 [~]$ cat /usr/lib64/sasl2/smtpd.conf
- pwcheck_method: authdaemond
- log_level: 3
- mech_list: PLAIN LOGIN
- authdaemond_path:/var/spool/authdaemon/socket
- ---------------------------------------------------------------
- pwcheck_method SASL 庫 auxprop(默認值)
- (描述:空格分隔開的用來效驗密碼的機制列表,值多是 sasl_checkpass,auxprop,
- saslauthd,pwcheck,authdaemond【若是編譯時添加了 --with-authdaemond 】
- mech_list SASL 庫 使用全部有效插件
- (描述:空格分隔開的容許使用的機制的列表,好比:'plain otp'。用來在安裝的插件
- 中限制出一個可用機制的子集。)
- authdaemond_path SASL 庫 /dev/null(默認值)
- (描述:Courier-authlib 的 authdaemond 的 Unix 套接字的路徑。僅當 pwcheck_method 設
- 置爲 authdaemond 時可用。)
- -------------------------------------------------------------------
- courier-authlib
- 10.0.100.88 [~]$ rpm -qf /var/spool/authdaemon/socket
- courier-authlib-0.62.4-2hzq
- 10.0.100.88 [~]$ cat /etc/authlib/authmysqlrc
- MYSQL_SERVER localhost
- MYSQL_USERNAME extmail
- MYSQL_PASSWORD xmall.com
- MYSQL_SOCKET /var/lib/mysql/mysql.sock
- MYSQL_PORT 3306
- ...................................
- 4 瞭解 postfix 的查詢表
- postfix 有許多的重要參數(main.cf)都須要可以查詢其對應關係,將全部的對應關係保存在另一個文件 "查詢表"
- 查詢表格式:
- 查詢表的原始數據來自簡單的文本文件,文件的每一行定義一組 "key_value" 對應關係,key 與 value
- 以空白隔開,例如:
- cat /etc/postfix/local_in_senders
- tech@xmall.com local_in_only
- it@xmall.com local_in_only
- postmap命令建立查詢表的數據庫文件
- postmap /etc/postfix/local_in_senders
- file /etc/postfix/local_in_senders.db
- /etc/postfix/local_in_senders.db: Berkeley DB (Hash, version 8, native byte-order)
- postfix 默認的查詢表數據格式爲hash
- postconf | grep 'default_database_type'
- default_database_type = hash
- 當將查詢表賦值給相關參數時,則必須指出查詢表的數據庫類型,例如:
- postconf | grep 'hash:/'
- alias_database = hash:/etc/aliases
- alias_maps = hash:/etc/aliases, nis:mail.aliases
- 查詢表的特例-別名文件
- 因爲別名文件的格式不一樣於postfix 其它的postfix 查詢表,因此不能使用postmap 建立別名的數據庫文件,而應該使用postalias/newalias;
- 別名文件位置:alias_maps = hash:/etc/aliases, nis:mail.aliases
- 別名文件格式:
- grep -vE '(^$|^#)' /etc/aliases | head -n 3
- mailer-daemon: postmaster
- postmaster: root
- bin: root
- daemon: root
- 5 linux系統 用 32位 仍是 64位?
- 若是郵件比較少,郵件操做系統壓力不大的話,32位或者64位均可以,只不過部署extmail(源碼)時要區分一下,好比:
- i386
- /usr/lib/sasl2/smtpd.conf
- /usr/lib/mysql/
- x86_64
- /usr/lib64/sasl2/smtpd.conf
- /usr/lib64/mysql/
- 6 linux系統硬盤分區
- 建議 /var /home 單獨分區,緣由有兩個
- 1 由於extman 與 extmail都是以 /home/domains做爲基礎目錄
- 2 /var/log/maillog 郵件日誌; /var/spool/postfix 郵件隊列
- 10.0.100.88 [xmall.com]$ pwd
- /home/domains/xmall.com
- 10.0.100.88 [xmall.com]$ du -sh *
- 120K zm1
- 436M zm2
- 10.0.100.88 [xmall.com]$ ll
- total 8
- drwx------ 3 vuser vgroup 4096 Dec 19 16:00 zm1
- drwx------ 3 vuser vgroup 4096 Dec 19 16:00 zm2
- 7 安裝依賴rpm包 (這裏使用了本地cdrom源,若是你不是本地yum源,請直接yum install 後邊的rpm包)
- yum --disablerepo=\* --enablerepo=c5-media install httpd php php-mysql mysql mysql-server mysql-devel openssl-devel perl-DBD-MySQL tcl tcl-devel libart_lgpl libart_lgpl-devel libtool-ltdl libtool-ltdl-devel expect
二 部署Extmail mysql
Extmail 官方wiki 寫的很是詳細,因此這裏鏈接了Extmail 官方Wiki,須要注意的是wiki文檔以 CentOS-5.x-i386平臺上安裝,若是你我同樣使用的 X86_64 的 Centos/RHEL則可能會遇到一些小問題!linux
2 操做系統安裝 sql
3 製做_yum_倉庫 (x86_64 請下載EMOS_1.5_x86_64.iso)shell
4 配置mta-postfix數據庫
5 配置courier-authlibapache
6 配置maildropvim
7 配置Apache
10 配置Cyrus-SASL
12 配置內容、病毒過濾
14 配置DSpam
15 補充設置
可能會遇到的一些問題
- 0 防病毒,防垃圾郵件,64位系統請下載 相應64位rpm 包!
- wget http://pkgs.repoforge.org/clamav/clamav-0.97.3-1.el5.rf.x86_64.rpm
- wget http://pkgs.repoforge.org/clamav/clamd-0.97.3-1.el5.rf.x86_64.rpm
- wget http://pkgs.repoforge.org/clamav/clamav-db-0.97.3-1.el5.rf.x86_64.rpm
- 調試amavisd錯誤,改爲第二條命令便可
- /usr/sbin/amavisd -c /etc/amavisd.conf debug
- Config file "/etc/amavisd.conf" does not exist, at /usr/sbin/amavisd line 1795.
- /usr/sbin/amavisd -c /etc/amavisd/amavisd.conf debug
- 1 maillog 日誌報錯
- Perl version 5.008008
- Dec 20 11:08:58 mail amavis[8175]: (!)Net::Server: 2011/12/20-11:08:58 Couldn't open pid file "/var/spool/vscan/var/amavisd.pid" [No such file or directory].\n\n at line 318 in file /usr/lib/perl5/vendor_perl/5.8.8/Net/Server.pm
- Dec 20 11:09:06 mail amavis[8210]: starting. /usr/sbin/amavisd at mail.xmall.com amavisd-new-2.6.4 (20090625), Unicode aware, LC_CTYPE="en_US.UTF-8", LANG="en_US.UTF-8"
- vim /etc/amavisd/amavisd.conf
- lock_file = "$MYHOME/var/amavisd.lock"; # -L
- $pid_file = "$MYHOME/var/amavisd.pid"; # -P
- 改爲
- lock_file = "$MYHOME/amavisd.lock"; # -L
- $pid_file = "$MYHOME/amavisd.pid"; # -P
- 2 amavisd 檢測不符合規定的郵件退回
- vim /etc/amavisd/amavisd.conf
- $final_virus_destiny = D_REJECT;
- $final_banned_destiny = D_REJECT;
- 3 http://wiki.extmail.org/%E6%8B%BE%E8%B2%B3%E3%80%81%E9%85%8D%E7%BD%AE%E5%86%85%E5%AE%B9%E3%80%81%E7%97%85%E6%AF%92%E8%BF%87%E6%BB%A4
- 五、配置Postfix 集成amavisd-new
- 增長郵件別名
- shell
- # vi /etc/postfix/aliases
- 增長以下信息,注意:默認的aliases數據庫裏已有一條virusalert的別名,請刪除,再輸入下面的別名記錄,並確保全部記錄都是惟一的:
- virusalert: root
- spam.police: root
- postfix: test@extmail.org
- 保存並執行newaliases命令生成新的別名數據庫,從新啓動amavisd:
- (unknown user: "virusalert") newaliases 命令 ,別名無效
- Dec 20 15:59:31 mail postfix/local[4037]: warning: database /etc/postfix/aliases.db is older than source file /etc/postfix/aliases
- Dec 20 15:59:31 mail postfix/smtp[4017]: D50708085EB: to=<zm2@xmall.com>, relay=127.0.0.1[127.0.0.1]:10024, delay=7.7, delays=2.8/0/0.01/4.9, dsn=5.7.0, status=bounced (host 127.0.0.1[127.0.0.1] said: 554 5.7.0 Reject, id=03882-02 - BANNED: application/x-ms-dos-executable,.dat,test.exe (in reply to end of DATA command))
- Dec 20 15:59:31 mail postfix/local[4037]: A151F8085FC: to=<virusalert@mail.xmall.com>, relay=local, delay=0.97, delays=0.9/0.03/0/0.04, dsn=5.1.1, status=bounced (unknown user: "virusalert")
- 解決方法
- postalias /etc/postfix/aliases 命令便可
- #virusalert 用戶再也不提示錯誤了
- Dec 21 09:30:50 mail postfix/qmgr[3195]: E945D8085F0: from=<zm1@xmall.com>, size=28739726, nrcpt=1 (queue active)
- Dec 21 09:30:50 mail postfix/smtpd[3405]: disconnect from unknown[192.168.6.150]
- Dec 21 09:30:59 mail postfix/smtpd[3419]: connect from mail.xmall.com[127.0.0.1]
- Dec 21 09:30:59 mail postfix/smtpd[3419]: 683D28085FD: client=mail.xmall.com[127.0.0.1]
- Dec 21 09:30:59 mail postfix/cleanup[3415]: 683D28085FD: message-id=<VAdHaWpoTb2+Pl@mail.xmall.com>
- Dec 21 09:30:59 mail postfix/qmgr[3195]: 683D28085FD: from=<virusalert@mail.xmall.com>, size=2383, nrcpt=1 (queue active)
- Dec 21 09:30:59 mail amavis[3207]: (03207-01) Blocked BANNED (application/x-ms-dos-executable,.dat,test.exe), [192.168.6.150] [192.168.6.150] <zm1@xmall.com> -> <zm2@xmall.com>, quarantine: banned-dHaWpoTb2+Pl, Message-ID: <4EF1372A.4080409@xmall.com>, mail_id: dHaWpoTb2+Pl, Hits: -, size: 28739726, 9019 ms
- Dec 21 09:30:59 mail postfix/cleanup[3415]: BB2758085FE: message-id=<VAdHaWpoTb2+Pl@mail.xmall.com>
- Dec 21 09:30:59 mail postfix/local[3424]: 683D28085FD: to=<virusalert@mail.xmall.com>, relay=local, delay=0.37, delays=0.31/0.03/0/0.03, dsn=2.0.0, status=sent (forwarded as BB2758085FE)
- Dec 21 09:30:59 mail postfix/qmgr[3195]: BB2758085FE: from=<virusalert@mail.xmall.com>, size=2544, nrcpt=1 (queue active)
三 部署Extmail後
- 1 extmail 須要設置爲自動啓動的服務
- chkconfig courier-authlib on
- chkconfig courier-imap on
- chkconfig httpd on
- chkconfig mysqld on
- chkconfig postfix on
- ————————————————————
- chkconfig amavisd on
- chkconfig clamd on
- 2 關閉一些端口
- 建議只保留 22 25 110 80 其它關閉,或者使用 iptables 屏蔽掉!
- dn@dn-ThinkPad-E420:~$ nmap 192.168.57.88
- Starting Nmap 5.21 ( http://nmap.org ) at 2011-12-20 11:23 CST
- Nmap scan report for mail.xmall.com (192.168.57.88)
- Host is up (0.00076s latency).
- Not shown: 990 closed ports
- PORT STATE SERVICE
- 22/tcp open ssh
- 25/tcp open smtp
- 80/tcp open http
- 110/tcp open pop3
- 111/tcp open rpcbind
- 987/tcp open unknown
- 993/tcp open imaps
- 995/tcp open pop3s
- 2049/tcp open nfs
- 3306/tcp open mysql
- 3 爲 extmail extman 升級,
- 老版本 新版本
- ExtMan 1.0 ExtMan 1.1
- ExtMail 1.1.0 ExtMail 1.2
- 直接解開壓縮包覆蓋extmail,extman (作好備份)便可!
- 別忘了更改屬主與屬組
- chown -R vuser:vgroup /var/www/extsuite/extmail/cgi/
chown -R vuser:vgroup /var/www/extsuite/extman/cgi/- 4 爲 extmail 更改模版
- http://www.extmail.org/docs/Extmail_Template_Intro/#C4
- 5 extmail,extman mysql數據庫安全
- 將如下帳戶設置爲 /sbin/nologin (編輯 /etc/passwd)
- mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
- amavis:x:102:159:AMaViS email scanner user:/var/spool/vscan:/bin/sh
- 更改extmail 默認超級管理員賬戶:root@extmail.org,初始密碼:extmail*123*
- extman 創建一個新的域管理員賬號好比 admin 並設置複雜的密碼
- mysql 數據庫root 設置密碼
- $ mysqladmin -uroot password xmall.com123
- #刪除mysql 空帳戶
- mysql> select user,host,password from mysql.user;
- +---------+----------------+------------------+
- | user | host | password |
- +---------+----------------+------------------+
- | root | localhost | 7f61883b2dac203f |
- | root | mail.xmall.com | |
- | root | 127.0.0.1 | |
- | | localhost | |
- | | mail.xmall.com | |
- | extmail | localhost | 2ffd2ffa7fea15e9 |
- | webman | localhost | 1a197db46f30ed43 |
- +---------+----------------+------------------+
- 7 rows in set (0.00 sec)
- delete from mysql.user where user=' ' and password=' ';
- #更改默認的 extmail 用戶密碼
- mysql> update mysql.user set password=password('xmall.com') where user='extmail';
- Query OK, 1 row affected (0.00 sec)
- Rows matched: 1 Changed: 1 Warnings: 0
- mysql> flush privileges;
- Query OK, 0 rows affected (0.00 sec)
- mysql> select user,host,password from mysql.user;
- +---------+----------------+------------------+
- | user | host | password |
- +---------+----------------+------------------+
- | root | localhost | 7f61883b2dac203f |
- | root | mail.xmall.com | |
- | root | 127.0.0.1 | |
- | extmail | localhost | 50c7f90a516065c5 |
- | webman | localhost | 1a197db46f30ed43 |
- +---------+----------------+------------------+
- 5 rows in set (0.00 sec)
- #因爲更改了 extmail用戶的祕密,因此要變動數據庫相關配置文件,密碼默認爲 extmail,更改成新密碼
- #vim /etc/authlib/authmysqlrc
- MYSQL_USERNAME extmail
- MYSQL_PASSWORD xmall.com
- #vim /var/www/extsuite/extmail/webmail.cf
- SYS_MYSQL_USER = extmail
- SYS_MYSQL_PASS = xmall.com
- #vim /etc/postfix/mysql_virtual_alias_maps.cf
- user = extmail
- password = xmall.com
- #vim /etc/postfix/mysql_virtual_domains_maps.cf
- user = extmail
- password = xmall.com
- #vim /etc/postfix/mysql_virtual_mailbox_maps.cf
- user = extmail
- password = xmall.com
- #vim /etc/postfix/mysql_virtual_sender_maps.cf
- user = extmail
- password = xmall.com
- #更改完畢,從新啓動 authlib
- /etc/init.d/courier-authlib restart
- main.cf 增長一些規則
- 客戶端能夠在 rcpt to 命令指定同一封郵件發送給多少個收件地址
- smtpd_recipient_limit (來指定smtp 投遞代理能夠將同一封郵件發送給多少個收件人)
- postconf smtpd_recipient_limit=20(默認值1000,建議改小一些)
- 更改單封郵件大小,默認5MB
- message_size_limit = 31336000
- 收到重複郵件
- enable_original_recipient = no
四 postfix main.cf 配置文檔
- postconf -n
- #別名數據庫(postalias/newaliases 命令生成)
- alias_database = hash:/etc/postfix/aliases
- #別名表,列出local mda 所使用的別名數據庫
- alias_maps = hash:/etc/postfix/aliases
- #退回的郵件從新投遞的最長時間
- bounce_queue_lifetime = 1d
- #支持非標準驗證規定的行爲
- broken_sasl_auth_clients = yes
- #postfix命令目錄
- command_directory = /usr/sbin
- #postfix配置文檔目錄
- config_directory = /etc/postfix
- #配置內容過濾 amavis
- content_filter = smtp-amavis:[127.0.0.1]:10024
- #postfix 的各個服務器程序目錄
- daemon_directory = /usr/libexec/postfix
- #
- data_directory = /var/lib/postfix
- #
- debug_peer_level = 2
- #重複郵件
- enable_original_recipient = no
- #
- html_directory = /usr/share/doc/postfix-2.6.2-documentation/html
- #
- mail_name = Postfix - welcome mail.xmall.com
- #以此參數指定的系統帳戶,做爲隊列文件的擁有者以及postfix daemon 進程的運行身份
- mail_owner = postfix
- #單封郵件大小限制,單位字節
- mailbox_size_limit = 150242880
- #
- mailq_path = /usr/bin/mailq.postfi
- #manpage 目錄
- manpage_directory = /usr/share/man
- #postfix在放棄投遞而返回不可投遞信息前,被延遲郵件再deferred郵件隊列中的生存時間
- maximal_queue_lifetime = 1d
- #限制單封郵件的最大長度,單位字節
- message_size_limit = 150242880
- #設置"本地網域"
- mydestination = $mynetworks $myhostname
- #完整主機名稱(主機名稱+網域名稱)
- myhostname = mail.xmall.com
- #郵件系統的網域名稱
- mydomain = xmall.com
- #附加到只含人名部分的,不完整郵件地址的網域名稱
- myorigin
- #列出可經過本郵件系統寄出郵件的網絡地址或ip地址
- mynetworks = 127.0.0.1
- #兼容sendmail,用於重建別名數據庫的newaliases程序路徑
- newaliases_path = /usr/bin/newaliases.postfix
- #postfix 隊列的主目錄
- queue_directory = /var/spool/postfix
- #
- readme_directory = /usr/share/doc/postfix-2.6.2-documentation/readme
- #
- receive_override_options = no_address_mappings
- #樣本配置文件目錄
- sample_directory = /etc/postfix
- #供腳本或命令行用來寄送郵件
- sendmail_path = /usr/sbin/sendmail.postfix
- #用來提交郵件或管理隊列的組標識符
- setgid_group = postdrop
- #
- show_user_unknown_table_name = no
- #smtp 問候信息
- smtpd_banner = $myhostname ESMTP $mail_name
- #當客戶端引起錯誤時,postfix 的初始等待時間
- smtpd_error_sleep_time = 0s
- #收件人限制條件
- 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, check_policy_service inet:127.0.0.1:10030
- #啓動sasl 驗證
- smtpd_sasl_auth_enable = yes
- #
- smtpd_sasl_local_domain = $myhostname
- #指定密碼驗證機制(除noanonymous) 全部可用機制
- smtpd_sasl_security_options = noanonymous
- #設定寄件地址與sasl登陸身份的對應關係,只能使用本域地址避免使用其餘寄件地址!
- smtpd_sender_login_maps = mysql:/etc/postfix/mysql_virtual_sender_maps.cf, mysql:/etc/postfix/mysql_virtual_alias_maps.cf
- #發件人限制條件
- smtpd_sender_restrictions = permit_mynetworks, reject_sender_login_mismatch, reject_authenticated_sender_login_mismatch, reject_unauthenticated_sender_login_mismatch
- #
- unknown_local_recipient_reject_code = 550
- #指向含有「虛擬別名地址」與「實際收件地址」對應關係的查詢表
- virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
- #虛擬網域查詢表
- virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
- #虛擬郵箱查詢表
- virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
- #用於投遞郵件到虛擬郵箱地址的默認傳輸服務(虛擬mda)
- virtual_transport = maildrop:
五 維護 postfix 的命令
- newaliases (重建別名數據庫)
- postalias /etc/postfix/aliases (建立或查詢別名數據庫)
- postcat (顯示隊列文件內容)
- postconf (修改 main.cf 配置文檔 )
- postqueue (査看postfix 隊列)
- postsuper (管理員管理 postfix 隊列)
- postmap (建立查詢表的DB數據庫或查詢查詢表內容)
結束
推薦看看 postfix權威指南,這樣更有利於咱們理解Extmail 各個軟件之間是如何工做的!
update 20120918
//刪除 sendmail 郵件隊列中的郵件
- rm -rf /var/spool/mqueue/*