个人工具

UbuntuHelp:PostfixCompleteVirtualMailSystemHowto/zh

来自Ubuntu中文

跳转至: 导航, 搜索

目录

摘要

在网上有许多帮助文档来描述如何创建邮件服务器,不同的人对MTAs有不同选择.有的人喜欢用Qmail有些人喜欢用Postfix和Exim.很长一段时间内我都喜欢用Qmail来做为我的MTA,它是一个极好的软件.但是Qmail是需要许可证的,没有方便用户在他们所习惯使用的平台上简单使用的编译好的可执行代码。虽然安装Qmail并不是那么困难,但是用户需要应用各种各样的补丁和技巧等完成完全安装。由于上述原因,并且它一旦安装完毕,运行情况还是令人满意的。所以Qmail成为了很多电脑怪杰的最爱。Qmail的缺点是升级困难,因为每次都需要编译源码并安装。综上所述,决定使用Postfix:一种像Qmail一样快速和安全的MTA,并且易与在任何Linux版本上安装和配置Basic System . Postfix 有许多附加功能并且支持Maildir 邮箱格式, PostgreSQL 后台MySQL很容易存储和管理虚拟域。这里将为希望使用Ubuntu Linux作为服务平台的ISPs,虚拟主机提供商,单个公司等安装一个完整的包含发病毒和垃圾邮件虚拟邮件域系统。

系统概述

开始安装之前,必须了解我们的系统是如何工作的。一个虚拟邮件系统必须能够控制许多域,这些域有很多用户并且用户使用不同接口。当你在同一个邮件系统中控制多个域的时候,虚拟邮件系统会提出一些管理问题。我们必须用我们的技术回答这些问题。例如,你有下面的问题需要回答。

  • 如果有两个用户在不同的域中使用了同一个用户名,你怎么办?
  • 如果你提供了IMAP访问和smtp认证,如何将不同的认证值守程序组合在同一个系统中呢?
  • 如何保证构成系统的各个组件的安全性?
  • 如果用户要求使用自己的垃圾邮件过滤策略,我们应该如何处理?
  • 每一个域的管理员要求使用基于web接口来管理他们的邮件域。
  • 如何为postfix建立一个基于web的管理系统。
  • 每个用户要求基于web接口改变邮件帐户密码。
  • 如何备份用户帐号数据库及灾难恢复。
  • 利用ssl实现传输层安全。
  • 控制任何一个域的邮件列表。

你如何一并处理以上提出的所有问题?不要担心,我会逐个回答这些问题。高高兴兴地继续读下去。

使用这个系统你会得到什么

  • 基于web的系统管理
  • 域的数量没有限制
  • 与操作系统用户无关的虚拟邮件用户
  • 特定域用户名
  • 邮箱容量分配
  • 通过web访问邮件帐号
  • 基于web接口改变用户密码
  • 支持IMAP,POP3
  • 自动回复
  • SMTP认证保证安全中转
  • SSL保证传输层安全
  • 强力垃圾邮件过滤
  • 反病毒过滤
  • 日志分析

必备软件包

我们系统必须使用下列程序包,大多数可以在APT中找到。在安装小节部分,你会学会如何安装和配置他们。

整体架构图

下面图示了我们建立的整体架构,如果你仔细观察这张图,你能从图上了解整个系统。

PostfixCompleteVirtualMailSystemHowto?action=AttachFile&do=get&target=CompleteSetupOverview.png

在我们的系统中:

  • Postfix:负责通过MTA接收和发送emails。
  • MySQL :数据库服务器保存postfix的控制信息。主要涉及用户信息,域信息,email转发及密码
  • Courier :像postfix一样的独立的邮件服务,我们利用它的pop3/IMAP服务部件使用户访问邮箱。
  • SASL:简单认证与安全层 。你的邮件服务仅信任内部地址,所以对使用外部网络地址的用户进行身份认证。通过SASL对SMTP认证使你的邮件服务信任他们。

Postfix 如何实现映射

理解Postfix 如何实现映射非常重要。我们系统的核心就是Postfix 映射,在这里我们主要讨论这个问题,不要跳过这个部分。

