本文介绍如何在一个Ubuntu10.04平台上安装一套功能完整的邮件系统。这里我以Postfix做SMTP服务器、Courier-pop做POP3服务器、通过Cyrus-SASL对存储在MySQL数据库中的用户进行验证和授权,并且使用Extmail和ExtMan来分别提供一个完善的WEBMAIL界面和一个WEB界面的管理工具。

  整个系统包括如下几个部分:用来发信的SMTP、用来收信的POP、用来存储虚拟帐号用虚拟域信息的MySQL数据库以及一个WEB界面的邮件系统和一个WEB界面的管理工具。

  整个认证是通过Cyrus-SASL连接到authdaemond这个守护进程来监听认证需求。authdaemond在MySQL数据库进行查找进行相应的验证。MySQL作为系统中存储数据的核心,它存储了用户信息用于POP3和SMTP AUTH的认证需要。

  本文以mike.me域名为例,请根据自身实际情况予以修改。

  一、系统前提

  A、首先修改主机名,如果安装系统时已设置正确主机名,此步略过。

  编辑/etc/hostname文件,修改主机名符合FQDN。

vi /etc/hostname
mail.mike.me

  修改/etc/hosts头两行内容为

127.0.0.1 localhost.localdomain  localhost 
192.168.1.111 mail.mike.me  mail

  B、配置MX记录

  首先DNS添加一条mail.mike.me到服务器的IP地址的A记录,然后添加MX记录mike.me到mail.mike.me

  确认MX记录生效

  Linux下测试方法

host -t mx mike.me

mike.me mail is handled by 10 mail.mike.me.

  Windows下测试方法

nslookup -qt=mx mike.me

mike.me  MX preference = 10, mail exchanger = mail.mike.me

  如果只是用测试域名没有DNS管理,可以在hosts加入A地址即可(需要在main.cf设置ignore_mx_lookup_error = yes),如果是发送到本机的邮件不设置解析也可以。

  二、安装和配置

  系统所需软件

  Apache Apache是世界使用排名第一的Web服务器软件。
  MySQL  一个轻量级小型关系型数据库管理系统,在处理少量数据时非常快速,而且通过关系型数据库可以更方便地管理用户信息和提供更多用户特性。
  postfix 它是一个非常优秀的MTA服务器,它不但性能卓越,对sendmail的兼容性好,支持和多种其它软件的隅合,而且本身就带有很强的反垃圾邮件功能。
  Extmail 一个支持多语言、全部模板化,功能基本齐全的Webmail程序
  Extman 支持无限域名、无限用户的WEB管理后台。
  maildrop 一个支持过滤和强大功能的MDA。
  courier-pop 一个POP3服务器。
  SpamAssassin 最流行的开源反垃圾邮件软件之一。它是一个邮件过滤器,使用了多种反垃圾邮件技术,如:文本分析、贝叶斯过滤、DNS 黑名单和分布式协同过滤数据库等。
  Amavisd-new 一个连接MTA和内容检测工具的高性能接口程序,使用perl语言写成。
  ClamAV 一个unix系统平台上的开源反病毒工具,它是特地为在邮件网关上进行邮件扫描而设计的。
  SMTP认证库 Cyrus SASL标准的SASL实现库,可以支持Courier authlib
  其他数据认证库 Courier Authlb负责courier-imap,maildrop的认证。

  A、使用APT批量安装系统所需的所有软件

apt-get install apache2 apache2-suexec php5 libapache2-mod-php5 php5-mysql mysql-server mysql-client libpam-mysql libapache2-mod-fastcgi \
postfix postfix-doc postfix-mysql libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin \
courier-authdaemon courier-authlib courier-authlib-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl \
openssl liblzo2-2 liblzo2-dev libstdc++6 maildrop mailgraph libfcgi-perl libgd-gd2-perl libfile-tail-perl libdigest-sha1-perl \
libdigest-HMAC-perl libnet-ip-perl libnet-dns-perl libhtml-tagset-perl libhtml-parser-perl libio-stringy-perl libio-multiplex-perl \
libio-socket-ssl-perl libio-zlib-perl libnet-ssleay-perl libunix-syslog-perl libtimedate-perl libmailtools-perl libconvert-binhex-perl \
libconvert-tnef-perl libconvert-uulib-perl libcompress-zlib-perl libarchive-zip-perl libarchive-tar-perl perl-suid

  B、创建Postfix虚拟邮件帐号所使用的用户及组

groupadd -g 1001 vmail
useradd -g vmail -u 1001 -M -s /sbin/nologin vmail

  C、创建虚拟用户邮箱所在的目录,并将其权限赋予MDA用户

mkdir -pv /var/mailbox
chown -R vmail.vmail /var/mailbox
chmod -R 755  /var/mailbox/

  注:如果你创建的邮箱目录位置与此不同,请在后面所有涉及邮箱目录位置的配置中均进行相应修改。

  D、配置Postfix

  编辑/etc/postfix/main.cf

vi /etc/postfix/main.cf

# hostname
mydomain = mike.me
mynetworks = 192.168.1.0/24, 127.0.0.0/8
myhostname = mail.mike.me
mydestination = $mynetworks,$myhostname,localhost.localdomain,localhost,localhost.$mydomain

# banner
mail_name = Postfix - by mike.me
smtpd_banner = $myhostname ESMTP $mail_name

# response immediately
smtpd_error_sleep_time = 0s

# Message and return code control
message_size_limit = 5242880
mailbox_size_limit = 0
show_user_unknown_table_name = no

# Queue lifetime control
bounce_queue_lifetime = 1d
#maximal_queue_lifetime = 1d
#每1800s会重发一次,最多重发六次
queue_run_delay = 1000s
minimal_backoff_time= 1200s
maximal_backoff_time= 1800s
maximal_queue_lifetime = 10800s

alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

# Other
relayhost =
recipient_delimiter = +
inet_interfaces = all
html_directory = /usr/share/doc/postfix/html

# TLS parameters
#smtpd_tls_cert_file = /etc/postfix/smtpd.cert
#smtpd_tls_key_file = /etc/postfix/smtpd.key
#smtpd_use_tls = yes
#smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
#smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# virtual Mail Box config
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
virtual_transport = maildrop
maildrop_destination_recipient_limit = 1
maildrop_destination_concurrency_limit = 2
virtual_uid_maps = static:1001
virtual_gid_maps = static:1001

# virtual QUOA config
virtual_mailbox_base = /var/mailbox
virtual_mailbox_limit = 20971520
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_overquota_bounce = yes
virtual_mailbox_limit_override = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_limit_maps.cf
virtual_maildir_limit_message = Sorry, the your Maildir has overdrawn your diskspace quota, please free up some of spaces of your mailbox try again.

# SMTP AUTH config here
broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous

# SMTPD related config
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,
		reject_sender_login_mismatch

# 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

always_add_missing_headers = yes

  D1、各选项说明

  myorigin 参数用来指明发件人所在的域名。
  mydestination 参数指定 postfix 接收邮件时收件人的域名,即您的postfix系统要接收到哪个域名的邮件。
  myhostname 参数指定运行 postfix 邮件系统的主机的主机名,默认情况下,其值被设定为本地机器名。
  mydomain参数指定您的域名,默认情况下, postfix将myhostname的第一部分删除而作为mydomain的值。
  mynetworks 参数指定你所在的网络的网络地址,postfix系统根据其值来区别用户是远程的还是本地的,如果是本地网络用户则允许其访问。
  smtpd_banner 设置向用户显示的主机名和版本信息

  inet_interfaces 参数指定postfix 系统监听的网络接口。
  smtpd_error_sleep_time 当SMTP服务端口接收到非法的命令时,系统将缓冲处理的时间间隔。这个参数对于防止恶意攻击非常有效。 
  message_size_limit 用于限定系统所接受的最大的单封邮件长度,缺省为10240000字节。
  mailbox_size_limit 用于限定本地邮箱的最大文件尺寸,默认值为51200000字节。
  show_user_unknown_table_name 设置发给对方邮件服务器没有这个用户的回信,例如对方发送aa@test.com,邮件服务器没有aa这个用户,然后返回给他一个邮件形式的通知。
  bounce_queue_lifetime:退信(弹回)在队列中的保留时间。超过此时间,被认为是无法投递的。
  queue_run_delay:用于设定队列处理程序对拖延邮件的扫描周期。缺省为1000秒。
  maximal_queue_lifetime:用于设定队列处理程序对滞留邮件的最长保存期。缺省为5天。超过此时间,被认为是无法投递的。
  minimal_backoff_time:用于设定队列处理程序对无法投递的邮件的最短巡回时间(最小投递失败周期)。缺省为1000秒。
  maximal_backoff_time:用于设定队列处理程序对无法投递的邮件的最长巡回时间(最长投递失败周期)。缺省为4000秒。

  alias_maps 设置别名映射。
  alias_database 设置别名映射数据库。
  relayhost 用于设定转发到下一个邮件服务器,relayhost的值可以是domain、host、hostort、[address]或[addressort]。
  recipient_delimiter 定义用户的名称和地址扩展之间的分隔符,默认为空。
  html_directory 定义本地Postfix的HTML文件的位置。

  virtual_alias_maps 指向一个虚拟别名表。
  virtual_mailbox_domains 用于虚拟投递代理的,它指出了一个虚拟域名列表,拥有这些域名的电子邮件才能够被postfix的虚拟投递代理处理。它也是代替在$mydestination参数指出一长串的域名。虚拟域中定义的域名,不能再在$mydestination中定义。因为同一个域名不能同时出现在本地域和虚拟域中。
  virtual_mailbox_maps 定义虚拟邮箱的位置。
  virtual_transport  定义MDA所使用的程序,缺省为Postfix自带的virtual。这里用的是maildrop。
  maildrop_destination_recipient_limit 定义MDA每次投递的限制。由于maildrop不支持一次接收多个收件人,所以这里限制为1。
  maildrop_destination_concurrency_limit 定义MDA投递的并发数。
  virtual_uid_maps和virtual_gid_maps参数决定postfix的virtual MDA投递邮件到虚拟邮箱时,应该继承的系统账户。如所有虚拟邮箱都属于同一个账户,则可以使用static映射方式直接指定virtual所要继承的UID与GID。
  virtual_mailbox_base 定义虚拟邮箱的物理存放路径。
  virtual_mailbox_limit 定义单个虚拟邮箱的大小。

  broken_sasl_auth_clients=yes:表示是否兼容非标准的SMTP认证协,有一些microsoft的smtp客户端,如outlook express4.0采用非标准的smtp认证协议,只要将该参数设置为yes就可以解决这类不兼容问题。
  smtpd_sasl_auth_enable 是否启用sasl作为smtp认证方式。默认不启用,这里必须将它启用,所以设置为yes。
  smtpd_sasl_local_domain 定义postfix的SMTP服务器的本地SASL认证域的名称。缺省值为空。
  smtpd_sasl_security_options:用来限制某些登陆的方式,noanonymous表示禁止采用匿名方式登陆。

  smtpd_recipient_restrictions:表示通过收件人地址对客户端发来的邮件进行过滤,以下是常用的几种限制规则:
  permit_mynetworks:表示只要是收件人地址是mynetworks参数中定义的网段就可以被转发邮件。
  permit_sasl_authenticated:表示允许转发通过sasl认证的邮件。
  reject_non_fqdn_hostname:拒绝不符合域名规则的域名。
  reject_non_fqdn_sender:拒绝不符合域名规则的发送者。
  reject_non_fqdn_recipient:拒绝不符合域名规则的转发目标。
  reject_unauth_destination:拒绝未经过认证的目的地。
  reject_unauth_pipelining:拒绝未认证的管理连接。
  reject_invalid_hostname:拒绝无效的主机名。
  reject_sender_login_mismatch:拒绝同域没认证发信。同时拒绝有认证了,但认证地址跟mail from地址不一致的。
  reject_unauth_destination:表示拒绝转发含未信任的目标地址的邮件。

  smtpd_sender_restrictions 表示通过发件人地址对客户端发来的邮件进行过滤,以下是常用的几种限制规则:
  reject_authenticated_sender_login_mismatch:拒绝认证了,但认证地址跟mail to地址不一致的。
  reject_unauthenticated_sender_login_mismatch:拒绝未认证的发送者。

  smtpd_sender_login_maps 定义发送者帐号映射位置。
  always_add_missing_headers Postfix总是自动为没有message-id的邮件添加message-id。

  D2、编辑/etc/postfix/master.cf