映射通常的字面意义是:在两个值之间建立关系。我们在Postfix中必须映射的是邮件用户帐号或邮件地址。例如Postfix使用的本地别名与本地系统用户映射文件:/etc/aliases, 显示了映射结构:

postmaster: root

这一映射结构导致所有发往[email protected] 的信件都被重定向到 [email protected]. 我们将上面的映射结构分成左手边LHS 和右手边RHS。RHS和LHS 是在映射关系中常用的缩略语。下表更清晰的说明了映射关系。

LHS RHS
postmaster: root
PostfixCompleteVirtualMailSystemHowto?action=AttachFile&do=get&target=IconHint.png 过去为了保证回溯能力使用冒号(:),现在Postfix中通常我们不在LHS里使用。本地别名文件它是一个用 newaliases 命令编译的而不是用通常的Postfix 映射命令postmap编译的特别文件。

Postfix基本默认安装中,我们为映射建立一个文本文件。我们把映射写入文本文件然后用postmap命令把此文本文件转换成一个 hash 文件。以便Postfix 能快速查到此条目。例如,假设我们在一个文件/etc/Postfix/virtual_mailboxes中映射我们的虚拟邮箱。文件结构如下:

[email protected] sigiri
[email protected] kala

你可能已经注意到在映射文件的左手边“左手边”我们没有使用冒号(:)。然后你需要运行:

postmap /etc/postfix/virtual_mailboxes

你可以通过在Postfix配置文件中加入下面这行命令来访问映射:

virtual_mailbox_maps = hash:/etc/postfix/virtual_mailboxes
在我们的安装过程中,我们将会用MySQL表来替换这个映射文本文件。因为我们的目的是更灵活,更健壮,更易升级的控制数据。数据库表可以包含两列或更多的列。当然你需要告诉Postfix 数据库中哪一列是LHS,哪一列是RHS。我们可以建一个下列样子的配置文件来完成这一任务。
user = postfix
password = YJiNLQtubgnOE
hosts = 127.0.0.1
dbname = postfix
table = mailbox
select_field = maildir
where_field = username
#additional_conditions = and active = '1'

假设这个配置文件是/etc/postfix/mysql_virtual_mailbox_maps.cf. 现在你可以在Postfix中通过在main.cf 文件中下列条目来使用这个映射。

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

配置文件中user 指出连接MySQL数据库的用户名,password 指出user的密码,dbname指出MySQL 数据库的名字,table指出 MySQL 数据库中表的名字。 hosts指出运行MySQL 数据库的服务器名。Postfix使用这个配置文件指出如何使用数据库表达到像上面提到的两列的映射文件一样的映射效果。映射的左手边称为where_field 映射的右手边称为 select_field. 在这个例子中,我们映射 maildir 列到 username 列. 利用这个配置, Postfix 构造一个SQL查询语句 select maildir from postfix.mailbox where username='johndoe' 为一个给定的username查找 maildir . 下表突出了这个差别:

LHS RHS
where_field select_field
username maildir

Postfix虚拟域是如何工作的

理解虚拟域是如何工作的对理解我们虚拟邮件系统的建立工作是很重要的。在Postfix中有两种域类型。

  • 本地域: 所有mydestination指出的域都被Postfix当作本地域。本地域的邮件被发送给在 /etc/passwd 文件中出现的用户而且这些邮件存放在/var/mail 目录中。
  • 虚拟域: 除了本地域之外Postfix还可以为虚拟域发送信件。与本地域不同Postfix可以让我们以一种灵活的方式操作虚拟域。他的优点是我们不需要为每一个邮件帐户在/etc/passwd文件中建立系统帐户。从而为我们的邮件系统提供了一种简单的方法来控制数以千计的邮件帐户。我们用在前面讨论过的映射来控制邮件帐户信息。你可以使用 MySQL, PostgreSQL 或 LDAP进行邮件帐户管理。在我们安装的系统中,使用MySQL后台管理虚拟域的邮件帐户

Postfix使用两种不同的分类控制虚拟域,需要理解他们是如何工作的。

  • 虚拟别名域: 他被用来从一个email地址向另一个email地址转发别名邮件。这种域能被用做接收邮箱并存储在你的硬盘上。在你构建的系统中虚拟别名域并不是必须的。我们可以使用虚拟别名映射表去替代虚拟别名域,甚至于那些在虚拟别名域没有出现的域。虚拟别名映射表是一张普通的重定向映射表。这张表的作用是(The virtual_alias_maps is a general-purpose redirection mapping that works for everything that passes your system including local domains.)
  • 虚拟邮箱域:' Postfix使用这些域为域中的用户接收邮件并将邮件保存到硬盘的邮箱中。这是一个参数,参数告诉Postfix接收域中的邮件并存放在每个用户的邮箱中。Postfix用虚拟别名映射表的映射决定邮箱在你的硬盘上的位置。请记住,你仍然可以用虚拟别名映射表的映射转发一封邮件到另一个邮箱或外部的邮件地址。所以并不是每一个域用户都必须有一个实际的邮箱,可以仅仅是把把邮件转发到其他地方。


PostfixCompleteVirtualMailSystemHowto?action=AttachFile&do=get&target=IconHint.png

理解一个域必然是虚拟别名域虚拟邮箱域本地域之一是很重要的。如果你设定一个域是虚拟别名域你将不能够在你的服务器上为这个域接收邮件。相反的,你可以用虚拟别名映射表去forward?action=AttachFile&do=get&target=alias email for both types of domain. 所以虚拟邮箱域可以更灵活的使用。

PostfixCompleteVirtualMailSystemHowto?action=AttachFile&do=get&target=IconWarning.png 一个域要么是虚拟的,要么是本地的。你不能让一个域同时具有两种特征。所以,如果你希望你的默认域是虚拟的,那么你必须在mydestination定义中将其删除。仅仅设置mydestination=localhost或什么也不写。像root@localhost这样的地址将被发送到本地 root用户。

Ubuntu 服务器系统安装

在这部分帮助中,我们假设你已经知道如何安装Ubuntu 服务器系统,我建议你不要使用GUI,如果你想了解更多安装细节参考here

DNS 安装

这个帮助文档假定您至少有一个可以在MX 记录中查到的域,创建BIND DNS server 可以参考here

软件包的安装与配置

你应该安装我在"必备软件包"部分中提到的所有软件包并进行配置。现在我们逐个进行解决。

Postfix 基本服务安装

现在我们安装 Postfix和Postfix和后台MySQL连接的软件包。

安装 Postfix

当安装Postfix时建议选择"Internet Site" 选项。你需要用postfix 程序包来安装Postfix。你可以从 postfix-doc 软件包中,得到Postfix文档。

安装 MySQL 映射支持Postfix

We 需要添加MySQL 映射支持Postfix. 希望您已经阅读了这个帮助文档中的 Postfix 如何实现映射 部分。 安装 postfix-mysql, 需要 postfix-mysql 软件包。 安装 MySQL client , 需要 mysql-client 软件包。 安装 MySQL server, 需要mysql-server 软件包。

安装用户访问和认证软件包

我们将向我们系统的用户提供IMAP/POP3访问。在安装过程中要用到下列软件包: 提供用户认证, 安装courier-authdaemon 软件包。 增加MySQL 支持courier-authdaemon,安装courier-authmysql 软件包。 在Ubuntu 7.10上, 安装 courier-authlib-mysql替代courier-authmysql 。 提供非加密 POP3 访问, 安装 courier-pop 软件包。 提供SSL加密POP3访问, 安装courier-pop-ssl 软件包。 提供非加密IMAP访问, 安装courier-imap 软件包。 提供SSL加密IMAP访问, 安装 courier-imap-ssl 软件包。

安装SMTP 认证包

我们的系统允许动态ip地址用户通过SMTP认证使用我们的邮件服务器发送邮件。它将会阻止非认证用户通过我们的邮件服务器中继转发邮件。我们的系统不但接收而且发送邮件也要求对用户进行认证。 提供加密 SMTP认证, 安装 postfix-tls 软件包。这个软件包可能在安装Postfix时已经安装了。如果已经安装,继续下一步。 安装Cyrus SASL library, 需要libsasl2 软件包。 为SASL library添加认证机制, 需要 libsasl2-modules 软件包。 添加 MySQL 支持SASL library认证机制, 需要libsasl2-modules-sql 软件包。 创建证书, 需要 openssl 软件包。