vi /etc/postfix/master.cf

#注释掉原来的maildrop

#maildrop  unix  -       n       n       -       -       pipe
#  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}

#为了使Postfix支持Maildrop,需新增下面部分
maildrop   unix        -       n        n        -        -        pipe
  flags=DRhu user=vmail argv=maildrop -w 90 -d ${user}@${nexthop} ${recipient} ${user} ${extension} {nexthop}

#关闭smtpd运行在Chroot模式,将如下行:

smtp      inet  n       -       -       -       -       smtpd

#修改为下面的内容
smtp      inet  n       -       n       -       -       smtpd

  注:Ubuntu下如果不关闭chroot模式,在进行smtpd认证时,mail.log中会提示如下的错误:mail postfix/smtpd[1229]: warning: SASL authentication failure: cannot connect to Courier authdaemond: No such file or directory。

  D3、重新启动Postfix

/etc/init.d/postfix start

  E、配置saslauthd

  Postfix的SMTP认证需要透过Cyrus-SASL,连接到authdaemon获取认证信息。

  E1、编辑/etc/default/saslauthd,让START=yes及OPTIONS=”-c -m /var/spool/postfix/var/run/saslauthd -r”

vi /etc/default/saslauthd
START=yes
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"

  E2、编辑/etc/postfix/sasl/smtpd.conf,修改内容如下:

vi /etc/postfix/sasl/smtpd.conf

pwcheck_method: authdaemond
log_level: 2
mech_list: PLAIN LOGIN
authdaemond_path: /var/run/courier/authdaemon/socket

  E3、启动saslauthd

/etc/init.d/saslauthd restart

  F、配置Courier

  修改Courier的配置,让它知道是透过MySQL资料库来做认证。

  F1、编辑/etc/courier/authdaemonrc,并且让authmodulelist=”authmysql”

vi  /etc/courier/authdaemonrc

authmodulelist="authmysql"
authmodulelistorig="authmysql"
daemons=5

  F2、编辑/etc/courier/authmysqlrc,修改内容如下:

vi /etc/courier/authmysqlrc

MYSQL_SERVER            localhost
MYSQL_USERNAME          extmail
MYSQL_PASSWORD          extmail
MYSQL_SOCKET            /var/run/mysqld/mysqld.sock
MYSQL_PORT              3306
MYSQL_OPT               0
MYSQL_DATABASE          extmail
MYSQL_USER_TABLE        mailbox
MYSQL_CRYPT_PWFIELD     password
MYSQL_UID_FIELD         uidnumber
MYSQL_GID_FIELD         gidnumber
MYSQL_LOGIN_FIELD       username
MYSQL_HOME_FIELD        homedir
MYSQL_NAME_FIELD        name
MYSQL_MAILDIR_FIELD     maildir
MYSQL_QUOTA_FIELD       quota
MYSQL_SELECT_CLAUSE     SELECT username,password,"",uidnumber,gidnumber,\
                        CONCAT('/var/mailbox/',homedir),               \
                        CONCAT('/var/mailbox/',maildir),               \
                        quota,                                          \
                        name,                                           \
                        CONCAT("disablesmtpd=",disablesmtpd,            \
                        ",disablesmtp=",disablesmtp,                    \
                        ",disablewebmail=",disablewebmail,              \
                        ",disablenetdisk=",disablenetdisk,              \
                        ",disableimap=",disableimap,                    \
                        ",disablepop3=",disablepop3,                    \
                        ",netdiskquota=",netdiskquota)                  \
                        FROM mailbox                                    \
                        WHERE username = '$(local_part)@$(domain)'

  F3、启动Courier

  修改authdaemon socket目录权限,如果该目录权限不正确修改,maildrop及postfix等将无法正确获取用户的信息及密码认证。

chmod 755  /var/run/courier/authdaemon/
/etc/init.d/courier-authdaemon restart

  注:如果出现mail.log中出现:warning: SASL authentication failure: cannot connect to Courier authdaemond: Permission denied这样的错误,请修改authdaemon socket目录权限。

  G、配置POP3和IMAP

  POP3和IMAP服务安装完成后,默认都是开启的。由于Courier-imap的IMAP目录是按UTF-7编码的,ExtMail目前还没有正式支持IMAP目录,所以IMAP只支持通过邮件客户端使用。

  G1、修改/etc/courier/pop3d中的值POP3DSTART为YES

vi /etc/courier/pop3d

POP3DSTART=YES

  G2、修改/etc/courier/imapd中IMAPDSTART的值为NO