设置MySQL后台

现在我们需要为Postfix准备MySQL后台。在这部分帮助文档中我们将为Postfix配置MySQL数据库。

设置 MySQL root用户密码

注意MySQL root 帐户与Linux root 帐户不是一回事。MySQL root 帐户是MySQL数据库的管理员帐户。MySQL的root 帐户初始密码为空。现在我将告诉您如何设置密码的两种方法。 To set MySQL root in the command prompt: 以命令行的方式设置MySQL root 帐户

$ sudo mysqladmin -u root password rootpassword

或使用下列步骤设置MySQL root 帐户

$ mysql -u root

在MySQL命令行中输入:

mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('rootpassword');

切记要输入一个好的密码 rootpassword

为着急的用户设置MySQL

下列步骤是基于PostfixadminMySQL的,如果您非常着急,可以直接使用下列步骤创建表。

$ editor postfixadmin-mysql.sql

把下列内容复制到postfixadmin-mysql.sql文件中,用你为Postfix用户设置的密码替换INSERT INTO user 这一行中的 postfixpassword 。另外还要替换postfixadmin 密码。创建一个数据库,并且在终端中输入下列命令:

$ mysql -u root -p < postfixadmin-mysql.sql
#------------------------------------Start copy-------------------------------------
#
# Postfix Admin
# by Mischa Peters <mischa at high5 dot net>
# Copyright (c) 2002 - 2005 High5!
# License Info: http://www.postfixadmin.com/?file=LICENSE.TXT
#

# This is the complete MySQL database structure for Postfix Admin.
# If you are installing from scratch you can use this file otherwise you
# need to use the TABLE_CHANGES.TXT or TABLE_BACKUP_MX.TXT that comes with Postfix Admin.
#
# There are 2 entries for a database user in the file.
# One you can use for Postfix and one for Postfix Admin.
#
# If you run this file twice (2x) you will get an error on the user creation in MySQL.
# To go around this you can either comment the lines below "USE MySQL" until "USE postfix".
# Or you can remove the users from the database and run it again.
#
# You can create the database from the shell with:
#
# mysql -u root [-p] < DATABASE_MYSQL.TXT

#
# Postfix / MySQL
#
CREATE DATABASE postfix;

GRANT SELECT ON postfix.* TO postfix@localhost IDENTIFIED BY 'postfixpassword';
GRANT SELECT, INSERT, DELETE, UPDATE ON postfix.* TO postfixadmin@localhost IDENTIFIED BY 'postfixadmin';

USE postfix;
#
# Table structure for table admin
#
CREATE TABLE admin (
  username varchar(255) NOT NULL default '',
  password varchar(255) NOT NULL default '',
  created datetime NOT NULL default '0000-00-00 00:00:00',
  modified datetime NOT NULL default '0000-00-00 00:00:00',
  active tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (username),
  KEY username (username)
) COMMENT='Postfix Admin - Virtual Admins';

#
# Table structure for table alias
#
CREATE TABLE alias (
  address varchar(255) NOT NULL default '',
  goto text NOT NULL,
  domain varchar(255) NOT NULL default '',
  created datetime NOT NULL default '0000-00-00 00:00:00',
  modified datetime NOT NULL default '0000-00-00 00:00:00',
  active tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (address),
  KEY address (address)
) COMMENT='Postfix Admin - Virtual Aliases';

#
# Table structure for table domain
#
CREATE TABLE domain (
  domain varchar(255) NOT NULL default '',
  description varchar(255) NOT NULL default '',
  aliases int(10) NOT NULL default '0',
  mailboxes int(10) NOT NULL default '0',
  maxquota int(10) NOT NULL default '0',
  transport varchar(255) default NULL,
  backupmx tinyint(1) NOT NULL default '0',
  created datetime NOT NULL default '0000-00-00 00:00:00',
  modified datetime NOT NULL default '0000-00-00 00:00:00',
  active tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (domain),
  KEY domain (domain)
) COMMENT='Postfix Admin - Virtual Domains';