vi /etc/courier/imapd

IMAPDSTART=YES

  G3、重启POP3和IMAP服务

/etc/init.d/courier-imap restart
/etc/init.d/courier-pop restart

  H、配置Apache

  由于extmail要进行本地邮件的投递操作,故必须将运行apache服务器用户的身份修改为您的邮件投递代理的用户;本文环境中就打开了Apache服务器的suexec功能,故使用以下方法来实现虚拟主机运行身份的指定。本文使用的MDA为maildrop,而maildrop是用vmail这个用户运行的。因此将指定为vmail用户。

  H1、启用suexec模块

a2enmod suexec

  H2、编辑/etc/apache2/conf.d/extmail.conf,修改内容如下:

vi  /etc/apache2/conf.d/extmail.conf

# VirtualHost for ExtMail Solution
 
ServerName mail.mike.me
DocumentRoot /var/www/extsuite/extmail/html/ 
ScriptAlias /extmail/cgi /var/www/extsuite/extmail/cgi 
Alias /extmail /var/www/extsuite/extmail/html 
ScriptAlias /extman/cgi /var/www/extsuite/extman/cgi
Alias /extman /var/www/extsuite/extman/html
# Suexec config
SuexecUserGroup vmail vmail

  如果你的Apache没有打开suexec功能,可以用以下方法解决。

  修改Apache的运行用户为MDA的运行用户

vi /etc/apache2/apache2.conf

User vmail 
Group vmail 

  I、配置ExtMail

  I1、下载ExtMail

  由于不支持wget直接下载,到http://www.extmail.org/cgi-bin/download.cgi手动下载ExtMail

  I2、解压ExtMail

tar xvzf extmail-1.2.tar.gz 

  I3、安装ExtMail

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

  I4、配置ExtMail

#生成配置文件
cp /var/www/extsuite/extmail/webmail.cf.default /var/www/extsuite/extmail/webmail.cf

  编辑/var/www/extsuite/extmail/webmail.cf,修改如下的内容

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

#主要变动的内容如下:

SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail
SYS_MYSQL_DB = extmail
SYS_USER_LANG = zh_CN
SYS_MAILDIR_BASE = /var/mailbox
SYS_MYSQL_SOCKET = /var/run/mysqld/mysqld.sock

  注:SYS_MYSQL_USER和SYS_MYSQL_PASS是连接MySQL数据库的用户名和密码,这里都是用的缺省的。可根据具体需要修改初始SQL中对应内容。

  I5、更新cgi目录权限

  由于SuEXEC的需要,必须将extmail的cgi目录修改成vmail:vmail权限

chown -R vmail:vmail /var/www/extsuite/extmail/cgi/

  J、配置ExtMan

  J1、下载ExtMan

  由于不支持wget直接下载,到http://www.extmail.org/cgi-bin/download.cgi手动下载ExtMail

  J2、解压ExtMan

tar xvzf extman-1.1.tar.gz

  J3、安装ExtMan

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

  J4、配置ExtMan

#生成配置文件
cp /var/www/extsuite/extman/webman.cf.default /var/www/extsuite/extman/webman.cf

  编辑/var/www/extsuite/extman/webman.cf,修改如下的内容

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

#主要变动的内容见下:
SYS_MYSQL_SOCKET = /var/run/mysqld/mysqld.sock
SYS_MAILDIR_BASE = /var/mailbox
# sys_default_gid, if not set, webman will ignore it 
SYS_DEFAULT_UID = 1001
# sys_default_gid, if not set, webman will ignore it
SYS_DEFAULT_GID = 1001

  J5、链接基本库到Extmail

mkdir /tmp/extman
chown -R vmail:vmail /tmp/extman

  J6、更新cgi目录权限

  由于SuEXEC的需要,必须将ExtMan的cgi目录修改成vmail:vmail权限

chown -R vmail:vmail /var/www/extsuite/extman/cgi/

  J7、数据库初始化

  由于maildrop投递时会从数据库里取uidnumber/gidnumber,而在master.cf里已经定义好了投递时的运行身份是vmail。vmail的UID、GID是1001,而不是Extmail中初始化SQL中缺省的1000,所以这里需要对初始化SQL进行相应修改。

  编辑/var/www/extsuite/extman/docs/extmail.sql,修改如下内容:

vi /var/www/extsuite/extman/docs/extmail.sql

#修改缺省uidnumber、gidnumber为1001
#修改前

CREATE TABLE mailbox (
......
uidnumber int(6) NOT NULL default '1000',
gidnumber int(6) NOT NULL default '1000',
......
) TYPE=MyISAM COMMENT='ExtMail - Virtual Mailboxes';

#修改后
CREATE TABLE mailbox (
......
uidnumber int(6) NOT NULL default '1001',
gidnumber int(6) NOT NULL default '1001',
......
) TYPE=MyISAM COMMENT='ExtMail - Virtual Mailboxes';

  编辑/var/www/extsuite/extman/docs/init.sql,修改如下内容:

vi /var/www/extsuite/extman/docs/init.sql

#修改缺省uidnumber、gidnumber为1001

#修改前
INSERT INTO `mailbox` VALUES ('postmaster@extmail.org','postmaster','$1$phz1mRrj$3ok6BjeaoJYWDBsEPZb5C0','','PostMaster','','extmail.org/postmaster/Maildir/','extmail.org/postmaster','104857600S','52428800S','extmail.org',1000,1000,'2007-02-14 15:10:04','2010-11-08',1,0,0,0,0,0,0,0,'my question','my answer');

#修改后
INSERT INTO `mailbox` VALUES ('postmaster@extmail.org','postmaster','$1$phz1mRrj$3ok6BjeaoJYWDBsEPZb5C0','','PostMaster','','extmail.org/postmaster/Maildir/','extmail.org/postmaster','104857600S','52428800S','extmail.org',1001,1001,'2007-02-14 15:10:04','2010-11-08',1,0,0,0,0,0,0,0,'my question','my answer');

  J8、导入mysql数据库结构及初始化数据

mysql -u root -p 

  注:如果MySQL的root用户有密码会提示,按实际情况输入即可。

  K、设置虚拟域和虚拟用户的配置文件

  K1、复制配置文件

cd /var/www/extsuite/extman/docs
cp mysql_virtual_alias_maps.cf /etc/postfix/
cp mysql_virtual_domains_maps.cf /etc/postfix/
cp mysql_virtual_mailbox_maps.cf /etc/postfix/
cp mysql_virtual_sender_maps.cf /etc/postfix/
cp mysql_virtual_limit_maps.cf /etc/postfix/

  K2、修改上面所有.cf文件中的HOST为127.0.0.1,这里以mysql_virtual_domains_maps.cf为例。其它.cf文件修改与下面相同。

vi /etc/postfix/mysql_virtual_domains_maps.cf

#修改前
hosts = localhost
#修改后
hosts = 127.0.0.1

  K3、MySQL中增加一个相应extmail授权

mysql>GRANT SELECT, UPDATE ON extmail.* TO 'extmail'@'127.0.0.1' IDENTIFIED BY 'extmail';
mysql>flush privileges;

  注:Postfix连接到MySQL是通过网络地址127.0.0.1而非localhost,因为Postfix执行在chroot jail中,并不能使用localhost来存取MySQL连接端口。如果你使用127.0.0.1,Postfix将使用TCP网路协议来连接MySQL,在chroot jail的情形下,这个方式是没有问题的。这个问题还需进一步测试,我现在的环境是关闭postfix chroot的,同样不能用localhost运行。

  如果你的mail.log中报如下类似错误,就可能是上面提到的postfix chroot后引起的。

postfix/trivial-rewrite: warning: connect to mysql server localhost: Can'T connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' 

  L、访问ExtMan

  重启Apache

/etc/init.d/apache2 restart

  访问http://ip或域名/extmail/,将看到webmail的登陆页,不过此时还没有加正式的用户,所以不能登陆。必须要登陆到http://ip或域名/extman/里增加一个新帐户才能登陆。

  这里我们先在Extman里创建一个mike.me的虚拟域和mike的用户,用于后面的测试帐户。(创建方法略,图形界面很简单的)
  
  注:ExtMan的默认超级管理员帐户:root@extmail.org,初始密码:extmail*123*,登陆成功后,请将修改密码,以确保安全。

  M、配置图形化日志

  M1、复制启动脚本到/usr/local/mailgraph_ext

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

  M2、修改/usr/local/mailgraph_ext/mailgraph-init文件中MAIL_LOG的值为mail.log(Ubuntu中Postfix产生的日志文件名与Centos的不同)

vi /usr/local/mailgraph_ext/mailgraph-init
MAIL_LOG=/var/log/mail.log

  M3、启动mailgraph_ext服务

/usr/local/mailgraph_ext/mailgraph-init start

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

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

  M5、加入开机启动

  把上面的代码加入到/etc/rc.local中,让系统自动启动。

vi /etc/rc.local

#将如下两行加入到exit 0之前
/usr/local/mailgraph_ext/mailgraph-init start
/var/www/extsuite/extman/daemon/cmdserver --daemon

  注:邮件系统有一定的流量后,登陆到extman里点“图形日志”即可看到图形化的日志。具体每天,周,月,年的则点击相应的图片进入即可。 这里有一点需要注意,在firefox和Chrome中都找不到对应菜单,只有IE能看到。
  N、测试SMTP认证

  N1、重启下面的服务,让之前修改的配置生效

/etc/init.d/postfix restart
/etc/init.d/saslauthd restart
/etc/init.d/courier-authdaemon restart

  N2、测试SMTP认证前,我们先测试下Courier-Authlib是否能成功连接mysql

  在命令行下执行:

#mike@mike.me和000000分别是用户名和密码
authtest -s login mike@mike.me 000000

  如果成功,会显示如下信息

Authentication succeeded.

     Authenticated: mike@mike.me  (uid 1001, gid 1001)
    Home Directory: /var/mailbox/mike.me/mike
           Maildir: /var/mailbox/mike.me/mike/Maildir/
             Quota: 5242880S
Encrypted Password: $1$Mf4KU5iQ$9UtQqNRMdUnAuPqtkyimd.
Cleartext Password: 000000
           Options: disablesmtpd=0,disablesmtp=0,disablewebmail=0,disablenetdisk=0,disableimap=0,disablepop3=0,netdiskquota=5242880S

  这一步成功了,接下来我们就进行SMTP认证测试。  

  通过以下命令获得mike@mike.me的用户名及密码的BASE64编码:

perl -e 'use MIME::Base64; print encode_base64("mike\@mike.me")'
bWlrZUBtaWtlLm1l

perl -e 'use MIME::Base64; print encode_base64("000000")'
MDAwMDAw

  在本机通过Telnet进行SMTP认证测试

telnet localhost 25

ehlo localhost   <<输入内容
250-mail.mike.me
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
auth login     <<输入内容
334 VXNlcm5hbWU6
bWlrZUBtaWtlLm1l     <<输入内容(转码后的用户名)
334 UGFzc3dvcmQ6
MDAwMDAw     <<输入内容(转码后的密码)
235 2.7.0 Authentication successful
quit     <<输入内容
221 2.0.0 Bye

  最后出现235 Authentication Successful 表明认证成功了。

  SMTP认证测试通过后,在用TELNET进行发信测试。

telnet localhost 25