#
# Table structure for table domain_admins
#
CREATE TABLE domain_admins (
  username varchar(255) NOT NULL default '',
  domain varchar(255) NOT NULL default '',
  created datetime NOT NULL default '0000-00-00 00:00:00',
  active tinyint(1) NOT NULL default '1',
  KEY username (username)
) COMMENT='Postfix Admin - Domain Admins';

#
# Table structure for table log
#
CREATE TABLE log (
  timestamp datetime NOT NULL default '0000-00-00 00:00:00',
  username varchar(255) NOT NULL default '',
  domain varchar(255) NOT NULL default '',
  action varchar(255) NOT NULL default '',
  data varchar(255) NOT NULL default '',
  KEY timestamp (timestamp)
) COMMENT='Postfix Admin - Log';

#
# Table structure for table mailbox
#
CREATE TABLE mailbox (
  username varchar(255) NOT NULL default '',
  password varchar(255) NOT NULL default '',
  name varchar(255) NOT NULL default '',
  maildir varchar(255) NOT NULL default '',
  quota int(10) NOT NULL default '0',
  domain varchar(255) NOT NULL default '',
  created datetime NOT NULL default '0000-00-00 00:00:00',
  modified datetime NOT NULL default '0000-00-00 00:00:00',
  active tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (username),
  KEY username (username)
) COMMENT='Postfix Admin - Virtual Mailboxes';

#
# Table structure for table vacation
#
CREATE TABLE vacation (
  email varchar(255) NOT NULL default '',
  subject varchar(255) NOT NULL default '',
  body text NOT NULL,
  cache text NOT NULL,
  domain varchar(255) NOT NULL default '',
  created datetime NOT NULL default '0000-00-00 00:00:00',
  active tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (email),
  KEY email (email)
) COMMENT='Postfix Admin - Virtual Vacation';
#------------------------------------End copy-------------------------------------

按部就班的设置数据库

对于想理解数据库中各个表的作用的用户,可以按照下面的步骤一步一步的设置。

创建数据库,用户,权限

以root身份登录 MySQL database

$ mysql -u root -p

执行下列的SQL命令,创建和使用数据库。

mysql> CREATE DATABASE postfix;
mysql> USE postfix;

创建Postfix用户并设置密码(请用自己的密码替换 postfixpassword):

mysql> GRANT SELECT ON postfix.* TO postfix@localhost IDENTIFIED BY 'postfixpassword';

创建Postfix管理员用户并设置密码(请用自己的密码替换 postfixadmin):

mysql> GRANT SELECT, INSERT, DELETE, UPDATE ON postfix.* TO postfixadmin@localhost IDENTIFIED BY 'postfixadmin';

创建表管理

这是一张为我们的虚拟邮件系统创建管理员的表。这个表中的管理员可以创建,修改和删除虚拟域的管理员,邮箱和邮件系统中其他管理任务。 将下列SQL语句拷贝到您的mysql> 提示后。

CREATE TABLE admin (
  username varchar(255) NOT NULL default '',
  password varchar(255) NOT NULL default '',
  created datetime NOT NULL default '0000-00-00 00:00:00',
  modified datetime NOT NULL default '0000-00-00 00:00:00',
  active tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (username),
  KEY username (username)
) COMMENT='Postfix Admin - Virtual Admins';

创建别名表

Postfix 使用"address""goto" 列,发信人不使用此表。

PostfixCompleteVirtualMailSystemHowto?action=AttachFile&do=get&target=IconHint.png 这张表可以作为虚拟转发文件。表中的内容并不比您在其他*nix操作系统中的/etc/aliases 文件中内容多。多个目标地址之间需要用“,”隔开。

下面是别名表的表结构。把它复制到mysql> 提示符后。

CREATE TABLE alias (
  address varchar(255) NOT NULL default '',
  goto text NOT NULL,
  domain varchar(255) NOT NULL default '',
  created datetime NOT NULL default '0000-00-00 00:00:00',
  modified datetime NOT NULL default '0000-00-00 00:00:00',
  active tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (address),
  KEY address (address)
) COMMENT='Postfix Admin - Virtual Aliases';

创建域表

Postfix使用 "domain""description" 列。 Courier 不使用此表。 将下列 sql 语句复制到 mysql> 提示符之后。

CREATE TABLE domain (
  domain varchar(255) NOT NULL default '',
  description varchar(255) NOT NULL default '',
  aliases int(10) NOT NULL default '0',
  mailboxes int(10) NOT NULL default '0',
  maxquota int(10) NOT NULL default '0',
  transport varchar(255) default NULL,
  backupmx tinyint(1) NOT NULL default '0',
  created datetime NOT NULL default '0000-00-00 00:00:00',
  modified datetime NOT NULL default '0000-00-00 00:00:00',
  active tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (domain),
  KEY domain (domain)
) COMMENT='Postfix Admin - Virtual Domains';

创建域管理表

域管理表的结构。这个表用来为每一个虚拟域创建独立的管理员。Postfix 或 Courier 不使用这张表。 拷贝下列SQL语句到mysql> 提示符后。

CREATE TABLE domain_admins (
  username varchar(255) NOT NULL default '',
  domain varchar(255) NOT NULL default '',
  created datetime NOT NULL default '0000-00-00 00:00:00',
  active tinyint(1) NOT NULL default '1',
  KEY username (username)
) COMMENT='Postfix Admin - Domain Admins';

创建邮箱表

Postfix 使用"username""maildir" 列 , Courier 使用"username", "password", "name""maildir" 列。 复制下列SQL语句到mysql> 提示符后。

CREATE TABLE mailbox (
  username varchar(255) NOT NULL default '',
  password varchar(255) NOT NULL default '',
  name varchar(255) NOT NULL default '',
  maildir varchar(255) NOT NULL default '',
  quota int(10) NOT NULL default '0',
  domain varchar(255) NOT NULL default '',
  created datetime NOT NULL default '0000-00-00 00:00:00',
  modified datetime NOT NULL default '0000-00-00 00:00:00',
  active tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (username),
  KEY username (username)
) COMMENT='Postfix Admin - Virtual Mailboxes';

创建日志表

Postfix 或Courier 不使用这张表。这张表是用来记录域管理员和邮箱用户的活动。

复制下列SQL语句到 mysql> 提示符后。
CREATE TABLE log (
  timestamp datetime NOT NULL default '0000-00-00 00:00:00',
  username varchar(255) NOT NULL default '',
  domain varchar(255) NOT NULL default '',
  action varchar(255) NOT NULL default '',
  data varchar(255) NOT NULL default '',
  KEY timestamp (timestamp)
) COMMENT='Postfix Admin - Log';

Create the Vacation Table

创建自动回复表

Virual Vacation is done with a local shell account that can receive email. The email is then handled by a Perl script which sends the Vacation message(A vacation message is an automatic reply to any email you receive. It is particularly useful if you are going on leave and need to inform senders that you may not be able to reply for some time, or to contact another person until you get back. ) back to the sender.Copy and paste the sql statement to your mysql> prompt.

用一个可以接收邮件的本地系统用户完成虚拟自动回复。这封email由一个Perl script控制自动回复到发信人。复制下列SQL语句到 mysql> 提示符后。

CREATE TABLE vacation (
  email varchar(255) NOT NULL default '',
  subject varchar(255) NOT NULL default '',
  body text NOT NULL,
  cache text NOT NULL,
  domain varchar(255) NOT NULL default '',
  created datetime NOT NULL default '0000-00-00 00:00:00',
  active tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (email),
  KEY email (email)
) COMMENT='Postfix Admin - Virtual Vacation';

设置Postfix MySQL映射

在文档中你需要尽早地告知Postfix控制信息被存放到数据库的什么位置。因此你需要在 /etc/postfix 目录中创建下列4个文本文件。在下面的我们创建的文件中,我们明确使用 127.0.0.1 替代localhost作为hosts域。这是因为 Postfix 运行时改变了系统目录结构。如果你指定localhost Postfix就会试图使用在/var/run/mysql目录中的unix socket 连接到MySQL的值守程序,这将是不能访问的。使用127.0.0.1强制Postfix用 TCP/IP socket连接,将保证在改变系统目录结构后仍能正常工作。