ehlo localhost   <<输入内容
250-mail.mike.me
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
auth login     <<输入内容
334 VXNlcm5hbWU6
bWlrZUBtaWtlLm1l     <<输入内容(转码后的用户名)
334 UGFzc3dvcmQ6
MDAwMDAw    <<输入内容(转码后的密码)
235 2.0.0 Authentication successful
mail from: mike@mike.me  <<输入内容(发件人邮箱地址)
250 2.1.0 Ok
rcpt to: easylife206@gmail.com   <<输入内容(收件人邮箱地址)
250 2.1.5 Ok
data  <<输入内容
354 End data with .
Subjet: My first mail on Postfix   <<输入内容(邮件主题)
Hi,Test Mail Send!  <<输入内容(邮件内容)
.              <<输入内容(表示邮件内容已输入完成)
250 2.0.0 Ok: queued as 09D051000EA
quit     <<输入内容
221 2.0.0 Bye

  去收件人邮箱看看吧,收到邮件就成功了。如有问题,请分析mail.log日志文件。

  O、测试POP3

  O1、首先重启下面的服务,让之前修改的配置生效

/etc/init.d/courier-pop restart

  O2、在本机通过Telnet进行POP3收信测试(请首先登录extman自行建立测试帐号,这里以用户mike@mike.me,密码:000000为例)

telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
+OK Hello there.
user mike@mike.me <<输入内容(用户名)
+OK Password required.
pass 000000    <<输入内容(密码)
+OK logged in.
list      <<输入内容
+OK POP3 clients that break here, they violate STD53.
.
quit  <<输入内容
+OK Bye-bye.
Connection closed by foreign host.

  如出现以上提示信息,则表示能正确通过POP3收信。

  P、配置内容和病毒过滤

  SpamAssassin是目前最好的、最流行的开源反垃圾邮件软件之一。它是一个邮件过滤器,使用了多种反垃圾邮件技术。如:文本分析、贝叶斯过滤、DNS黑名单和分布式协同过滤数据库等。SpamAssassin是利用Perl来进行文字分析以达到过滤垃圾邮件之目的。它的判断方式是藉由评分方式,若这封邮件符合某种特征,则加以评分。若总得分高于某项标准,则判定为垃圾邮件。它也提供了spamc/spamd这种以Client/Server为架构之程序,如此可以有效降低SpamAssassin 对系统资源的需求。但Ubuntu预设上并不会启用这个服务,而我们还可以替而使用Amavisd-new来调用SpamAssassin的方法,也就是让Amavisd-new肩负扫毒及过滤垃圾邮件的重责。

  ClamAntiVirus(ClamAV)是unix系统平台免费而且开放源代码的防毒软件,软件与病毒码的更新皆由社群免费发布。它是特地为在邮件网关上进行邮件扫描而设计的。整套软件提供了许多的实用工具,包括一个可伸缩和可升级的多线程守护进程、一个命令行扫描工具和病毒库自动升级工具。clamav-daemon使ClamAV以daemon防护的方式运行。

  amavisd-new是一个连接MTA和内容检测工具(诸如病毒扫描工具和SpamAssassin)的高性能接口程序,使用perl语言写成。它一般通过SMTP、ESMTP或者LMTP和MTA进行通讯,当然也可以借助于其它外部程序进行。它可以调用外部的杀毒/反垃圾来对邮件进行过滤,很方便的实现病毒过滤,内容过滤。MTA在接收邮件后,会把邮件再转丢给amavisd-new处理,而amavisd-new则会呼叫病毒扫瞄引擎或是垃圾邮件检查程式来处理这封邮件,处理完毕后,它会将它再丢回给MTA 处理。它可以同时支援多个病毒扫瞄引擎及垃圾邮件检查程式。

  amavisd-new同postfix(MTA)协同工作时表现尤佳。当它呼叫SpamAssassin进行内容过滤时,对于一封邮件只需要呼叫一次,而不管这封邮件将发往多少个收件人;同时,它亦会尽力保证实现每一位收件人的偏好设置,如接收/拒绝,检测/不检测,垃圾邮件级别等;它还会在邮件头部分插入spam相关信息。

  amavisd-new和mailscanner的不同在于它使用SMTP协议通信,处理完后再回传给Postfix,整个过程不会对Postfix造成任何结构上的影响。Mailscanner必须监视Postfix的Hold队列,采用比较暴力的做法。

  P1、通过APT批量安装amavisd-new、SpamAssassin、ClamAV

apt-get install amavisd-new  clamav clamav-daemon clamav-base clamav-freshclam libclamav6 libtommath0 spamassassin clamtk \
libnet-dns-perl libmail-spf-query-perl libnet-ph-perl libnet-snpp-perl libnet-telnet-perl pyzor razor \
arj bzip2 cabextract cpio file gzip lha nomarch pax rar unrar unzip zip zoo lzop arc

  P2、配置ClamAV

  将clamav加到amavis运行组里,并调整目录权限,否则clamav将无法扫描amavisd-new产生的临时文件

usermod -G amavis clamav

  P3、配置amavisd-new

  通过移除@bypass_virus_checks_maps和@bypass_spam_checks_maps前的注释,来启用amavisd-new对ClamAV和SpamAssassin的调用。

  编辑/etc/amavis/conf.d/15-content_filter_mode文件

vi /etc/amavis/conf.d/15-content_filter_mode

#去掉下面四行的注释符

#@bypass_virus_checks_maps = (
#   \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);

#@bypass_spam_checks_maps = (
#   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

  编辑/etc/amavis/conf.d/20-debian_defaults文件,修改检测到垃圾邮件和病毒邮件的规则。

vi /etc/amavis/conf.d/20-debian_defaults