PostfixCompleteVirtualMailSystemHowto?action=AttachFile&do=get&target=IconWarning.png 在下面所有的文件中我们使用postfixpassword 作为password 的值。 你可能将会因为安全原因更换密码,您也不会由于某种原因在论坛中提问时,没有更改密码就将配置文件贴出。

创建虚拟别名映射

Postfix will use this file for Virtual Alias Maps and it will use The LHS of the mapping is defined as where_field and the RHS is defined as select_field. In this file it would be a mapping of the address column to the goto column. Postfix 为虚拟别名映射使用这个文件,映射的左手边是where_field ,右手边是select_field。在这个文件中会在 address 列和 goto 列产生映射。

$ sudo editor /etc/postfix/mysql_virtual_alias_maps.cf

在/etc/postfix/mysql_virtual_alias_maps.cf文件中添加下列代码。

user = postfix
password = postfixpassword
hosts = 127.0.0.1
dbname = postfix
table = alias
select_field = goto
where_field = address

虚拟域映射

Posfix 仅仅使用这张表中的domain。对于这些域,我们不需要映射LHS 和 RHS

$ sudo editor /etc/postfix/mysql_virtual_domains_maps.cf

将下面的代码加入上面的文件。

user = postfix
password = postfixpassword
hosts = 127.0.0.1
dbname = postfix
table = domain
select_field = domain
where_field = domain
#additional_conditions = and backupmx = '0' and active = '1'

虚拟邮箱映射

Postfix将在username 列和maildir查询邮箱表之间建立映射。

$ sudo editor /etc/postfix/mysql_virtual_mailbox_maps.cf

将下列代码加入上述文件中。

user = postfix
password = postfixpassword
hosts = 127.0.0.1
dbname = postfix
table = mailbox
select_field = maildir
where_field = username
#additional_conditions = and active = '1'

=== 虚

转发域映射

If you are going to use your mail system only for hosting backup MX for some virtual domains then you need this mapping to tell the Postfix to enable the relaying for these domains. 如果您使用您的邮件系统仅仅为了主机对一些虚拟域备份MX,那么您需要这个映射来告知Postfix为这些域转发信件。

$ sudo editor /etc/postfix/mysql_relay_domains_maps.cf

将下列代码加入上述文件中。

user = postfix
password = postfixpassword
hosts = 127.0.0.1
dbname = postfix
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '1'
PostfixCompleteVirtualMailSystemHowto?action=AttachFile&do=get&target=IconWarning.png 为安全启见,应该仅有Root有权限看到这一些。如果系统中其他用户也能看到这四个文件,他们都能得到postfix数据库的访问密码。这是非常危险的!

执行下列命令,改变这些文件按属于postfix组。保证文件的安全性。

$ sudo chgrp postfix /etc/postfix/mysql_*.cf

使得文件对组用户可读。

$ sudo chmod 640 /etc/postfix/mysql_*.cf

创建虚拟邮件用户

我们的系统可以为数千用户提供邮箱。这些用户全部都是虚拟用户(相对于Linux系统用户而言)。所以这些用户不能在我们的系统硬盘上存放他们的信件。您或许不打算为每一个用户都分配一个惟一的系统UID (user ID)。因此我们创建一个Linux用户,它是所有邮箱的拥有者。

$ sudo groupadd -g 5000 vmail
$ sudo useradd -m -g vmail -u 5000 -d /home/vmail -s /bin/bash vmail

配置Postfix和MySQL映射

我们已经创建了MySQL映射配置文件。现在我们配置Postfix main.cf 文件以便Postfix能从MySQL数据库中查询虚拟邮箱和虚拟域。打开main.cf

$ sudo editor /etc/postfix/main.cf

然后将下列代码写入其中。

# Virtual Mailbox Domain Settings

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_mailbox_limit = 51200000
virtual_minimum_uid = 5000
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_mailbox_base = /home/vmail
virtual_transport = virtual

# Additional for quota support

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 your maildir has overdrawn your diskspace quota, please free up some of spaces of your mailbox try again.
virtual_overquota_bounce = yes

设置Postfix

main.cf文件控制了Postfix数百个配置参数。这些参数都被配成了默认初始值。我们需要配置下列参数。

$ sudo editor /etc/postfix/main.cf
#The host name where your MX for virtual domains will point to
myhostname = mail.domain.com  
mydestination = #Remains blank since we are going to host virtual domains
relayhost = #Remains blank unless you are going to use your ISP's SMTP server mail sending out mails. In which case it would be set to the host name of the ISP's SMTP server 

下列参数保持初始默认值。

alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mynetworks = all
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all

增强邮件服务

Postfixadmin

dpkg -i postfixadmin_2.2.0-1rc1_all.deb  

警告: 这个包中不包含mysql脚本。你可以使用任何一版svn 。希望这个问题在2.2发行版中能解决。

  • 设置数据库 (警告:以前它能够手动创建交叉数据库)不要忘记在DATABASE_MYSQL.TXT文件中更改密码。
 cat DATABASE_MYSQL.TXT|mysql -u root -p
  • 重启apache2
/etc/init.d/apache2 restart
  • 编辑/usr/share/postfixadmin/config.inc.php并设置database password和令其中的

"configured"=true

Courier-IMAP 和 认证服务

  • 在文件 /etc/courier/authmysqlrc中
MYSQL_SERVER 127.0.0.1
MYSQL_USERNAME postfix
MYSQL_PASSWORD thepassword
MYSQL_DATABASE postfix
MYSQL_USER_TABLE mailbox
MYSQL_LOGIN_FIELD username
MYSQL_NAME_FIELD name
MYSQL_CRYPT_PWFIELD password
#MYSQL_CLEAR_PWFIELD     password
MYSQL_MAILDIR_FIELD maildir
MYSQL_QUOTA_FIELD concat(quota,'S')
MYSQL_HOME_FIELD        '/home/vmail'
MYSQL_UID_FIELD '5000'
MYSQL_GID_FIELD '5000'
  • 重启值守程序并查看日志:
 /etc/init.d/courier-authdaemon restart ; /etc/init.d/courier-imap restart; /etc/init.d/courier-pop restart
 tail -f /var/log/mail*

SMTP 身份认证

推荐一篇好的技术文档 : http://www.starbridge.org/spip/spip.php?article1 在 /etc/postfix/main.cf 文件中添加

smtpd_recipient_restrictions = reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unauth_destination, check_policy_service inet
# modify the existing smtpd_sender_restrictions
smtpd_sender_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_non_fqdn_sender, reject_unknown_sender_domain, reject_unauth_pipelining, permit
# then add these
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_path = /etc/postfix/sasl:/usr/lib/sasl2
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain =

在/etc/postfix/sasl/smtpd.conf文件中

pwcheck_method: auxprop
auxprop_plugin: sql
mech_list: plain login cram-md5 digest-md5
sql_engine: mysql
sql_hostnames: 127.0.0.1
sql_user: postfix
sql_passwd: yourpassword
sql_database: postfix
sql_select: select passwd from mailbox where username='%u@%r' and active = 1

Web 访问

SquirrelMail is 用PHP写的标准 webmail 程序包。它内嵌的PHP支持IMAP和SMTP协议。说有网页在 HTML 4.0 (不需要JavaScript)下可在多数浏览器下正常工作。他几乎没有附加条件并且很容易安装和配置。SquirrelMail提供所有email客户端的功能。包括多媒体附件,地址本,文件夹管理。 SOURCE: http://www.squirrelmail.org/ 或者使用下列命令安装。

$ sudo apt-get install squirrelmail

优化安装过程

Anti-Spam Configuration

Installing Amavisd and Spamassassin

Quarantine and Spam Management

Auto and Per-Recipient White/Black Lists

Amavis/Spamassassin UI

GreyListing

Distributed and Collaborative Networks

Anti-Virus Configuration

Configuring for ClamAV

Log Analyzer

Install and Configure AWStats

Wrapping it Up

Final Changes and Troubleshooting

Other links

Until this article will be finished, you can find very similiar one here: http://flurdy.com/docs/postfix/ by Ivar Abrahamsen Howto created by: ChinthakaDeshapriya.