#修改投递/拦截的方法
$final_virus_destiny      = D_DISCARD;
$final_banned_destiny     = D_DISCARD;
$final_spam_destiny       = D_PASS;
$final_bad_header_destiny = D_PASS;

  注:$final_virus_destiny表示检测到病毒时的动作、$final_banned_destiny表示检测到受禁止的内容时的动作、$final_spam_destiny表示检测到垃圾邮件、广告邮件(spam)时的动作、$final_bad_header_destiny表示检测到不良信件时的动作。

  默认有以下几种动作:D_PASS表示无论信件是否有问题,都会将信件发给收件人,D_DISCARD表示信件将被丢弃,并且不会告知收件人及发件人,D_BOUNCE表示信件不会发送给收件人,但会通知发件人邮件没有被投递,即退信,D_REJECT表示邮件不会被投递给收件人,但会通知发件人邮件被拒绝。
  
  P4、启动ClamAV和amavisd-new服务:

/etc/init.d/amavis start
/etc/init.d/clamav-freshclam start
/etc/init.d/clamav-daemon start

  P5、配置SpamAssassin

  建立/etc/mailname文件,用于SpamAssassin判断邮件域

vi  /etc/mailname
mike.me

  P6、启用SpamAssassin

  Ubuntu下SpamAssassin默认没有启用,需修改/etc/default/spamassassin文件手动启用。

vi /etc/default/spamassassin

#修改ENABLED为1

ENABLED=1

  P7、启动SpamAssassin服务

/etc/init.d/spamassassin start

  Q、配置Postfix集成amavisd-new

  Q1、编辑/etc/postfix/main.cf文件,增加如下内容

vi /etc/postfix/main.cf

# Content-Filter
content_filter = smtp-amavis:[127.0.0.1]:10024
receive_override_options = no_address_mappings

  注意:receive_override_options 这里必须增加,禁止地址展开/影射,否则如果遇到别名的时候会引起冗余邮件的产生。

  Q2、编辑/etc/postfix/master.cf文件,增加如下内容

vi /etc/postfix/master.cf

smtp-amavis unix    -    -    n    -    3    smtp
    -o smtp_data_done_timeout=1200
    -o smtp_send_xforward_command=yes
    -o disable_dns_lookups=yes
    -o max_use=50

127.0.0.1:10025 inet    n       -       n       -       -       smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_client_restrictions=
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o mynetworks=127.0.0.0/8
    -o strict_rfc821_envelopes=yes
    -o smtpd_error_sleep_time=0
    -o smtpd_soft_error_limit=1001
    -o smtpd_hard_error_limit=1000
    -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks

  Q3、重启postfix

/etc/init.d/postfix restart

  Q4、重新启动amavisd

/etc/init.d/amavis restart

  Q5、测试SpamAssassin

telnet localhost 25

ehlo localhost   <<输入内容
250-mail.mike.me
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
auth login     <<输入内容
334 VXNlcm5hbWU6
bWlrZUBtaWtlLm1l     <<输入内容(转码后的用户名)
334 UGFzc3dvcmQ6
MDAwMDAw    <<输入内容(转码后的密码)
235 2.0.0 Authentication successful
mail from: mike@mike.me  <<输入内容(发件人邮箱地址)
250 2.1.0 Ok
rcpt to: easylife206@gmail.com   <<输入内容(收件人邮箱地址)
250 2.1.5 Ok
data  <<输入内容
354 End data with .
Subjet: Test spam mail   <<输入内容(邮件主题)
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X  <<输入内容(邮件内容)
.              <<输入内容(表示邮件内容已输入完成)
250 2.0.0 Ok: queued as 0211E10039D
quit     <<输入内容
221 2.0.0 Bye

  在邮件日志里,应该有相应的信息出现:

Sep  5 23:59:22 mail amavis[9932]: (09932-01) Blocked SPAM, LOCAL [127.0.0.1] [127.0.0.1]  -> , quarantine: c/spam-ccafBBhP63Bd.gz, Message-ID: <20110905155750.0211E10039D@mail.mike.me>, mail_id: ccafBBhP63Bd, Hits: 1001.975, size: 403, 7881 ms

  如果看到类似这样的日志,表明SpamAssassin工作正常。

  Q6、测试Clamav

telnet localhost 25

ehlo localhost   <<输入内容
250-mail.mike.me
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
auth login     <<输入内容
334 VXNlcm5hbWU6
bWlrZUBtaWtlLm1l     <<输入内容(转码后的用户名)
334 UGFzc3dvcmQ6
MDAwMDAw    <<输入内容(转码后的密码)
235 2.0.0 Authentication successful
mail from: mike@mike.me  <<输入内容(发件人邮箱地址)
250 2.1.0 Ok
rcpt to: easylife206@gmail.com   <<输入内容(收件人邮箱地址)
250 2.1.5 Ok
data  <<输入内容
354 End data with .
Subjet: Test virus mail   <<输入内容(邮件主题)
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*  <<输入内容(邮件内容)
.              <<输入内容(表示邮件内容已输入完成)
250 2.0.0 Ok: queued as 32D0410039D
quit     <<输入内容
221 2.0.0 Bye

  在邮件日志里,应该有相应的信息出现:

Sep  6 00:04:52 mail amavis[9933]: (09933-01) Blocked INFECTED (Eicar-Test-Signature(69630e4574ec6798239b091cda43dca0:69)), LOCAL [127.0.0.1] [127.0.0.1]  -> , quarantine: Y/virus-YeGbMJs5v+YA, Message-ID: <20110905160420.32D0410039D@mail.mike.me>, mail_id: YeGbMJs5v+YA, Hits: -, size: 404, 305 ms

  如果看到类似这样的日志,表明Clamav+Amavisd-new工作正常。

  Q7、对本地发出的邮件不进行内容过滤

vi  /etc/amavis/conf.d/25-amavis_helpers 加入

$policy_bank{'MYNETS'} = {   # mail originating from @mynetworks
  originating => 1,  # is true in MYNETS by default, but let's make it explicit
  os_fingerprint_method => undef,  # don't query p0f for internal clients
  allow_disclaimers => 1,  # enables disclaimer insertion if available
  bypass_spam_checks_maps => [1],
  bypass_banned_checks_maps => [1],
  bypass_header_checks_maps => [1],
  bypass_virus_checks_maps  => [1],
}; 

  bypass_virus_checks_maps表示不对检测到病毒时邮件做任何处理的动作
  bypass_spam_checks_maps表示不对检测到垃圾邮件、广告邮件(spam)做任何处理的动作
  bypass_banned_checks_maps表示不对检测到受禁止的邮件内容时做任何处理的动作
  bypass_header_checks_maps 表示不对检测到不良信件时做任何处理的动作

  重新启动amavisd

/etc/init.d/amavis restart

  R、加入SPF记录

  R1、什么是 SPF Record

  在垃圾邮件的伎俩中,伪造发件人地址,使其看起来象一个合法的地址,是常见的一种方法。特别是网络钓鱼的邮件,试图欺骗收件人透露信用卡号码、QQ密码、Paypal 密码等帐号资料。这些邮件的“发件人”的地址,一般都经过了伪装,使其看起来看一个合法的(如银行、网站服务商等)地址。

  而SPF,正是近年来解决邮件防伪和anti-spam的一个新标准。SPF全称为Sender Policy Framework,即发送方策略框架。你只需要在你的域名DNS中发布一条SPF记录,这条记录标识了经过授权的电子邮件发送服务器。电子邮件接收系统,会查询对应域名的SPF记录,检查邮件是否来自真正的授权过的邮件发送服务器。如果是垃圾邮件、钓鱼邮件伪造的"发件人"地址,则他们的邮件会无法通过SPF校验。

  R2、添加SPF Record

  添加SPF Record其实很简单,只需要在你域名的DNS管理界面中,加入一条 TXT 记录即可。TXT记录的内容如下:

v=spf1 include:mike.me ~all

  R3、测试SPF记录是否生效

  Linux方法

#host -t txt mike.me

mike.me descriptive text "v=spf1 include:mike.me ~all"

#dig -t txt mike.me

mike.me descriptive text "v=spf1 include:mike.me ~all"

  Windows方法

nslookup -qt=txt mike.me

mike.me     text =

"v=spf1 include:mike.me ~all"

  更多SPF语法可参考

  http://www.openspf.org/SPF_Record_Syntax
  http://www.oschina.net/question/54100_16254

  S、一些Web检查工具

  黑名单检查

  http://www.mxtoolbox.com/

  通过这个不但可以检查各种DNS设置,还可以检测到你的IP地址,是否已经给列入黑名单。

检测MX记录

  http://zmailer.org/mxverify.html

  检测SPF记录

  http://www.openspf.org/

  测试spf和dkim记录

  http://www.brandonchecketts.com/emailtest.php

  T、常用Postfix管理命令

  常用队列邮件管理操作

  列出队列里的所有邮件

postqueue -p

  删除队列邮件

#根据ID删除一封邮件
postsuper -d ID
#删除所有邮件
postsuper -d ALL 
#清空邮件队列
postqueue -f

  根据发送者来删除队列邮件,替换 “info@otherdomain.com”就可以

mailq | tail +2 | awk ‘BEGIN { RS = “” }# $7=sender, $8=recipient1, $9=recipient2{ if ($7 == “info@otherdomain.com” && $9 == “”)print $1 }‘ | tr -d ‘*!’ | postsuper -d -

  根据收件人删除,替换you@yourdomain.com 就可以

mailq | tail +2 | awk ‘BEGIN { RS = “” }# $7=sender, $8=recipient1, $9=recipient2{ if ($8 == “you@yourdomain.com” && $9 == “”)print $1 }‘ | tr -d ‘*!’ | postsuper -d -

  根据发送服务器的hostname来删除,替换掉 senderhostname

mailq | grep senderhostname | awk ‘{ print $1} ‘| postsuper -d -

  如果当前的系统队列很长,负担很重,我们可以把队列里的邮件先hold(保留邮件)

postsuper -h ALL

  当处理完后,再把队列移回来(重新排队)

postsuper -r ALL

  显示邮件内容

postcat -q ID 

  启动postfix

postfix start

  停止postfix

postfix stop

  重新读取postfix配置文件

postfix reload

  立即投递队列中所有邮件(慎用)

postfix flush

  修复队列以及任何权限错误

postfix check

  U、参考文档

  http://www.google.com
  http://www.yiyou.org/docs/debian_postfix_01/
  http://forum.ubuntu.org.cn/viewtopic.php?f=54&t=209753
  http://wiki.ubuntu.org.cn/IRedMail#SPF.E8.AE.B0.E5.BD.95
  http://wiki.extmail.org/extmail_solution_for_linux_centos-5



无觅相关文章插件,快速提升流量

Comments

2 Responses to “Ubuntu 10.04下配置Postfix邮件全功能服务器”

  • 博主你好。请问配置一个postfix服务器真的这么麻烦吗?为什么要用到数据库和apache这些,能不能解释一下。Linux新手,希望博主能帮一下

  • 2012-08-12 12:55tenson说道:

    配置Postfix 那一段很多配置不知道 ,那里开始入手, 可否补充下,/etc/postfix/main.cf文件内容也跟上面写的有点出入

Leave a Reply

You must be logged in to post a comment.

传奇 似水流年 绽放 风筝 八月照相馆