本文介绍使用
FreeBSD+Postfix+Cyrus-sasl+Courier-imap+Webmail+spamassassin+Clamav+mailscanner +maildrop来架构一个具有多域名,webmail、防病毒、防垃圾邮件、web管理界面的邮件系统。
Jacky, $Revision: 5.1 bate $Date: 2006-10-31
杨廷勇 QQ:187159779
Copyright © 2004、2005、2006
欢迎转载,保留版权和出处[http://www.thismail.org]
系统主要采用MailScanner+clamav+Spamd来对病毒过滤和垃圾邮件过滤。
----------------------------------
新增加对smtpd,imap,pop3,webmail的登录控制
新增加简单的邮件分组
新增邮件监控
加强对垃圾邮件的过滤
增加系统黑名单
-----------------------------------
本文在4.10、5.3、5.4、5.5、6.0、6.1上安装测试通过,采用MailSanner来对邮件过滤和垃圾邮件过滤,配置更容易,并且降低了 系统开消。让系统更加稳定,经过严格病毒邮件测试成功率达到了98%。垃圾邮件过滤基本上达到了95%的成功率。
本人水平有限,如有错误之处请发邮件到scyz2 at 163.com (at = @),本人不对本文档对你的系统造成的损失负任何连带责任。
――――――――――――――――――――――――――――――――――
第一章 FreeBSD 简介
1.1 什么是FreeBSD?
1.2 postfix简介
第二章 操作系统FreeBSD安装
第三章 更新ports
3.1 安装CVSUP
3.2 更新ports树
第四章 软件安装
4.1 安装perl
4.2 安装mysql
4.3 安装apache22
4.4 安装mod_php5
4.5 安装php5的扩展
4.6 安装openssl
4.7 安装phpMyAdmin
4.8 设置数据库
4.9 安装cyrus-sasl2
4.10 安装postfix2
4.11 安装Courier-imap
4.12 安装MailScanner
4.13 安装maildrop
第五章 软件系统配置
5.1 配置cyrus-sasl
5.2 配置postfix
5.3 配置Courier-imap
5.4 安装Tmail管理工具
5.5 登录测试
5.6 垃圾邮件和病毒邮件过滤设置
第六章 安装webmail
附一、常见问题
附二、MailScanner.conf中文参数说明
――――――――――――――――――――――――――――――――――
第一章 FreeBSD 简介
1.1 什么是FreeBSD?
我 想大家都知道 Microsoft Windows 是一套作业系统,FreeBSD 也是一套作业系统。FreeBSD 是一个可以在 Intel 相容个人计算机、DEC Alpha 或 PC98 架构的计算机上执行的 UNIX 作业系统。大家应该听过另一套UNIX的作业系统 Linux,FreeBSD 也是一套免费的作业系统。它可以让我们的个人计算机变成先进的工作站,更稳定的提供你所需的网络服务。
BSD UNIX 系统可以说是网络作业系统的始祖,FreeBSD 是众多 BSD UNIX 分支中的一个,它继承了 BSD 系统的高性能与可靠性。自从1993 年 FreeBSD 推出 1.0-RELEASE 以来,FreeBSD 开发团队便致力于系统的调校,使其发挥绝佳的效能。在 FreeBSD 团队的统筹努力下,使它比起其它免费的 UNIX 作业系统更有结构。在 FreeBSD 上有许多支援的免费软件,这些软件大都已移植收录于 FreeBSD ports 中,使得我们在安装软件时变得十分轻松。FreeBSD 支援 32 位元、64 位元的许多不同平台,具有高效能核心架构、动态函式库共享、绝佳的网络功能,比起其它商用 UNIX 系统毫不逊色。
FreeBSD 作业系统相当容易取得及安装,除了经由传统的光盘安装外,它也可以经由网络安装、MS-DOS 分割区安装等等。当然,我们也可以在计算机中同时安装多种不同的作业系统,例如 Windwos 98 和 FreeBSD 同时并存也是件十分容易的事。
在 FreeBSD 上的应用软件相当的多,也都可以免费取得,由于 FreeBSD 的稳定性高且功能强大,因此许多大型网站都以它为作业平台,其中最知名的就是 YAHOO!。YAHOO! 是一个流量相当大的入口网站,他们选择以 FreeBSD 为作业平台,由此可知 FreeBSD 的优异性。除此之外,在台湾,FreeBSD 普遍被应用于学术网络上,许多大专院校的服务器都是使用 FreeBSD 来提供网络服务。
但是您别以为 FreeBSD 只能用来做为网络服务器,FreeBSD 也可以是一个良好的个人作业系统。事实上,Mac OS X 就是使用 FreeBSD 做为系统核心。大家都知道 Mac OS 是个人计算机上有名的作业系统,它会使用 FreeBSD 做为系统核心,可见 FreeBSD 的质量亦深获 Apple 的肯定。
在宽带网络逐渐普及的台湾,每个人都可以自行架设一台网路服务器,以 FreeBSD 来提供网络服务(如网页、邮件、档案存取等)。值得一提的是 FreeBSD 并不像 MS-Windows 一样每每要求使用者升级计算机才能使用。FreeBSD 对于硬件的要求很低,你可以用一台 Intel 586-133MHz 的旧计算机来安装 FreeBSD,这也算是癈物利用吧。
1.2 为什么要选择FreeBSD?
现在的个人计算机作业系统市场中,是以 MS-Windows 独大,但在网络服务器市场中,UNIX 系统的使用率可不输 MS-Windows 喔。我个人认为 MS-Windows 之所以会有那么多的使用者主要是因为他的使用者介面对初学者而言较容易操作,再加上许多软件的配合及盗版的助长,安装软件只要一直按下一步就完成。使得使 用者即便它的稳定性不高也得乖乖的接受。
其实初学者没有试过其它的作业系统才会有这样的误解,因为一直用 MS-Windows 才会认为当机是无可避免的事,当机对于 MS-Windows 或许是无可避免,但在其它 UNIX 系统中可不常见。在 UNIX 系列的作业系统中,也可以有像 MS-Windows 的图形介面,几乎所有在 MS-Windows 上可以做的事,在 FreeBSD 上都可以做得到,唯一的不同点是你不必花钱去取得你想要的功能。包括排版、图形处理、MP3、多媒体、网络芳邻等等都可以在 FreeBSD 中做到。
重 点是,对于一台网路服务器而言,图形介面会占用系统资源,而且必须安装一堆有的没的软件。笔者偏好乾干脆净净的系统,而 FreeBSD 正好具有这个优点。不过这并不代表您不能使用图形介面,您还是可以安装类似 Windows 的图形介面,让您使用它来做为平日使用的个人计算机。此外,FreeBSD 把自己定位为最佳的网络服务器,它承袭了 BSD 优良的网络血统,在提供服务时能有绝佳的效能表现。而且,它是免费的。
然而,有这么多的免费 UNIX 作业系统中,为什么要选择 FreeBSD 而不使用其它作业系统(如 Linux )呢?在网络上在讨论这个问题时,每每会引发每个作业系统使用者的激辩。对于要使用何种作业系统,除了使用者偏好外,还有许多指标可以提供我们参考。
FreeBSD 是一套完整的作业系统
我 们平常所说的 Linux 指的是它的核心 (Kernel),Kernel 只是整个作业系统的一部份,除了 Kernel 外,我们还需要一些基本的指令、系统及目录架构、图形介面等。Linux 的 Distribution 就是各个不同的组织或公司自行收集一些系统必备的程序,制作出一个作业系统。Linux 系统有很多的 Distribution,如 Redhat、SUSE、Debian 等。因为每个 Distribution 都有自己的程序或架构,所以每个 Distribution 都长的不一样。如果您使用的是 Linux,在 Linux 三十多种 Distribution 中,每一种之间都有些许差异,在设定上用法都不同。
而 FreeBSD 指的不只是核心而已,它是一套完整的作业系统。从系统核心到使用者介面、各种常用指令都是由 FreeBSD 总部所统一推出。因此,FreeBSD 每一个版本之间有着共同的架构,不同软件之间的整合搭配性较为完整,不管是设定、学习都很容易。
由核心团队统筹开发
FreeBSD 整个系统都是由总部的核心团队所维护,所以整个系统都搭配得很好。而 Linux 只有 Kernel 由 Linus Torvlds 所维护。因为 FreeBSD 整个系统都是由总部所开发,不只系统整体较有规划,各个程序之间搭配起来也比较紧密。如果您使用 Linux,由于 Kernel 和其它的程序是由不同组织所维护,在升级时,比较麻烦。而 FreeBSD 就简单多了,每次一有新的版本,一定是整个系统一起升级。
我 觉得 FreeBSD 总部统筹发展 FreeBSD 是一件很棒的事,所有的问题回报都可以统筹管理并予以更新。FreeBSD 推陈出新的速度相当快,每一次安装都确保这个版本不会有上一版的缺失。所以在 Linux 或 MS-Windows 中「新版本不一定是最好」的定律并不适用于 FreeBSD。但这并不意味着你必须不断重新安装系统,FreeBSD 总部随时会发布最新更新的档案提供下载,而且如果使用 CVSUP 就可以和更新版的 FreeBSD 保持同步更新。
完整的使用手册
FreeBSD 的使用手册非常完整,而且会随着软件一起更新。每次一有新的版本推出,FreeBSD 的文件也会做相对的更新。在 FreeBSD 的官方网站上,我们可以轻松的取得这些高质量的手册及文件。
软件安装的便利性
FreeBSD 支援的软件相当多,它将常用的软件分类管理,当需要安装软件时,使用者不必自行到网络上找寻,只要到 FreeBSD ports 目录中下个指令就安装完成。
条理分明的系统架构
FreeBSD 目录结构非常有组织,结构严谨,对于系统管理者而言比较不会紊乱。FreeBSD 将系统预设的目录和管理者自行安装的程序目录划分得十分清楚,管理者在进行升级、维护时可以一目了然。
完美的程序开发平台
安 装完 FreeBSD 后,系统所有程序原始码非常有条理的存放在特定目录中。对于想要进行程序修改的管理者而言,不必四处寻找某支程序原始码。笔者在 FreeBSD 及 Linux 上开发程序多年,我觉得 FreeBSD 原始码及系统架构十分有组织,是程序开发最好的平台。
而且 FreeBSD 的版权较为宽松,对于想要以 FreeBSD 为基础开发产品的公司而言,它可以保护您的修改不会被其它对手抄袭。
1.3 为什么不选择FreeBSD?
许 多企业选择使用目前大多数人使用的 MS windows 做为一般作业用个人计算机的作业系统当然无可厚非。但以 MS windows 做服务器,除了资讯人员的偏好外(或许因为不会使用其它系统吧),还有部份原因是为了在企业内资讯人员技术不足时,能求助于系统供应商。而 FreeBSD 是免费的,企业也害怕有状况时无人可以支援,这对企业是很重要的一项因素。
然而,FreeBSD 的使用人数其实很多,而且使用者都十分热心,在台湾的 BBS 讨论区上,许多问题都可以获得解决。这当然还不够,现在有很多顾问公司提供 FreeBSD 的顾问服务,可以提供企业这方面的服务。虽然说 FreeBSD 的系统稳定,但在应用上如果没有资讯人员的支援,很难能在企业中存活。但正因市场上了解 FreeBSD 的人较少,若我们能主动学习,必能为自己创造更多价值。
FreeBSD 目前支援的平台不多,若您不是使用 X86 的系统,而是使用 ARM、MIPS 等平台,您就必须寻求其它的解决方案。
1.2 postfix简介
Postfix 是一个非常优秀的MTA,她素以高效、安全的特点而著称。Postfix是作者在UNIX上所见过的MTA中在反垃圾邮件(Anti-Spam或Anti -UCE)方面做得最好的一个,甚至有很多公司在Postfix代码的基础上进行二次开发而推出反垃圾邮件网关产品。MTA的反垃圾邮件功能,实际上就是 在MTA处理过程中对会话进行过滤。这个过滤不但过滤了发往自身的垃圾邮件,而且还防止了自身被恶意利用发送垃圾邮件。Postfix实现了目前所有主要 的MTA过滤技术。postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件。和Sendmail相比Postfix更快、更容易管理、更灵活、更安全,同时 还与sendmail保持足够的兼容性。
第二章 操作系统FreeBSD安装
FreeBSD6.1系统安装手册
官方安装手册:
QUOTE:
http://www.freebsd.org/doc/zh_CN.GB2312/books/handbook/install.html
注意在系统安装过程中,分区方面一定要注意,最好是一个独立的mail分区来存放用户的邮件数据,因为默认的VAR分区读写频繁,数据存放在这样的分区中是很危险的;在安装系统的过程中,建议最小化安装加ports。
第三章 更新ports
3.1 安装CVSUP
QUOTE:
mail# cd /usr/ports/net/cvsup-without-gui
mail# make install clean
安装过程中由于依赖的关系,它会自动安装gettext,会出现下面的选项。
以下是我的选择。
QUOTE:
Options for gettext 0.14.5_2
[X] EXAMPLES install example files
[X] HTMLMAN install man pages in HTML format
3.2 更新ports树
(更新日期2006-07-09)
编辑ports-supfile
QUOTE:
mail# ee /usr/share/examples/cvsup/ports-supfile
QUOTE:
第51行
*default host=CHANGE_THIS.FreeBSD.org
改为:
*default host=cvsup2.freebsdchina.org
QUOTE:
mail# /usr/local/bin/cvsup -g -L 2 /usr/share/examples/cvsup/ports-supfile
Parsing supfile "ports"
Connecting to Cvsup2.FreeBSD.org.cn
Connected to Cvsup2.FreeBSD.org.cn
Server software version: SNAP_16_1h
Negotiating file attribute support
Exchanging collection information
Establishing multiplexed-mode data connection
Running
Updating collection ports-all/cvs
……
……
Shutting down connection to server
Finished successfully
出现上面的提示,表示更新成功。
第四章 软件安装
4.1 安装perl-5.8.8
QUOTE:
mail# cd /usr/ports/lang/perl5.8
mail# make install clean
4.2 安装mysql-5.0.27
4.2 安装mysql
QUOTE:
mail# cd /usr/ports/databases/mysql50-server
编辑Makefile
mail# ee Makefile
在CONFIGURE_ARGS这段话的
--enable-thread-safe-client前面加上三句参数
BUILD_OPTIMIZED=yes \
BUILD_STATIC=yes \
PTHREAD_LIBS=-lkse \
mail# make WITH_CHARSET=gb2312 WITH_XCHARSET=all BUILD_OPTIMIZED=yes BUILD_STATIC=yes install clean
在rc.conf中加入Mysql的启动参数
QUOTE:
mail# echo 'mysql_enable="YES"' >> /etc/rc.conf
启动mysql
QUOTE:
mail# /usr/local/etc/rc.d/mysql-server start
Starting mysql.
查看mysql是否启动成功
QUOTE:
mail# sockstat -4 | grep 3306
mysql mysqld 1510 3 tcp4 *:3306 *:*
出现上面的端口表示mysql启动成功
4.3 安装httpd-2.2.3
QUOTE:
mail# cd /usr/ports/www/apache22
mail# make install clean
在rc.conf中加入apache的启动参数
QUOTE:
mail# echo 'apache_enable="YES"' >> /etc/rc.conf
启动apache
QUOTE:
mail# /usr/local/etc/rc.d/apache22 start
Starting apache.
查看apache是否启动成功
QUOTE:
mail# sockstat -4 | grep 80
www httpd 10679 16 tcp4 *:80 *:*
www httpd 10678 16 tcp4 *:80 *:*
www httpd 10677 16 tcp4 *:80 *:*
www httpd 10676 16 tcp4 *:80 *:*
www httpd 10675 16 tcp4 *:80 *:*
root httpd 10674 16 tcp4 *:80 *:*
出现上面的80端口表示apache启动成功
4.4 安装php-5.1.6
QUOTE:
mail# cd /usr/ports/lang/php5
mail# make install clean
以下是我的选择
QUOTE:
Options for php5 5.1.6_3
[ ] CLI Build CLI version
[ ] CGI Build CGI version
[X] APACHE Build Apache module
[ ] DEBUG Enable debug
[ ] SUHOSIN Enable Suhosin protection system
[X] MULTIBYTE Enable zend multibyte support
[ ] IPV6 Enable ipv6 support
[ ] REDIRECT Enable force-cgi-redirect support (CGI only)
[ ] DISCARD Enable discard-path support (CGI only)
[ ] FASTCGI Enable fastcgi support (CGI only)
[ ] PATHINFO Enable path-info-check support (CGI only)
QUOTE:
mail# echo 'AddType application/x-httpd-php .php' >> /usr/local/etc/apache/httpd.conf
mail# echo 'AddType application/x-httpd-php-source .phps' >> /usr/local/etc/apache/httpd.conf
编辑httpd.conf加入index.php
QUOTE:
DirectoryIndex index.html index.html.var index.php
#注:在DirectoryIndex这里加入index.php,是为了让apache支持首页为index.php的首页文件
4.5 安装php5的扩展
QUOTE:
mail# cd /usr/ports/lang/php5-extensions
mail# make install clean
QUOTE:
Options for php5-extensions 1.0
[X] BCMATH bc style precision math functions
[X] BZ2 bzip2 library support
[X] CALENDAR calendar conversion support
[X] CTYPE ctype functions
[X] CURL CURL support
[ ] DBA dba support
[ ] DBASE dBase library support
[X] DOM DOM support
[ ] EXIF EXIF support
[ ] FILEINFO fileinfo support
[ ] FILEPRO filePro support
[ ] FRIBIDI FriBidi support
[X] FTP FTP support
[X] GD GD library support
[ ] GETTEXT gettext library support
[ ] GMP GNU MP support
[X] HASH HASH Message Digest Framework
[X] ICONV iconv support
[ ] IMAGICK ImageMagick support
[X] IMAP IMAP support
[ ] INTERBASE Interbase 6 database support (Firebird)
[ ] LDAP OpenLDAP support
[ ] MBSTRING multibyte string support
[X] MCRYPT Encryption support
[X] MHASH Crypto-hashing support
[ ] MING ming shockwave flash support
[ ] MSSQL MS-SQL database support
[X] MYSQL MySQL database support
[ ] MYSQLI MySQLi database support
[ ] NCURSES ncurses support (CLI only)
[ ] ODBC unixODBC support
[ ] OPENSSL OpenSSL support
[ ] PANDA panda support
[ ] PCNTL pcntl support (CLI only)
[X] PCRE Perl Compatible Regular Expression support
[ ] PDF PDFlib support (implies GD)
[X] PDO PHP Data Objects Interface (PDO)
[ ] PGSQL PostgreSQL database support
[X] POSIX POSIX-like functions
[ ] PSPELL pspell support
[ ] READLINE readline support (CLI only)
[ ] RECODE recode support
[X] SESSION session support
[ ] SHMOP shmop support
[X] SIMPLEXML simplexml support
[ ] SNMP SNMP support
[ ] SOAP SOAP support
[ ] SOCKETS sockets support
[X] SQLITE sqlite support
[ ] SYBASE_CT Sybase database support
[ ] SYSVMSG System V message support
[ ] SYSVSEM System V semaphore support
[ ] SYSVSHM System V shared memory support
[ ] TIDY TIDY support
[X] TOKENIZER tokenizer support
[ ] WDDX WDDX support (implies XML)
[X] XML XML support
[X] XMLREADER XMLReader support
[ ] XMLRPC XMLRPC-EPI support
[X] XMLWRITER XMLWriter support
[ ] XSL XSL support (Implies DOM)
[ ] YAZ YAZ support (ANSI/NISO Z39.50)
[X] ZIP ZIP support
[X] ZLIB ZLIB support
重启apache安装完成。
4.6 安装openssl-0.9.7l
QUOTE:
mail# cd /usr/ports/security/openssl
mail# make install clean
4.7 安装phpMyAdmin-2.9.0.2
QUOTE:
mail# cd /usr/ports/databases/phpmyadmin
mail# make fetch
注:(在这里建议直接下载后复制安装)
QUOTE:
mail# cd /usr/ports/distfiles
mail# tar –zxvf phpMyAdmin-2.9.0.2.tar.gz
mail# mv /usr/local/www/phpMyAdmin-2.9.0.2 /usr/local/www/apache22/data/dbadmin
修改/usr/local/www/apache22/data/dbadmin/config.inc.php
QUOTE:
$cfg['PmaAbsoluteUri'] = 'http://192.168.0.2/dbadmin/';
$cfg['Servers'][$i]['auth_type'] = 'http'; // Authentication method (config, http or cookie based)?
注:指定phpmyadmin的认证方式为http方式。
在浏览器输入http://192.168. 0.2/dbadmin/,首次进行登入的用户名为root密码为空,登入后可以修改你的密码。
4.8 设置数据库
建立postfix数据库(注意:数据库名称为postfix):
QUOTE:
mail# /usr/local/bin/mysql –u root –p
mysql# CREATE DATABASE `postfix` ;
mysql# use postfix;
把下面的sql语句导入到postfix数据库中去:
QUOTE:
-- phpMyAdmin SQL Dump
-- version 2.9.0.2
-- http://www.phpmyadmin.net
--
-- 主机: localhost:3306
-- 生成日期: 2006 年 10 月 30 日 22:17
-- 服务器版本: 4.0.26
-- PHP 版本: 5.1.6
--
-- 数据库: `tmail`
--
-- --------------------------------------------------------
--
-- 表的结构 `address`
--
CREATE TABLE `address` (
`id` int(11) unsigned NOT NULL auto_increment,
`pw_id` int(5) NOT NULL default '0',
`name` varchar(64) NOT NULL default '',
`email` varchar(128) NOT NULL default '',
UNIQUE KEY `id` (`id`),
KEY `pw_id` (`pw_id`)
) TYPE=MyISAM PACK_KEYS=1 AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `address`
--
-- --------------------------------------------------------
--
-- 表的结构 `admin`
--
CREATE TABLE `admin` (
`id` int(10) unsigned NOT NULL auto_increment,
`site_id` int(10) unsigned NOT NULL default '0',
`domain` varchar(128) NOT NULL default '',
`quota` smallint(5) unsigned NOT NULL default '0',
`total` smallint(5) unsigned NOT NULL default '0',
`createtime` timestamp(14) NOT NULL,
`login` char(1) NOT NULL default '',
`cur_total` smallint(5) NOT NULL default '0',
`cur_quota` smallint(5) NOT NULL default '0',
`gid` varchar(11) NOT NULL default '',
`expiration_time` timestamp(14) NOT NULL default '00000000000000',
`flag` int(10) unsigned NOT NULL default '0',
`maxmsg` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`id`),
UNIQUE KEY `domain` (`domain`)
) TYPE=MyISAM PACK_KEYS=1 AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `admin`
--
-- --------------------------------------------------------
--
-- 表的结构 `card`
--
CREATE TABLE `card` (
`id` int(5) unsigned NOT NULL auto_increment,
`pw_id` int(5) unsigned NOT NULL default '0',
`LinkMan` varchar(64) NOT NULL default '',
`CompanyName` varchar(100) NOT NULL default '',
`Address` varchar(255) NOT NULL default '',
`Position` varchar(32) NOT NULL default '',
`PhoneNumber` varchar(16) NOT NULL default '',
`Mobile` varchar(12) NOT NULL default '',
`Email` varchar(128) NOT NULL default '',
`Partaker` varchar(32) NOT NULL default '',
`Memo` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=27 ;
--
-- 导出表中的数据 `card`
--
-- --------------------------------------------------------
--
-- 表的结构 `lastauth`
--
CREATE TABLE `lastauth` (
`user` char(32) NOT NULL default '',
`domain` char(64) NOT NULL default '',
`remote_ip` char(18) NOT NULL default '',
`timestamp` bigint(20) NOT NULL default '0',
PRIMARY KEY (`user`,`domain`)
) TYPE=MyISAM;
--
-- 导出表中的数据 `lastauth`
--
-- --------------------------------------------------------
--
-- 表的结构 `logs`
--
CREATE TABLE `logs` (
`pw_id` int(5) default '0',
`ip` varchar(15) NOT NULL default '',
`action` varchar(15) NOT NULL default '',
`time` datetime default NULL,
`content` varchar(64) NOT NULL default '',
`email` varchar(128) NOT NULL default ''
) TYPE=MyISAM;
--
-- 导出表中的数据 `logs`
--
-- --------------------------------------------------------
--
-- 表的结构 `message`
--
CREATE TABLE `message` (
`id` int(5) unsigned NOT NULL auto_increment,
`title` varchar(255) NOT NULL default '',
`body` text NOT NULL,
`createtime` datetime NOT NULL default '0000-00-00 00:00:00',
`updatetime` datetime NOT NULL default '0000-00-00 00:00:00',
`pw_domain` varchar(64) NOT NULL default '',
UNIQUE KEY `id` (`id`)
) TYPE=MyISAM AUTO_INCREMENT=2 ;
--
-- 导出表中的数据 `message`
--
-- --------------------------------------------------------
--
-- 表的结构 `personal`
--
CREATE TABLE `personal` (
`id` int(11) unsigned NOT NULL auto_increment,
`pw_id` int(5) NOT NULL default '0',
`truename` varchar(10) NOT NULL default '',
`fax` varchar(20) NOT NULL default '',
`telephone` varchar(15) NOT NULL default '',
`sex` int(1) NOT NULL default '0',
`year` int(4) NOT NULL default '0',
`MONTH` int(2) NOT NULL default '0',
`DAY` int(2) NOT NULL default '0',
`education` varchar(4) NOT NULL default '',
`marital` int(1) NOT NULL default '0',
`occupation` varchar(15) NOT NULL default '',
`companyname` varchar(30) NOT NULL default '',
`province` varchar(6) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM PACK_KEYS=1 AUTO_INCREMENT=12 ;
--
-- 导出表中的数据 `personal`
--
-- --------------------------------------------------------
--
-- 表的结构 `scheduler`
--
CREATE TABLE `scheduler` (
`id` int(11) unsigned NOT NULL auto_increment,
`begin_time` int(11) unsigned default NULL,
`end_time` int(11) unsigned default NULL,
`title` varchar(255) NOT NULL default '',
`body` varchar(255) NOT NULL default '',
`pw_id` int(11) unsigned NOT NULL default '0',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `scheduler`
--
-- --------------------------------------------------------
--
-- 表的结构 `stow`
--
CREATE TABLE `stow` (
`id` int(5) unsigned NOT NULL auto_increment,
`pw_id` int(5) unsigned NOT NULL default '0',
`Name` varchar(128) NOT NULL default '',
`http` varchar(255) NOT NULL default 'http://',
`memo` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `stow`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_access`
--
CREATE TABLE `tmail_access` (
`id` int(11) unsigned NOT NULL auto_increment,
`ctime` int(11) unsigned default NULL,
`source` varchar(128) NOT NULL default '',
`access` varchar(16) NOT NULL default '',
`type` char(1) NOT NULL default 'S',
PRIMARY KEY (`id`),
KEY `source` (`source`,`type`,`access`,`ctime`)
) TYPE=MyISAM AUTO_INCREMENT=65 ;
--
-- 导出表中的数据 `tmail_access`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_alias`
--
CREATE TABLE `tmail_alias` (
`id` int(11) unsigned NOT NULL auto_increment,
`alias` varchar(128) NOT NULL default '',
`destination` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_alias`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_autobbc`
--
CREATE TABLE `tmail_autobbc` (
`id` int(9) NOT NULL auto_increment,
`realname` varchar(128) default NULL,
`email` varchar(128) NOT NULL default '',
`autobbc` varchar(128) NOT NULL default '',
`come` int(1) default NULL,
`out` int(1) default NULL,
`domain` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_autobbc`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_company`
--
CREATE TABLE `tmail_company` (
`id` int(6) NOT NULL auto_increment,
`domain` varchar(25) NOT NULL default '',
`name` varchar(50) NOT NULL default '',
`linkman` varchar(50) NOT NULL default '',
`tel` varchar(15) NOT NULL default '',
`Address` varchar(50) NOT NULL default '',
`zip` varchar(6) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_company`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_domaininfo`
--
CREATE TABLE `tmail_domaininfo` (
`id` tinyint(11) NOT NULL auto_increment,
`domain` varchar(25) NOT NULL default '',
`transport` varchar(128) NOT NULL default '',
`alias` varchar(50) default NULL,
`passwd` varchar(35) NOT NULL default '',
`clean` text NOT NULL,
`admin` tinytext NOT NULL,
`yesno` tinytext NOT NULL,
`usernum` text NOT NULL,
`quota` text NOT NULL,
`filequota` text NOT NULL,
`expire` date NOT NULL default '0000-00-00',
`create_time` datetime default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `domain` (`domain`),
KEY `domain_id` (`id`)
) TYPE=MyISAM PACK_KEYS=0 COMMENT='domain information' AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_domaininfo`
--
INSERT INTO `tmail_domaininfo` (`id`, `domain`, `transport`, `alias`, `passwd`, `clean`, `admin`, `yesno`, `usernum`, `quota`, `filequota`, `expire`, `create_time`) VALUES
(1, 'admin', 'maildrop', NULL, '$1$t5h6XOby$UP3HJpdrozxEsRlcLF6tI0', 'hing4585', '0', '1', '0', '0', '0', '0000-00-00', '2006-10-06 16:44:13');
-- --------------------------------------------------------
--
-- 表的结构 `tmail_group_name`
--
CREATE TABLE `tmail_group_name` (
`id` int(9) NOT NULL auto_increment,
`group_name` varchar(128) NOT NULL default '',
`domain` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_group_name`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_monitor`
--
CREATE TABLE `tmail_monitor` (
`id` int(11) unsigned NOT NULL auto_increment,
`email` varchar(128) NOT NULL default '',
`cc` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`),
KEY `email` (`email`,`cc`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_monitor`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_pop`
--
CREATE TABLE `tmail_pop` (
`id` int(11) unsigned NOT NULL auto_increment,
`email` varchar(128) NOT NULL default '',
`pop` varchar(128) NOT NULL default '',
`name` varchar(128) NOT NULL default '',
`pass` varchar(32) NOT NULL default '32',
`timeout` int(10) unsigned NOT NULL default '60',
`port` tinyint(3) unsigned NOT NULL default '110',
`keep` char(1) NOT NULL default 'Y',
PRIMARY KEY (`id`),
KEY `email` (`email`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_pop`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_relay_domains`
--
CREATE TABLE `tmail_relay_domains` (
`id` int(11) unsigned NOT NULL auto_increment,
`domain` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`),
UNIQUE KEY `domain` (`domain`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_relay_domains`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_relocated`
--
CREATE TABLE `tmail_relocated` (
`id` int(11) unsigned NOT NULL auto_increment,
`email` varchar(128) NOT NULL default '',
`destination` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_relocated`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_transport`
--
CREATE TABLE `tmail_transport` (
`id` int(11) unsigned NOT NULL auto_increment,
`domain` varchar(128) NOT NULL default '',
`destination` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`),
UNIQUE KEY `domain` (`domain`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_transport`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_userpersonal`
--
CREATE TABLE `tmail_userpersonal` (
`id` int(11) NOT NULL auto_increment,
`address` varchar(50) default NULL,
`fax` varchar(20) NOT NULL default '',
`telephone` varchar(15) NOT NULL default '',
`sex` int(1) NOT NULL default '0',
`year` int(4) NOT NULL default '0',
`month` int(2) NOT NULL default '0',
`day` int(2) NOT NULL default '0',
`education` varchar(4) NOT NULL default '',
`marital` int(1) NOT NULL default '0',
`occupation` varchar(15) NOT NULL default '',
`companyname` varchar(30) NOT NULL default '',
`province` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=InnoDB AUTO_INCREMENT=43 ;
--
-- 导出表中的数据 `tmail_userpersonal`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_users`
--
CREATE TABLE `tmail_users` (
`id` int(11) unsigned NOT NULL auto_increment,
`userid` tinytext NOT NULL,
`domain` varchar(128) NOT NULL default '',
`email` varchar(128) NOT NULL default '',
`clear` varchar(128) NOT NULL default '',
`crypt` varchar(128) NOT NULL default '',
`realname` tinytext NOT NULL,
`uid` int(11) unsigned NOT NULL default '1003',
`gid` int(11) unsigned NOT NULL default '1003',
`homedir` tinytext NOT NULL,
`maildir` tinytext NOT NULL,
`quota` tinytext NOT NULL,
`file_quota` tinytext NOT NULL,
`access` enum('Y','N') NOT NULL default 'Y',
`postfix` enum('Y','N') NOT NULL default 'Y',
`disablepop3` char(1) NOT NULL default '0',
`disableimap` char(1) NOT NULL default '0',
`disablewebmail` char(1) NOT NULL default '0',
`sharedgroup` varchar(128) NOT NULL default '0',
`smtpaccess` enum('Y','N') NOT NULL default 'Y',
`expire` date NOT NULL default '0000-00-00',
`create_time` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_users`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_virtual`
--
CREATE TABLE `tmail_virtual` (
`id` int(11) unsigned NOT NULL auto_increment,
`email` varchar(128) NOT NULL default '',
`destination` varchar(128) NOT NULL default '',
`group_name` varchar(128) NOT NULL default '',
`domain` varchar(128) NOT NULL default '',
`group` int(1) default NULL,
`alias` int(1) default NULL,
`forward` int(1) default NULL,
`forward_bak` int(1) default NULL,
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_virtual`
--
-- --------------------------------------------------------
--
-- 表的结构 `vpopmail`
--
CREATE TABLE `vpopmail` (
`pw_id` int(5) unsigned NOT NULL auto_increment,
`pw_name` varchar(32) NOT NULL default '',
`pw_domain` varchar(64) NOT NULL default '',
`pw_passwd` varchar(40) NOT NULL default '',
`pw_uid` int(11) default NULL,
`pw_gid` int(11) default NULL,
`pw_gecos` varchar(48) default NULL,
`pw_dir` varchar(255) default NULL,
`pw_shell` varchar(20) default NULL,
`createtime` timestamp(14) NOT NULL,
PRIMARY KEY (`pw_id`),
KEY `pw_name` (`pw_name`,`pw_domain`)
) TYPE=MyISAM PACK_KEYS=1 AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `vpopmail`
注:对于初学者,建议以上操作都在phpmyadmin中操作更加的简便.
建立数据库用户并授以相应的权限
QUOTE:
mail# /usr/local/bin/mysql –u root –p
mysql# use mysql;
mysql# INSERT INTO user (host,user,password) VALUES('localhost','postfix','');
mysql# update user set password=password('postfix') where User='postfix';
重新启动mysql
mail# /usr/local/bin/mysql –u root –p
mysql# use mysql;
mysql# GRANT ALL ON postfix.* TO postfix@localhost IDENTIFIED BY "postfix";
注:这里加用户名和密码都为:postfix。并授权对postfix数据库进行操作
4.9 安装cyrus-sasl-2.1.22
QUOTE:
mail# cd /usr/ports/security/cyrus-sasl2
mail# make WITH_MYSQL=yes WITH_AUTHDAEMON=yes install clean
WITH_AUTHDAEMON=yes参数是为了让sasl支持authdamond的认证方式
WITH_MYSQL=yes参数是为了让sasl支持mysql认证方式
4.10 安装postfix-2.3.3
QUOTE:
mail# cd /usr/ports/mail/postfix
mail# make install clean
以下是我的选择
QUOTE:
Postfix configuration options
Please select desired options:
[ ] NOPCRE DISABLE Perl Compatible Regular Expressions
[ ] SASL Cyrus SASLv1 (Simple Authentication and Security Layer)
[X] SASL2 Cyrus SASLv2 (Simple Authentication and Security Layer)
[ ] SASLKRB If your SASL requires Kerberos select this option
[ ] SASLKRB5 If your SASL requires Kerberos5 select this option
[ ] SASLKRB5MIT If your SASL requires MIT Kerberos5 select this option
[ ] SPF SPF support
[ ] TLS SSL and TLS
[ ] BDB Berkeley DB (select version using WITH_BDB_VER variable)
[X] MySQL MySQL map lookups (choose version with WITH_MYSQL_VER)
[ ] PgSQL PostgreSQL map lookups (choose with DEFAULT_PGSQL_VER)
[ ] OpenLDAP OpenLDAP map lookups (choose ver. with WITH_OPENLDAP_VER)
[ ] CDB CDB map lookups
[ ] NIS NIS map lookups
[X] VDA VDA (Virtual Delivery Agent)
[ ] Test SMTP/LMTP test server and generator
安装过程中会让你回答两个问题,
QUOTE:
===> Installing for postfix-2.2.10_1,1
===> postfix-2.2.10_1,1 depends on shared library: sasl2.2 - found
===> postfix-2.2.10_1,1 depends on shared library: pcre.0 - found
===> postfix-2.2.10_1,1 depends on shared library: mysqlclient.14 - found
Added group "postfix".
Added group "maildrop".
Added user "postfix".
You need user "postfix" added to group "mail".
Would you like me to add it [y]? y
是否把postfix用户加入到mail用户组。回答Y
Installed HTML documentation in /usr/local/share/doc/postfix
Would you like to activate Postfix in /etc/mail/mailer.conf [n]? n
在rc.conf中加入postfix的启动选项
QUOTE:
mail# echo 'postfix_enable="YES"' >> /etc/rc.conf
mail# echo 'sendmail_enable="NO"' >> /etc/rc.conf
mail# echo 'sendmail_submit_enable="NO"' >> /etc/rc.conf
mail# echo 'sendmail_outbound_enable="NO"' >> /etc/rc.conf
mail# echo 'sendmail_msp_queue_enable="NO"' >> /etc/rc.conf
4.11 安装courier-imap-4.1.1
QUOTE:
mail# cd /usr/ports/mail/courier-imap
mail# make install clean
以下是我的选择
QUOTE:
Options for courier-imap 4.1.1,1
[ ] OPENSSL Build with OpenSSL support
[ ] FAM Build in fam support for IDLE command
[ ] TRASHQUOTA Include deleted mails in the quota
[ ] GDBM Use gdbm db instead of system bdb
[ ] IPV6 Build with IPv6 support
[ ] AUTH_LDAP LDAP support
[X] AUTH_MYSQL MySQL support
[ ] AUTH_PGSQL PostgreSQL support
[ ] AUTH_USERDB Userdb support
[ ] AUTH_VCHKPW Vpopmail/vchkpw support
在rc.conf中加入courier的启动选项
QUOTE:
mail# echo 'courier_authdaemond_enable="YES"' >> /etc/rc.conf
mail# echo 'courier_imap_imapd_enable="YES"' >> /etc/rc.conf
mail# echo 'courier_imap_pop3d_enable="YES"' >> /etc/rc.conf
QUOTE:
mail# /usr/local/etc/rc.d/courier-authdaemond start
Starting courier_authdaemond.
注:此时会在/var/run/authdaemond/下产生socket,如果没有下面这一步下面的认证无法通过。
对/var/run/authdaemond目录加执行权限
QUOTE:
mail# chmod +x /var/run/authdaemond
4.12 安装MailScanner-install-4.55.10-3
QUOTE:
mail# cd /usr/ports/mail/mailscanner
mail# make install clean
在安装MailScanner的过程中会出现以下几个选项。以下是我的选择
QUOTE:
Options for MailScanner 4.55.10
[X] SPAMASSASSIN Install SpamAssassin
[X] CLAMAV Install ClamAV
[X] CLAMAVMODULE Install ClamAV Module
[ ] BDC Install BitDefender
Options for sqlite 3.3.6
[ ] TCLWRAPPER TCL wrapper for SQLITE
[ ] THREADS Enable threads support
[ ] DEBUG Enable debugging & verbose explain
[ ] DOCS Building docs (depends on TCL)
Options for Mail-SpamAssassin-3.1.6
[X] AS_ROOT Run spamd as root (recommended)
[X] DOMAINKEYS DomainKeys support
[X] SSL Build with SSL support for spamd/spamc
[ ] MYSQL Add MySQL support
[ ] PGSQL Add PostreSQL support
[X] RAZOR Add Vipul's Razor support
[X] SPF_QUERY Add SPF query support
[X] RELAY_COUNTRY Relay country support
[X] TOOLS Install SpamAssassin tools
Options for clamav 0.88.5
[X] MILTER Compile the milter interface
[X] CURL Support URL downloading
[X] LIBUNRAR Support for external Unrar library
[X] STDERR Print logs to stderr instead of stdout
生成初始配置文件
QUOTE:
mail# make initial-config
根据提示创建MailScanner运行所需的目录
mail# mkdir -p /var/spool/MailScanner/incoming
mail# mkdir /var/spool/MailScanner/quarantine
mail# chown -R postfix:postfix /var/spool/MailScanner
分别在rc.conf中加入clamav、spamassassin和MailScanner的启动参数
QUOTE:
mail# echo 'clamav_clamd_enable="YES"' >> /etc/rc.conf
mail# echo 'clamav_freshclam_enable="YES"' >> /etc/rc.conf
mail# echo 'clamav_milter_enable="YES"' >> /etc/rc.conf
mail# echo 'mailscanner_enable="YES"' >> /etc/rc.conf
mail# echo 'spamd_enable="YES"' >> /etc/rc.conf
4.13 安装maildrop-2.0.2
QUOTE:
mail# cd /usr/ports/mail/maildrop
mail# make install WITH_AUTHLIB=yes
以下是我的选择
QUOTE:
Options for maildrop 2.0.2
[ ] AUTH_LDAP LDAP support
[X] AUTH_MYSQL MySQL support
[ ] AUTH_PGSQL PostgreSQL support
[ ] AUTH_USERDB Userdb support
[ ] AUTH_VCHKPW Vpopmail/vchkpw support
QUOTE:
mail# /usr/local/bin/maildrop -v
maildrop 2.0.2 Copyright 1998-2005 Double Precision, Inc.
Courier Authentication Library extension enabled.
Maildir quota extension enabled.
This program is distributed under the terms of the GNU General Public
License. See COPYING for additional information.
出现上面红色的部分表示maildrop支持Courier。
第五章 软件系统配置
为了支持maildrop,先加入vmail用户
QUOTE:
mail# pw adduser vmail -u 1003 -s /sbin/nologin -d /dev/null
5.1 配置cyrus-sasl
创建/usr/local/lib/sasl2/smtpd.conf
QUOTE:
mail# ee /usr/local/lib/sasl2/smtpd.conf
pwcheck_method: auxprop
auxprop_plugin: sql
mech_list: plain login
sql_engine: mysql
sql_hostnames: localhost
sql_user: tmail
sql_passwd: tmail
sql_database: tmail
sql_select: select clear from tmail_users where email='%u@%r' and smtpaccess='Y'
5.2 配置postfix
QUOTE:
mail# ln -s /usr/local/sbin/sendmail /usr/sbin/sendmail
注:如果/usr/sbin/sendmail存在就删了再做上链接,如果升级内核和升级系统后要重新做这一步。
mail# echo ‘postfix: root’ >> /etc/aliases
mail# /usr/local/bin/newaliases
mail# chown postfix:postfix /etc/opiekeys
mail# ee /usr/local/etc/postfix/main.cf
修改/usr/local/etc/postfix/main.cf,在文件最后加入以下内容
QUOTE:
# new add
myhostname = mail.test.com
smtp_helo_name = $myhostname
local_transport = maildrop
mailbox_transport = maildrop
smtpd_error_sleep_time = 0
smtpd_soft_error_limit = 10
smtpd_hard_error_limit = 20
default_process_limit = 100
#alias_maps = hash:/usr/local/etc/postfix/aliases
#Alias_database = hash:/usr/local/etc/postfix/aliases
mydestination = mysql:/usr/local/etc/postfix/mysql-mydest.cf
virtual_transport_maps = mysql:/usr/local/etc/postfix/mysql-transport.cf
virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql-virtual.cf
#virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql-alias.cf
recipient_bcc_maps = mysql:/usr/local/etc/postfix/mysql-autobbc-in.cf
sender_bcc_maps = mysql:/usr/local/etc/postfix/mysql-autobbc-out.cf
local_recipient_maps = $alias_maps $virtual_mailbox_maps $virtual_maps
virtual_mailbox_base = /mail
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql-virtual-maps.cf
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/usr/local/etc/postfix/mysql-virtual-quota.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
virtual_overquota_bounce = yes
virtual_uid_maps = mysql:/usr/local/etc/postfix/mysql-virtual-uid.cf
virtual_gid_maps = mysql:/usr/local/etc/postfix/mysql-virtual-gid.cf
broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_client_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
check_client_access mysql:/usr/local/etc/postfix/mysql-access.cf,
permit_auth_destination,
reject
smtpd_sender_restrictions =
reject_unknown_sender_domain,
reject_non_fqdn_sender,
check_sender_access mysql:/usr/local/etc/postfix/mysql-access.cf,
permit
smtpd_recipient_restrictions =
permit_mynetworks,
check_client_access mysql:/usr/local/etc/postfix/mysql-access.cf,
permit_sasl_authenticated,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
reject_unauth_pipelining,
reject_unauth_destination,
reject_rbl_client cblless.anti-spam.org.cn,
permit
default_destination_recipient_limit = 1
local_destination_concurrency_limit = 1
maildrop_destination_recipient_limit = 1
message_size_limit = 41943040
smtpd_recipient_limit = 10
bounce_queue_lifetime = 12h
maximal_queue_lifetime = 24h
smtpd_delay_reject = yes
smtpd_helo_required = yes
strict_rfc821_envelopes = yes
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-access.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
query = select access from tmail_access where source = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-alias.cf
host = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_virtual
query = select alias from tmail_users where email = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-autobbc-in.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
query = select autobbc from tmail_autobbc where email = '%s' AND come='1'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-autobbc-out.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
query = select autobbc from tmail_autobbc where email = '%s' AND 'out'='1'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-mydest.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_domaininfo
query = select domain from tmail_domaininfo where domain = '%s' AND yesno = '1'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-transport.cf
host = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_domaininfo
query = select transport from tmail_domaininfo where domain = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-virtual-gid.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_users
query = select gid from tmail_users where email = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-virtual-uid.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_users
query = select uid from tmail_users where email = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-virtual-maps.cf
host = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_users
query = select maildir from tmail_users where email = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-virtual-quota.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_users
query = select quota from tmail_users where email = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-virtual.cf
host = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_virtual
query = select destination from tmail_virtual where email = '%s'
5.3 配置Courier-imap
修改Courier相关设置,/usr/local/etc/courier-imap/imapd:
QUOTE:
IMAP_CAPABILITY="IMAP4rev1 CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA"
修改/usr/local/etc/courier-imap/pop3d
QUOTE:
POP3AUTH="LOGIN CRAM-MD5 CRAM-SHA1"
编辑修改/usr/local/etc/authlib/authmysqlrc
QUOTE:
MYSQL_SERVER localhost
MYSQL_USERNAME tmail
MYSQL_PASSWORD tmail
MYSQL_PORT 0
MYSQL_OPT 0
MYSQL_DATABASE tmail
MYSQL_USER_TABLE tmail_users
MYSQL_CRYPT_PWFIELD crypt
#MYSQL_CLEAR_PWFIELD clear
MYSQL_UID_FIELD uid
MYSQL_GID_FIELD gid
MYSQL_LOGIN_FIELD email
MYSQL_HOME_FIELD homedir
MYSQL_NAME_FIELD realname
MYSQL_MAILDIR_FIELD maildir
MYSQL_QUOTA_FIELD quota
MYSQL_AUXOPTIONS_FIELD CONCAT("disableimap=",disableimap,",disablepop3=",disablepop3,",disablewebmail=",disablewebmail,",sharedgroup=",sharedgroup)
MYSQL_WHERE_CLAUSE access='y'
注:红色部分为一行。这里得用tab键来跳格
编辑/usr/local/etc/authlib/authdaemonrc
QUOTE:
authmodulelist="authmysql"
authmodulelistorig="authmysql"
version="authdaemond.mysql"
daemons=5
authdaemonvar=/var/run/authdaemond
subsystem=mail
DEBUG_LOGIN=0
DEFAULTOPTIONS="wbnodsn=1"
5.4 安装Tmail管理工具
本节主要介绍如何安装Tmail管理工具。
更改httpd.conf中的Group www、User www修改为: Group vmail、User vmail
安装Tmail管理工具来设置第一个域名和用户
上传管理工具到网站目录
后修改config/config.inc.php中的
QUOTE:
define(MAILDIR,"/mail"); //邮件存放目录
define(MISC, ".misc");
define(MODE,0700);
$PageSize = 15; //用户列表和域名列表每一页显示多少行
$host = "localhost"; //数据库主机名
$user = "tmail"; //数据库用户名
$dbname = "tmail"; //数据库名称
$password = "tmail"; //数据库密码
设置好后,加一个域名为test.com,加一个邮件用户为: test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
5.5 登录测试
重新启动相关服务
QUOTE:
mail# /usr/local/etc/rc.d/apache22 restart
mail# /usr/local/etc/rc.d/mysql-server restart
mail# /usr/local/etc/rc.d/courier-authdaemond stop
mail# /usr/local/etc/rc.d/courier-authdaemond start
mail# /usr/local/etc/rc.d/courier-imap-imapd.sh restart
mail# /usr/local/etc/rc.d/courier-imap-pop3d.sh restart
mail# /usr/local/etc/rc.d/postfix reload
生成用户名的base64编码
QUOTE:
mail# perl -MMIME::Base64 -e 'print encode_base64(" test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 ");'
dGVzdEB0ZXN0LmNvbQ==
mail# perl -MMIME::Base64 -e 'print encode_base64("000000");'
MDAwMDAw
测试25发送
QUOTE:
mail# telnet localhost 25
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.test.com.
Escape character is '^]'.
220 mail.test.com ESMTP Postfix
ehlo mail
250-mail.test.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME
auth login
334 VXNlcm5hbWU6
dGVzdEB0ZXN0LmNvbQ==
334 UGFzc3dvcmQ6
MDAwMDAw
235 Authentication successful
MAIL FROM:< test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 >
250 Ok
RCPT TO:< test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 >
250 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
SUBJECT:test
test
.
250 Ok: queued as 47C6CB83E
quit
221 Bye
Connection closed by foreign host.
测试110收邮件
QUOTE:
mail# telnet localhost 110
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.test.com.
Escape character is '^]'.
+OK Hello there.
user test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
+OK Password required.
pass 000000
+OK logged in.
list
+OK POP3 clients that break here, they violate STD53.
1 1563
2 401
.
retr 2
+OK 401 octets follow.
Return-Path: < test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 >
Delivered-To: test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
Received: from mail (localhost.test.com [127.0.0.1])
by mail.test.com (Postfix) with ESMTP id 47C6CB83E
for < test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 >; Tue, 11 Jul 2006 13:47:28 +0800 (CST)
SUBJECT:test
Message-Id: < 20060711054736.47C6CB83E@mail.test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 >
Date: Tue, 11 Jul 2006 13:47:28 +0800 (CST)
From: test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
To: undisclosed-recipients:;
test
.
dele 2
+OK Deleted.
quit
+OK Bye-bye.
Connection closed by foreign host.
5.6 垃圾邮件和病毒邮件过滤设置
设置MailScanner
编辑/usr/local/etc/postfix/main.cf
QUOTE:
mail# ee /usr/local/etc/postfix/main.cf
去掉513行的注释
QUOTE:
header_checks = regexp:/usr/local/etc/postfix/header_checks
编辑/usr/local/etc/postfix/header_checks
QUOTE:
mail# ee /usr/local/etc/postfix/header_checks
新加入
/^Received:/ HOLD
重新加载postfix配置文件
mail# postfix reload
编辑/usr/local/etc/MailScanner/MailScanner.conf,以下是我的配置文件,更改相应的参数为下面的格式。
QUOTE:
%org-name% = thismail.org
%org-long-name% = LCSoft
%web-site% = www.thismail.org
%etc-dir% = /usr/local/etc/MailScanner
%report-dir% = /usr/local/share/MailScanner/reports/en
%rules-dir% = /usr/local/etc/MailScanner/rules
%mcp-dir% = /usr/local/etc/MailScanner/mcp
Run As User = postfix
Run As Group = postfix
Incoming Queue Dir = /var/spool/postfix/hold
Outgoing Queue Dir = /var/spool/postfix/incoming
MTA = postfix
Sendmail = /usr/sbin/sendmail
Monitors for ClamAV Updates = /var/db/clamav/*.cvd
SpamAssassin User State Dir = /var/spool/MailScanner/spamassassin
Custom Functions Dir = /usr/local/lib/MailScanner/MailScanner/CustomFunctions
SpamAssassin Install Prefix = /usr/local/bin
SpamAssassin Site Rules Dir = /usr/local/etc/mail/spamassassin
SpamAssassin Local Rules Dir = /usr/local/share/spamassassin
编辑配置文件/usr/local/etc/MailScanner/mcp/mcp.spam.assassin.prefs.conf
QUOTE:
mail# ee /usr/local/etc/MailScanner/mcp/mcp.spam.assassin.prefs.conf
# MailScanner
# MailScanner users, please see the comments at the bottom of this file.
# MailScanner
#
# SpamAssassin user preferences file.
#
# Format:
#
# required_hits n
# (how many hits are required to tag a mail as spam.)
#
# score SYMBOLIC_TEST_NAME n
# (if this is omitted, 1 is used as a default score.
# Set the score to 0 to ignore the test.)
#
# # starts a comment, whitespace is not significant.
#
###########################################################################
# Whitelist and blacklist addresses are *not* patterns; they're just normal
# strings. one exception is that "*@isp.com" is allowed. They should be in
# lower-case. You can either add multiple addrs on one line,
# whitespace-separated, or you can use multiple lines.
#
# Monty Solomon: he posts from an ISP that has often been the source of spam
# (no fault of his own ;), and sometimes uses Bcc: when mailing.
#
#whitelist_from monty@roscom.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
# Add your blacklist entries in the same format...
#
# blacklist_from friend@public.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
# Mail using languages used in these country codes will not be marked
# as being possibly spam in a foreign language.
#
#ok_locales en
skip_rbl_checks 1
use_bayes 0
use_dcc 0
use_pyzor 0
use_razor1 0
use_razor2 0
decode_attachments 1
编辑配置文件/usr/local/etc/MailScanner/rules/max.message.size.rules
QUOTE:
mail# ee /usr/local/etc/MailScanner/rules/max.message.size.rules
# This is an example ruleset to show how rules can have resulting values
# other than yes and no. This ruleset demonstrates having a numerical result.
# The From: and To: rules show how simple domains can be used to select
# different values for the result of the ruleset.
# Note that the fields of each rule line can be separated by any whitespace,
# any combination of tabs and spaces.
#
# The 2 lines involving domain3.com show that for email to user@domain3.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
# has a limit of 5Mbytes per message, while email to any other user
# @domain3.com has a limit of 500Kbytes per message.
#
To: *@domain1.com 10M
To: *@domain2.com 20M
From: user@domain3.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 5M
From: *@domain3.com 500K
#
# The following line specifies the default result used when none of the
# other rules match. In this example,
# Maximum Message Size = 0
# means that there is no limit to the size of the message.
#
FromOrTo: default 0
编辑配置文件/usr/local/etc/MailScanner/rules/bounce.rules
QUOTE:
mail# ee /usr/local/etc/MailScanner/rules/bounce.rules
# You can use this ruleset to enable the "bounce" Spam Action.
# You must *only* enable this for mail from sites with which you have
# agreed to bounce possible spam. Use it on low-scoring spam only (<10)
# and only to your regular customers for use in the rare case that a
# message is mis-tagged as spam when it shouldn't have been.
# Beware that many sites will automatically delete the bounce messages
# created by using this option unless you have agreed this with them in
# advance.
# This next line gives an example of how you might enable this option for
# a frequent customer of yours.
#From: yourcustomer.com yes
# Under no circumstances should this be changed to "yes".
FromOrTo: default no
重新启动mailscanner.
QUOTE:
mail# /usr/local/etc/rc.d/mailscanner restart
加入中文垃圾邮件规则
QUOTE:
mail# cd /usr/local/share/spamassassin
mail# fetch http://www.ccert.edu.cn/spam/sa/Chinese_rules.cf
注意:由于加入了中文垃圾邮件规则,请把垃圾邮件的评分的分数设置为高一些。
我的设置为8,最高分设置为10,这样可以降低中文邮件的错误识别率。用户可以根据自己的需要来改变这两个分值。
QUOTE:
Required SpamAssassin Score = 8
High SpamAssassin Score = 10
为了避免邮件扫描后主题变成乱码,建议改变以下设置为no
QUOTE:
Virus Modify Subject = no
Filename Modify Subject = no
Content Modify Subject = no
Disarmed Modify Subject = no
Spam Modify Subject = yes
High Scoring Spam Modify Subject = no
扫描垃圾邮件所执行的运作
QUOTE:
Spam Actions = deliver
High Scoring Spam Actions = delete
相关运作参数说明:
QUOTE:
"deliver" -- 邮件正常的转送至原来的收信人。
"delete" -- 删除邮件。
"store" -- 将邮件存放至隔离区。
"bounce" -- 将邮件退给寄信人。
"forward" -- 提供一个 forward 的邮件位址给系统,系统会自动转寄一份。
"striphtml" -- 将内嵌 HTML 的邮件转成 Text,你必需要加入 "deliver",系统才会帮你寄邮件。
允许html邮件通行
QUOTE:
Allow IFrame Tags = yes
Allow Form Tags = yes
Allow Script Tags = yes
Allow WebBugs = disarm
Allow Object Codebase Tags = yes
Convert Dangerous HTML To Text = no
Convert HTML To Text = no
允许本机发送出去的邮件不被MailScanner视为垃圾邮件
QUOTE:
mail# ee /usr/local/etc/MailScanner/rules/spam.whitelist.rules
From: 127.0.0.1 yes
以上规则的说明:以上垃圾邮件的规则是加入了中文垃圾邮件主题和内容的评分规则,所以我设置了一个最低分为8分,最高分为10分的规则,8-10分间的邮件会被打上[spamd]的标识,高于10分的邮件会被自动的删除掉,以上规则允许html邮件通过。
第六章 安装webmail
到开邮件邮件技术论坛
http://www.thismail.org/bbs/thread.php?fid=17
取得最新的webmail
下载后传到服务器上的web目录,后配置php的全局变量为打开
QUOTE:
register_globals = On
并编辑webmail/config/config_inc.php中如下参数
QUOTE:
$CFG_BASEPATH = "/tmp/tmail/temp"; //临时目录,如果不存在,修改完配置文件后再手动创建,并附于相关的权限
// Mysql
define(MYSQL_HOST, 'localhost'); //数据库主机名
define(MYSQL_USER, 'postfix'); //数据库用户名
define(MYSQL_PASS, 'postfix'); //数据库密码
define(MYSQL_DATA, 'postfix'); //数据库名称
$CFG_NETDISK_PATH = "/mail/netdisk"; //文件管理(网络磁盘所在的系统路径)如果不存在,修改完配置文件后再手动创建,并附于相关的权限
$CFG_NETDISK_DEFAULT_QUOTA = 10; //文件管理(网络磁盘)默认大小为10MB,用户可根据自己的需要改变大小
。
QUOTE:
mail# mkdir -p /tmp/tmail/temp
mail# chown -R postfix:postfix /tmp/tmail
mail# mkdir -p /mail/netdisk
mail# chown -R postfix:postfix /mail/netdisk
为了webmail能配合maildrop做中文邮件的过滤。请写/usr/sbin/maildecode文件
QUOTE:
mail# ee /usr/sbin/maildecode
#!/usr/bin/perl
# Convert Base64 Or Quoted-printable TO Text
my $a = $ARGV[0] || '';
#Maybe arg is include Subject
if ($a=~/^Subject/) {
$a = $ARGV[1] || '';
};
if ($a=~/=?[w-]+?B?(.*)?=$/) {
use MIME::Base64;
$a = decode_base64($1);
};
if ($a=~/=?[w-]+?Q?(.*)?=$/) {
use MIME::QuotedPrint;
$a = decode_qp($1);
};
#open(OUTFILE, ">/tmp/list.log");
#print OUTFILE $a;
#close(OUTFILE);
print $a;
exit(0);
并改变相关的权限
QUOTE:
mail# chmod 755 /usr/sbin/maildecode
mail# chown -R vmail:vmail /usr/sbin/maildecode
安装成功后的webmail
附一、常见问题
正在收集中……
附二、MailScanner.conf中文参数说明
http://www.thismail.org/bbs/htm_data/7/0509/533.html
FreeBSD+Postfix+Cyrus-sasl+Courier-imap+Webmail+spamassassin+Clamav+mailscanner +maildrop来架构一个具有多域名,webmail、防病毒、防垃圾邮件、web管理界面的邮件系统。
Jacky, $Revision: 5.1 bate $Date: 2006-10-31
杨廷勇 QQ:187159779
Copyright © 2004、2005、2006
欢迎转载,保留版权和出处[http://www.thismail.org]
系统主要采用MailScanner+clamav+Spamd来对病毒过滤和垃圾邮件过滤。
----------------------------------
新增加对smtpd,imap,pop3,webmail的登录控制
新增加简单的邮件分组
新增邮件监控
加强对垃圾邮件的过滤
增加系统黑名单
-----------------------------------
本文在4.10、5.3、5.4、5.5、6.0、6.1上安装测试通过,采用MailSanner来对邮件过滤和垃圾邮件过滤,配置更容易,并且降低了 系统开消。让系统更加稳定,经过严格病毒邮件测试成功率达到了98%。垃圾邮件过滤基本上达到了95%的成功率。
本人水平有限,如有错误之处请发邮件到scyz2 at 163.com (at = @),本人不对本文档对你的系统造成的损失负任何连带责任。
――――――――――――――――――――――――――――――――――
第一章 FreeBSD 简介
1.1 什么是FreeBSD?
1.2 postfix简介
第二章 操作系统FreeBSD安装
第三章 更新ports
3.1 安装CVSUP
3.2 更新ports树
第四章 软件安装
4.1 安装perl
4.2 安装mysql
4.3 安装apache22
4.4 安装mod_php5
4.5 安装php5的扩展
4.6 安装openssl
4.7 安装phpMyAdmin
4.8 设置数据库
4.9 安装cyrus-sasl2
4.10 安装postfix2
4.11 安装Courier-imap
4.12 安装MailScanner
4.13 安装maildrop
第五章 软件系统配置
5.1 配置cyrus-sasl
5.2 配置postfix
5.3 配置Courier-imap
5.4 安装Tmail管理工具
5.5 登录测试
5.6 垃圾邮件和病毒邮件过滤设置
第六章 安装webmail
附一、常见问题
附二、MailScanner.conf中文参数说明
――――――――――――――――――――――――――――――――――
第一章 FreeBSD 简介
1.1 什么是FreeBSD?
我 想大家都知道 Microsoft Windows 是一套作业系统,FreeBSD 也是一套作业系统。FreeBSD 是一个可以在 Intel 相容个人计算机、DEC Alpha 或 PC98 架构的计算机上执行的 UNIX 作业系统。大家应该听过另一套UNIX的作业系统 Linux,FreeBSD 也是一套免费的作业系统。它可以让我们的个人计算机变成先进的工作站,更稳定的提供你所需的网络服务。
BSD UNIX 系统可以说是网络作业系统的始祖,FreeBSD 是众多 BSD UNIX 分支中的一个,它继承了 BSD 系统的高性能与可靠性。自从1993 年 FreeBSD 推出 1.0-RELEASE 以来,FreeBSD 开发团队便致力于系统的调校,使其发挥绝佳的效能。在 FreeBSD 团队的统筹努力下,使它比起其它免费的 UNIX 作业系统更有结构。在 FreeBSD 上有许多支援的免费软件,这些软件大都已移植收录于 FreeBSD ports 中,使得我们在安装软件时变得十分轻松。FreeBSD 支援 32 位元、64 位元的许多不同平台,具有高效能核心架构、动态函式库共享、绝佳的网络功能,比起其它商用 UNIX 系统毫不逊色。
FreeBSD 作业系统相当容易取得及安装,除了经由传统的光盘安装外,它也可以经由网络安装、MS-DOS 分割区安装等等。当然,我们也可以在计算机中同时安装多种不同的作业系统,例如 Windwos 98 和 FreeBSD 同时并存也是件十分容易的事。
在 FreeBSD 上的应用软件相当的多,也都可以免费取得,由于 FreeBSD 的稳定性高且功能强大,因此许多大型网站都以它为作业平台,其中最知名的就是 YAHOO!。YAHOO! 是一个流量相当大的入口网站,他们选择以 FreeBSD 为作业平台,由此可知 FreeBSD 的优异性。除此之外,在台湾,FreeBSD 普遍被应用于学术网络上,许多大专院校的服务器都是使用 FreeBSD 来提供网络服务。
但是您别以为 FreeBSD 只能用来做为网络服务器,FreeBSD 也可以是一个良好的个人作业系统。事实上,Mac OS X 就是使用 FreeBSD 做为系统核心。大家都知道 Mac OS 是个人计算机上有名的作业系统,它会使用 FreeBSD 做为系统核心,可见 FreeBSD 的质量亦深获 Apple 的肯定。
在宽带网络逐渐普及的台湾,每个人都可以自行架设一台网路服务器,以 FreeBSD 来提供网络服务(如网页、邮件、档案存取等)。值得一提的是 FreeBSD 并不像 MS-Windows 一样每每要求使用者升级计算机才能使用。FreeBSD 对于硬件的要求很低,你可以用一台 Intel 586-133MHz 的旧计算机来安装 FreeBSD,这也算是癈物利用吧。
1.2 为什么要选择FreeBSD?
现在的个人计算机作业系统市场中,是以 MS-Windows 独大,但在网络服务器市场中,UNIX 系统的使用率可不输 MS-Windows 喔。我个人认为 MS-Windows 之所以会有那么多的使用者主要是因为他的使用者介面对初学者而言较容易操作,再加上许多软件的配合及盗版的助长,安装软件只要一直按下一步就完成。使得使 用者即便它的稳定性不高也得乖乖的接受。
其实初学者没有试过其它的作业系统才会有这样的误解,因为一直用 MS-Windows 才会认为当机是无可避免的事,当机对于 MS-Windows 或许是无可避免,但在其它 UNIX 系统中可不常见。在 UNIX 系列的作业系统中,也可以有像 MS-Windows 的图形介面,几乎所有在 MS-Windows 上可以做的事,在 FreeBSD 上都可以做得到,唯一的不同点是你不必花钱去取得你想要的功能。包括排版、图形处理、MP3、多媒体、网络芳邻等等都可以在 FreeBSD 中做到。
重 点是,对于一台网路服务器而言,图形介面会占用系统资源,而且必须安装一堆有的没的软件。笔者偏好乾干脆净净的系统,而 FreeBSD 正好具有这个优点。不过这并不代表您不能使用图形介面,您还是可以安装类似 Windows 的图形介面,让您使用它来做为平日使用的个人计算机。此外,FreeBSD 把自己定位为最佳的网络服务器,它承袭了 BSD 优良的网络血统,在提供服务时能有绝佳的效能表现。而且,它是免费的。
然而,有这么多的免费 UNIX 作业系统中,为什么要选择 FreeBSD 而不使用其它作业系统(如 Linux )呢?在网络上在讨论这个问题时,每每会引发每个作业系统使用者的激辩。对于要使用何种作业系统,除了使用者偏好外,还有许多指标可以提供我们参考。
FreeBSD 是一套完整的作业系统
我 们平常所说的 Linux 指的是它的核心 (Kernel),Kernel 只是整个作业系统的一部份,除了 Kernel 外,我们还需要一些基本的指令、系统及目录架构、图形介面等。Linux 的 Distribution 就是各个不同的组织或公司自行收集一些系统必备的程序,制作出一个作业系统。Linux 系统有很多的 Distribution,如 Redhat、SUSE、Debian 等。因为每个 Distribution 都有自己的程序或架构,所以每个 Distribution 都长的不一样。如果您使用的是 Linux,在 Linux 三十多种 Distribution 中,每一种之间都有些许差异,在设定上用法都不同。
而 FreeBSD 指的不只是核心而已,它是一套完整的作业系统。从系统核心到使用者介面、各种常用指令都是由 FreeBSD 总部所统一推出。因此,FreeBSD 每一个版本之间有着共同的架构,不同软件之间的整合搭配性较为完整,不管是设定、学习都很容易。
由核心团队统筹开发
FreeBSD 整个系统都是由总部的核心团队所维护,所以整个系统都搭配得很好。而 Linux 只有 Kernel 由 Linus Torvlds 所维护。因为 FreeBSD 整个系统都是由总部所开发,不只系统整体较有规划,各个程序之间搭配起来也比较紧密。如果您使用 Linux,由于 Kernel 和其它的程序是由不同组织所维护,在升级时,比较麻烦。而 FreeBSD 就简单多了,每次一有新的版本,一定是整个系统一起升级。
我 觉得 FreeBSD 总部统筹发展 FreeBSD 是一件很棒的事,所有的问题回报都可以统筹管理并予以更新。FreeBSD 推陈出新的速度相当快,每一次安装都确保这个版本不会有上一版的缺失。所以在 Linux 或 MS-Windows 中「新版本不一定是最好」的定律并不适用于 FreeBSD。但这并不意味着你必须不断重新安装系统,FreeBSD 总部随时会发布最新更新的档案提供下载,而且如果使用 CVSUP 就可以和更新版的 FreeBSD 保持同步更新。
完整的使用手册
FreeBSD 的使用手册非常完整,而且会随着软件一起更新。每次一有新的版本推出,FreeBSD 的文件也会做相对的更新。在 FreeBSD 的官方网站上,我们可以轻松的取得这些高质量的手册及文件。
软件安装的便利性
FreeBSD 支援的软件相当多,它将常用的软件分类管理,当需要安装软件时,使用者不必自行到网络上找寻,只要到 FreeBSD ports 目录中下个指令就安装完成。
条理分明的系统架构
FreeBSD 目录结构非常有组织,结构严谨,对于系统管理者而言比较不会紊乱。FreeBSD 将系统预设的目录和管理者自行安装的程序目录划分得十分清楚,管理者在进行升级、维护时可以一目了然。
完美的程序开发平台
安 装完 FreeBSD 后,系统所有程序原始码非常有条理的存放在特定目录中。对于想要进行程序修改的管理者而言,不必四处寻找某支程序原始码。笔者在 FreeBSD 及 Linux 上开发程序多年,我觉得 FreeBSD 原始码及系统架构十分有组织,是程序开发最好的平台。
而且 FreeBSD 的版权较为宽松,对于想要以 FreeBSD 为基础开发产品的公司而言,它可以保护您的修改不会被其它对手抄袭。
1.3 为什么不选择FreeBSD?
许 多企业选择使用目前大多数人使用的 MS windows 做为一般作业用个人计算机的作业系统当然无可厚非。但以 MS windows 做服务器,除了资讯人员的偏好外(或许因为不会使用其它系统吧),还有部份原因是为了在企业内资讯人员技术不足时,能求助于系统供应商。而 FreeBSD 是免费的,企业也害怕有状况时无人可以支援,这对企业是很重要的一项因素。
然而,FreeBSD 的使用人数其实很多,而且使用者都十分热心,在台湾的 BBS 讨论区上,许多问题都可以获得解决。这当然还不够,现在有很多顾问公司提供 FreeBSD 的顾问服务,可以提供企业这方面的服务。虽然说 FreeBSD 的系统稳定,但在应用上如果没有资讯人员的支援,很难能在企业中存活。但正因市场上了解 FreeBSD 的人较少,若我们能主动学习,必能为自己创造更多价值。
FreeBSD 目前支援的平台不多,若您不是使用 X86 的系统,而是使用 ARM、MIPS 等平台,您就必须寻求其它的解决方案。
1.2 postfix简介
Postfix 是一个非常优秀的MTA,她素以高效、安全的特点而著称。Postfix是作者在UNIX上所见过的MTA中在反垃圾邮件(Anti-Spam或Anti -UCE)方面做得最好的一个,甚至有很多公司在Postfix代码的基础上进行二次开发而推出反垃圾邮件网关产品。MTA的反垃圾邮件功能,实际上就是 在MTA处理过程中对会话进行过滤。这个过滤不但过滤了发往自身的垃圾邮件,而且还防止了自身被恶意利用发送垃圾邮件。Postfix实现了目前所有主要 的MTA过滤技术。postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件。和Sendmail相比Postfix更快、更容易管理、更灵活、更安全,同时 还与sendmail保持足够的兼容性。
第二章 操作系统FreeBSD安装
FreeBSD6.1系统安装手册
官方安装手册:
QUOTE:
http://www.freebsd.org/doc/zh_CN.GB2312/books/handbook/install.html
注意在系统安装过程中,分区方面一定要注意,最好是一个独立的mail分区来存放用户的邮件数据,因为默认的VAR分区读写频繁,数据存放在这样的分区中是很危险的;在安装系统的过程中,建议最小化安装加ports。
第三章 更新ports
3.1 安装CVSUP
QUOTE:
mail# cd /usr/ports/net/cvsup-without-gui
mail# make install clean
安装过程中由于依赖的关系,它会自动安装gettext,会出现下面的选项。
以下是我的选择。
QUOTE:
Options for gettext 0.14.5_2
[X] EXAMPLES install example files
[X] HTMLMAN install man pages in HTML format
3.2 更新ports树
(更新日期2006-07-09)
编辑ports-supfile
QUOTE:
mail# ee /usr/share/examples/cvsup/ports-supfile
QUOTE:
第51行
*default host=CHANGE_THIS.FreeBSD.org
改为:
*default host=cvsup2.freebsdchina.org
QUOTE:
mail# /usr/local/bin/cvsup -g -L 2 /usr/share/examples/cvsup/ports-supfile
Parsing supfile "ports"
Connecting to Cvsup2.FreeBSD.org.cn
Connected to Cvsup2.FreeBSD.org.cn
Server software version: SNAP_16_1h
Negotiating file attribute support
Exchanging collection information
Establishing multiplexed-mode data connection
Running
Updating collection ports-all/cvs
……
……
Shutting down connection to server
Finished successfully
出现上面的提示,表示更新成功。
第四章 软件安装
4.1 安装perl-5.8.8
QUOTE:
mail# cd /usr/ports/lang/perl5.8
mail# make install clean
4.2 安装mysql-5.0.27
4.2 安装mysql
QUOTE:
mail# cd /usr/ports/databases/mysql50-server
编辑Makefile
mail# ee Makefile
在CONFIGURE_ARGS这段话的
--enable-thread-safe-client前面加上三句参数
BUILD_OPTIMIZED=yes \
BUILD_STATIC=yes \
PTHREAD_LIBS=-lkse \
mail# make WITH_CHARSET=gb2312 WITH_XCHARSET=all BUILD_OPTIMIZED=yes BUILD_STATIC=yes install clean
在rc.conf中加入Mysql的启动参数
QUOTE:
mail# echo 'mysql_enable="YES"' >> /etc/rc.conf
启动mysql
QUOTE:
mail# /usr/local/etc/rc.d/mysql-server start
Starting mysql.
查看mysql是否启动成功
QUOTE:
mail# sockstat -4 | grep 3306
mysql mysqld 1510 3 tcp4 *:3306 *:*
出现上面的端口表示mysql启动成功
4.3 安装httpd-2.2.3
QUOTE:
mail# cd /usr/ports/www/apache22
mail# make install clean
在rc.conf中加入apache的启动参数
QUOTE:
mail# echo 'apache_enable="YES"' >> /etc/rc.conf
启动apache
QUOTE:
mail# /usr/local/etc/rc.d/apache22 start
Starting apache.
查看apache是否启动成功
QUOTE:
mail# sockstat -4 | grep 80
www httpd 10679 16 tcp4 *:80 *:*
www httpd 10678 16 tcp4 *:80 *:*
www httpd 10677 16 tcp4 *:80 *:*
www httpd 10676 16 tcp4 *:80 *:*
www httpd 10675 16 tcp4 *:80 *:*
root httpd 10674 16 tcp4 *:80 *:*
出现上面的80端口表示apache启动成功
4.4 安装php-5.1.6
QUOTE:
mail# cd /usr/ports/lang/php5
mail# make install clean
以下是我的选择
QUOTE:
Options for php5 5.1.6_3
[ ] CLI Build CLI version
[ ] CGI Build CGI version
[X] APACHE Build Apache module
[ ] DEBUG Enable debug
[ ] SUHOSIN Enable Suhosin protection system
[X] MULTIBYTE Enable zend multibyte support
[ ] IPV6 Enable ipv6 support
[ ] REDIRECT Enable force-cgi-redirect support (CGI only)
[ ] DISCARD Enable discard-path support (CGI only)
[ ] FASTCGI Enable fastcgi support (CGI only)
[ ] PATHINFO Enable path-info-check support (CGI only)
QUOTE:
mail# echo 'AddType application/x-httpd-php .php' >> /usr/local/etc/apache/httpd.conf
mail# echo 'AddType application/x-httpd-php-source .phps' >> /usr/local/etc/apache/httpd.conf
编辑httpd.conf加入index.php
QUOTE:
DirectoryIndex index.html index.html.var index.php
#注:在DirectoryIndex这里加入index.php,是为了让apache支持首页为index.php的首页文件
4.5 安装php5的扩展
QUOTE:
mail# cd /usr/ports/lang/php5-extensions
mail# make install clean
QUOTE:
Options for php5-extensions 1.0
[X] BCMATH bc style precision math functions
[X] BZ2 bzip2 library support
[X] CALENDAR calendar conversion support
[X] CTYPE ctype functions
[X] CURL CURL support
[ ] DBA dba support
[ ] DBASE dBase library support
[X] DOM DOM support
[ ] EXIF EXIF support
[ ] FILEINFO fileinfo support
[ ] FILEPRO filePro support
[ ] FRIBIDI FriBidi support
[X] FTP FTP support
[X] GD GD library support
[ ] GETTEXT gettext library support
[ ] GMP GNU MP support
[X] HASH HASH Message Digest Framework
[X] ICONV iconv support
[ ] IMAGICK ImageMagick support
[X] IMAP IMAP support
[ ] INTERBASE Interbase 6 database support (Firebird)
[ ] LDAP OpenLDAP support
[ ] MBSTRING multibyte string support
[X] MCRYPT Encryption support
[X] MHASH Crypto-hashing support
[ ] MING ming shockwave flash support
[ ] MSSQL MS-SQL database support
[X] MYSQL MySQL database support
[ ] MYSQLI MySQLi database support
[ ] NCURSES ncurses support (CLI only)
[ ] ODBC unixODBC support
[ ] OPENSSL OpenSSL support
[ ] PANDA panda support
[ ] PCNTL pcntl support (CLI only)
[X] PCRE Perl Compatible Regular Expression support
[ ] PDF PDFlib support (implies GD)
[X] PDO PHP Data Objects Interface (PDO)
[ ] PGSQL PostgreSQL database support
[X] POSIX POSIX-like functions
[ ] PSPELL pspell support
[ ] READLINE readline support (CLI only)
[ ] RECODE recode support
[X] SESSION session support
[ ] SHMOP shmop support
[X] SIMPLEXML simplexml support
[ ] SNMP SNMP support
[ ] SOAP SOAP support
[ ] SOCKETS sockets support
[X] SQLITE sqlite support
[ ] SYBASE_CT Sybase database support
[ ] SYSVMSG System V message support
[ ] SYSVSEM System V semaphore support
[ ] SYSVSHM System V shared memory support
[ ] TIDY TIDY support
[X] TOKENIZER tokenizer support
[ ] WDDX WDDX support (implies XML)
[X] XML XML support
[X] XMLREADER XMLReader support
[ ] XMLRPC XMLRPC-EPI support
[X] XMLWRITER XMLWriter support
[ ] XSL XSL support (Implies DOM)
[ ] YAZ YAZ support (ANSI/NISO Z39.50)
[X] ZIP ZIP support
[X] ZLIB ZLIB support
重启apache安装完成。
4.6 安装openssl-0.9.7l
QUOTE:
mail# cd /usr/ports/security/openssl
mail# make install clean
4.7 安装phpMyAdmin-2.9.0.2
QUOTE:
mail# cd /usr/ports/databases/phpmyadmin
mail# make fetch
注:(在这里建议直接下载后复制安装)
QUOTE:
mail# cd /usr/ports/distfiles
mail# tar –zxvf phpMyAdmin-2.9.0.2.tar.gz
mail# mv /usr/local/www/phpMyAdmin-2.9.0.2 /usr/local/www/apache22/data/dbadmin
修改/usr/local/www/apache22/data/dbadmin/config.inc.php
QUOTE:
$cfg['PmaAbsoluteUri'] = 'http://192.168.0.2/dbadmin/';
$cfg['Servers'][$i]['auth_type'] = 'http'; // Authentication method (config, http or cookie based)?
注:指定phpmyadmin的认证方式为http方式。
在浏览器输入http://192.168. 0.2/dbadmin/,首次进行登入的用户名为root密码为空,登入后可以修改你的密码。
4.8 设置数据库
建立postfix数据库(注意:数据库名称为postfix):
QUOTE:
mail# /usr/local/bin/mysql –u root –p
mysql# CREATE DATABASE `postfix` ;
mysql# use postfix;
把下面的sql语句导入到postfix数据库中去:
QUOTE:
-- phpMyAdmin SQL Dump
-- version 2.9.0.2
-- http://www.phpmyadmin.net
--
-- 主机: localhost:3306
-- 生成日期: 2006 年 10 月 30 日 22:17
-- 服务器版本: 4.0.26
-- PHP 版本: 5.1.6
--
-- 数据库: `tmail`
--
-- --------------------------------------------------------
--
-- 表的结构 `address`
--
CREATE TABLE `address` (
`id` int(11) unsigned NOT NULL auto_increment,
`pw_id` int(5) NOT NULL default '0',
`name` varchar(64) NOT NULL default '',
`email` varchar(128) NOT NULL default '',
UNIQUE KEY `id` (`id`),
KEY `pw_id` (`pw_id`)
) TYPE=MyISAM PACK_KEYS=1 AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `address`
--
-- --------------------------------------------------------
--
-- 表的结构 `admin`
--
CREATE TABLE `admin` (
`id` int(10) unsigned NOT NULL auto_increment,
`site_id` int(10) unsigned NOT NULL default '0',
`domain` varchar(128) NOT NULL default '',
`quota` smallint(5) unsigned NOT NULL default '0',
`total` smallint(5) unsigned NOT NULL default '0',
`createtime` timestamp(14) NOT NULL,
`login` char(1) NOT NULL default '',
`cur_total` smallint(5) NOT NULL default '0',
`cur_quota` smallint(5) NOT NULL default '0',
`gid` varchar(11) NOT NULL default '',
`expiration_time` timestamp(14) NOT NULL default '00000000000000',
`flag` int(10) unsigned NOT NULL default '0',
`maxmsg` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`id`),
UNIQUE KEY `domain` (`domain`)
) TYPE=MyISAM PACK_KEYS=1 AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `admin`
--
-- --------------------------------------------------------
--
-- 表的结构 `card`
--
CREATE TABLE `card` (
`id` int(5) unsigned NOT NULL auto_increment,
`pw_id` int(5) unsigned NOT NULL default '0',
`LinkMan` varchar(64) NOT NULL default '',
`CompanyName` varchar(100) NOT NULL default '',
`Address` varchar(255) NOT NULL default '',
`Position` varchar(32) NOT NULL default '',
`PhoneNumber` varchar(16) NOT NULL default '',
`Mobile` varchar(12) NOT NULL default '',
`Email` varchar(128) NOT NULL default '',
`Partaker` varchar(32) NOT NULL default '',
`Memo` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=27 ;
--
-- 导出表中的数据 `card`
--
-- --------------------------------------------------------
--
-- 表的结构 `lastauth`
--
CREATE TABLE `lastauth` (
`user` char(32) NOT NULL default '',
`domain` char(64) NOT NULL default '',
`remote_ip` char(18) NOT NULL default '',
`timestamp` bigint(20) NOT NULL default '0',
PRIMARY KEY (`user`,`domain`)
) TYPE=MyISAM;
--
-- 导出表中的数据 `lastauth`
--
-- --------------------------------------------------------
--
-- 表的结构 `logs`
--
CREATE TABLE `logs` (
`pw_id` int(5) default '0',
`ip` varchar(15) NOT NULL default '',
`action` varchar(15) NOT NULL default '',
`time` datetime default NULL,
`content` varchar(64) NOT NULL default '',
`email` varchar(128) NOT NULL default ''
) TYPE=MyISAM;
--
-- 导出表中的数据 `logs`
--
-- --------------------------------------------------------
--
-- 表的结构 `message`
--
CREATE TABLE `message` (
`id` int(5) unsigned NOT NULL auto_increment,
`title` varchar(255) NOT NULL default '',
`body` text NOT NULL,
`createtime` datetime NOT NULL default '0000-00-00 00:00:00',
`updatetime` datetime NOT NULL default '0000-00-00 00:00:00',
`pw_domain` varchar(64) NOT NULL default '',
UNIQUE KEY `id` (`id`)
) TYPE=MyISAM AUTO_INCREMENT=2 ;
--
-- 导出表中的数据 `message`
--
-- --------------------------------------------------------
--
-- 表的结构 `personal`
--
CREATE TABLE `personal` (
`id` int(11) unsigned NOT NULL auto_increment,
`pw_id` int(5) NOT NULL default '0',
`truename` varchar(10) NOT NULL default '',
`fax` varchar(20) NOT NULL default '',
`telephone` varchar(15) NOT NULL default '',
`sex` int(1) NOT NULL default '0',
`year` int(4) NOT NULL default '0',
`MONTH` int(2) NOT NULL default '0',
`DAY` int(2) NOT NULL default '0',
`education` varchar(4) NOT NULL default '',
`marital` int(1) NOT NULL default '0',
`occupation` varchar(15) NOT NULL default '',
`companyname` varchar(30) NOT NULL default '',
`province` varchar(6) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM PACK_KEYS=1 AUTO_INCREMENT=12 ;
--
-- 导出表中的数据 `personal`
--
-- --------------------------------------------------------
--
-- 表的结构 `scheduler`
--
CREATE TABLE `scheduler` (
`id` int(11) unsigned NOT NULL auto_increment,
`begin_time` int(11) unsigned default NULL,
`end_time` int(11) unsigned default NULL,
`title` varchar(255) NOT NULL default '',
`body` varchar(255) NOT NULL default '',
`pw_id` int(11) unsigned NOT NULL default '0',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `scheduler`
--
-- --------------------------------------------------------
--
-- 表的结构 `stow`
--
CREATE TABLE `stow` (
`id` int(5) unsigned NOT NULL auto_increment,
`pw_id` int(5) unsigned NOT NULL default '0',
`Name` varchar(128) NOT NULL default '',
`http` varchar(255) NOT NULL default 'http://',
`memo` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `stow`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_access`
--
CREATE TABLE `tmail_access` (
`id` int(11) unsigned NOT NULL auto_increment,
`ctime` int(11) unsigned default NULL,
`source` varchar(128) NOT NULL default '',
`access` varchar(16) NOT NULL default '',
`type` char(1) NOT NULL default 'S',
PRIMARY KEY (`id`),
KEY `source` (`source`,`type`,`access`,`ctime`)
) TYPE=MyISAM AUTO_INCREMENT=65 ;
--
-- 导出表中的数据 `tmail_access`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_alias`
--
CREATE TABLE `tmail_alias` (
`id` int(11) unsigned NOT NULL auto_increment,
`alias` varchar(128) NOT NULL default '',
`destination` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_alias`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_autobbc`
--
CREATE TABLE `tmail_autobbc` (
`id` int(9) NOT NULL auto_increment,
`realname` varchar(128) default NULL,
`email` varchar(128) NOT NULL default '',
`autobbc` varchar(128) NOT NULL default '',
`come` int(1) default NULL,
`out` int(1) default NULL,
`domain` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_autobbc`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_company`
--
CREATE TABLE `tmail_company` (
`id` int(6) NOT NULL auto_increment,
`domain` varchar(25) NOT NULL default '',
`name` varchar(50) NOT NULL default '',
`linkman` varchar(50) NOT NULL default '',
`tel` varchar(15) NOT NULL default '',
`Address` varchar(50) NOT NULL default '',
`zip` varchar(6) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_company`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_domaininfo`
--
CREATE TABLE `tmail_domaininfo` (
`id` tinyint(11) NOT NULL auto_increment,
`domain` varchar(25) NOT NULL default '',
`transport` varchar(128) NOT NULL default '',
`alias` varchar(50) default NULL,
`passwd` varchar(35) NOT NULL default '',
`clean` text NOT NULL,
`admin` tinytext NOT NULL,
`yesno` tinytext NOT NULL,
`usernum` text NOT NULL,
`quota` text NOT NULL,
`filequota` text NOT NULL,
`expire` date NOT NULL default '0000-00-00',
`create_time` datetime default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `domain` (`domain`),
KEY `domain_id` (`id`)
) TYPE=MyISAM PACK_KEYS=0 COMMENT='domain information' AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_domaininfo`
--
INSERT INTO `tmail_domaininfo` (`id`, `domain`, `transport`, `alias`, `passwd`, `clean`, `admin`, `yesno`, `usernum`, `quota`, `filequota`, `expire`, `create_time`) VALUES
(1, 'admin', 'maildrop', NULL, '$1$t5h6XOby$UP3HJpdrozxEsRlcLF6tI0', 'hing4585', '0', '1', '0', '0', '0', '0000-00-00', '2006-10-06 16:44:13');
-- --------------------------------------------------------
--
-- 表的结构 `tmail_group_name`
--
CREATE TABLE `tmail_group_name` (
`id` int(9) NOT NULL auto_increment,
`group_name` varchar(128) NOT NULL default '',
`domain` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_group_name`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_monitor`
--
CREATE TABLE `tmail_monitor` (
`id` int(11) unsigned NOT NULL auto_increment,
`email` varchar(128) NOT NULL default '',
`cc` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`),
KEY `email` (`email`,`cc`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_monitor`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_pop`
--
CREATE TABLE `tmail_pop` (
`id` int(11) unsigned NOT NULL auto_increment,
`email` varchar(128) NOT NULL default '',
`pop` varchar(128) NOT NULL default '',
`name` varchar(128) NOT NULL default '',
`pass` varchar(32) NOT NULL default '32',
`timeout` int(10) unsigned NOT NULL default '60',
`port` tinyint(3) unsigned NOT NULL default '110',
`keep` char(1) NOT NULL default 'Y',
PRIMARY KEY (`id`),
KEY `email` (`email`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_pop`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_relay_domains`
--
CREATE TABLE `tmail_relay_domains` (
`id` int(11) unsigned NOT NULL auto_increment,
`domain` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`),
UNIQUE KEY `domain` (`domain`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_relay_domains`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_relocated`
--
CREATE TABLE `tmail_relocated` (
`id` int(11) unsigned NOT NULL auto_increment,
`email` varchar(128) NOT NULL default '',
`destination` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_relocated`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_transport`
--
CREATE TABLE `tmail_transport` (
`id` int(11) unsigned NOT NULL auto_increment,
`domain` varchar(128) NOT NULL default '',
`destination` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`),
UNIQUE KEY `domain` (`domain`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_transport`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_userpersonal`
--
CREATE TABLE `tmail_userpersonal` (
`id` int(11) NOT NULL auto_increment,
`address` varchar(50) default NULL,
`fax` varchar(20) NOT NULL default '',
`telephone` varchar(15) NOT NULL default '',
`sex` int(1) NOT NULL default '0',
`year` int(4) NOT NULL default '0',
`month` int(2) NOT NULL default '0',
`day` int(2) NOT NULL default '0',
`education` varchar(4) NOT NULL default '',
`marital` int(1) NOT NULL default '0',
`occupation` varchar(15) NOT NULL default '',
`companyname` varchar(30) NOT NULL default '',
`province` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=InnoDB AUTO_INCREMENT=43 ;
--
-- 导出表中的数据 `tmail_userpersonal`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_users`
--
CREATE TABLE `tmail_users` (
`id` int(11) unsigned NOT NULL auto_increment,
`userid` tinytext NOT NULL,
`domain` varchar(128) NOT NULL default '',
`email` varchar(128) NOT NULL default '',
`clear` varchar(128) NOT NULL default '',
`crypt` varchar(128) NOT NULL default '',
`realname` tinytext NOT NULL,
`uid` int(11) unsigned NOT NULL default '1003',
`gid` int(11) unsigned NOT NULL default '1003',
`homedir` tinytext NOT NULL,
`maildir` tinytext NOT NULL,
`quota` tinytext NOT NULL,
`file_quota` tinytext NOT NULL,
`access` enum('Y','N') NOT NULL default 'Y',
`postfix` enum('Y','N') NOT NULL default 'Y',
`disablepop3` char(1) NOT NULL default '0',
`disableimap` char(1) NOT NULL default '0',
`disablewebmail` char(1) NOT NULL default '0',
`sharedgroup` varchar(128) NOT NULL default '0',
`smtpaccess` enum('Y','N') NOT NULL default 'Y',
`expire` date NOT NULL default '0000-00-00',
`create_time` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_users`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_virtual`
--
CREATE TABLE `tmail_virtual` (
`id` int(11) unsigned NOT NULL auto_increment,
`email` varchar(128) NOT NULL default '',
`destination` varchar(128) NOT NULL default '',
`group_name` varchar(128) NOT NULL default '',
`domain` varchar(128) NOT NULL default '',
`group` int(1) default NULL,
`alias` int(1) default NULL,
`forward` int(1) default NULL,
`forward_bak` int(1) default NULL,
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_virtual`
--
-- --------------------------------------------------------
--
-- 表的结构 `vpopmail`
--
CREATE TABLE `vpopmail` (
`pw_id` int(5) unsigned NOT NULL auto_increment,
`pw_name` varchar(32) NOT NULL default '',
`pw_domain` varchar(64) NOT NULL default '',
`pw_passwd` varchar(40) NOT NULL default '',
`pw_uid` int(11) default NULL,
`pw_gid` int(11) default NULL,
`pw_gecos` varchar(48) default NULL,
`pw_dir` varchar(255) default NULL,
`pw_shell` varchar(20) default NULL,
`createtime` timestamp(14) NOT NULL,
PRIMARY KEY (`pw_id`),
KEY `pw_name` (`pw_name`,`pw_domain`)
) TYPE=MyISAM PACK_KEYS=1 AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `vpopmail`
注:对于初学者,建议以上操作都在phpmyadmin中操作更加的简便.
建立数据库用户并授以相应的权限
QUOTE:
mail# /usr/local/bin/mysql –u root –p
mysql# use mysql;
mysql# INSERT INTO user (host,user,password) VALUES('localhost','postfix','');
mysql# update user set password=password('postfix') where User='postfix';
重新启动mysql
mail# /usr/local/bin/mysql –u root –p
mysql# use mysql;
mysql# GRANT ALL ON postfix.* TO postfix@localhost IDENTIFIED BY "postfix";
注:这里加用户名和密码都为:postfix。并授权对postfix数据库进行操作
4.9 安装cyrus-sasl-2.1.22
QUOTE:
mail# cd /usr/ports/security/cyrus-sasl2
mail# make WITH_MYSQL=yes WITH_AUTHDAEMON=yes install clean
WITH_AUTHDAEMON=yes参数是为了让sasl支持authdamond的认证方式
WITH_MYSQL=yes参数是为了让sasl支持mysql认证方式
4.10 安装postfix-2.3.3
QUOTE:
mail# cd /usr/ports/mail/postfix
mail# make install clean
以下是我的选择
QUOTE:
Postfix configuration options
Please select desired options:
[ ] NOPCRE DISABLE Perl Compatible Regular Expressions
[ ] SASL Cyrus SASLv1 (Simple Authentication and Security Layer)
[X] SASL2 Cyrus SASLv2 (Simple Authentication and Security Layer)
[ ] SASLKRB If your SASL requires Kerberos select this option
[ ] SASLKRB5 If your SASL requires Kerberos5 select this option
[ ] SASLKRB5MIT If your SASL requires MIT Kerberos5 select this option
[ ] SPF SPF support
[ ] TLS SSL and TLS
[ ] BDB Berkeley DB (select version using WITH_BDB_VER variable)
[X] MySQL MySQL map lookups (choose version with WITH_MYSQL_VER)
[ ] PgSQL PostgreSQL map lookups (choose with DEFAULT_PGSQL_VER)
[ ] OpenLDAP OpenLDAP map lookups (choose ver. with WITH_OPENLDAP_VER)
[ ] CDB CDB map lookups
[ ] NIS NIS map lookups
[X] VDA VDA (Virtual Delivery Agent)
[ ] Test SMTP/LMTP test server and generator
安装过程中会让你回答两个问题,
QUOTE:
===> Installing for postfix-2.2.10_1,1
===> postfix-2.2.10_1,1 depends on shared library: sasl2.2 - found
===> postfix-2.2.10_1,1 depends on shared library: pcre.0 - found
===> postfix-2.2.10_1,1 depends on shared library: mysqlclient.14 - found
Added group "postfix".
Added group "maildrop".
Added user "postfix".
You need user "postfix" added to group "mail".
Would you like me to add it [y]? y
是否把postfix用户加入到mail用户组。回答Y
Installed HTML documentation in /usr/local/share/doc/postfix
Would you like to activate Postfix in /etc/mail/mailer.conf [n]? n
在rc.conf中加入postfix的启动选项
QUOTE:
mail# echo 'postfix_enable="YES"' >> /etc/rc.conf
mail# echo 'sendmail_enable="NO"' >> /etc/rc.conf
mail# echo 'sendmail_submit_enable="NO"' >> /etc/rc.conf
mail# echo 'sendmail_outbound_enable="NO"' >> /etc/rc.conf
mail# echo 'sendmail_msp_queue_enable="NO"' >> /etc/rc.conf
4.11 安装courier-imap-4.1.1
QUOTE:
mail# cd /usr/ports/mail/courier-imap
mail# make install clean
以下是我的选择
QUOTE:
Options for courier-imap 4.1.1,1
[ ] OPENSSL Build with OpenSSL support
[ ] FAM Build in fam support for IDLE command
[ ] TRASHQUOTA Include deleted mails in the quota
[ ] GDBM Use gdbm db instead of system bdb
[ ] IPV6 Build with IPv6 support
[ ] AUTH_LDAP LDAP support
[X] AUTH_MYSQL MySQL support
[ ] AUTH_PGSQL PostgreSQL support
[ ] AUTH_USERDB Userdb support
[ ] AUTH_VCHKPW Vpopmail/vchkpw support
在rc.conf中加入courier的启动选项
QUOTE:
mail# echo 'courier_authdaemond_enable="YES"' >> /etc/rc.conf
mail# echo 'courier_imap_imapd_enable="YES"' >> /etc/rc.conf
mail# echo 'courier_imap_pop3d_enable="YES"' >> /etc/rc.conf
QUOTE:
mail# /usr/local/etc/rc.d/courier-authdaemond start
Starting courier_authdaemond.
注:此时会在/var/run/authdaemond/下产生socket,如果没有下面这一步下面的认证无法通过。
对/var/run/authdaemond目录加执行权限
QUOTE:
mail# chmod +x /var/run/authdaemond
4.12 安装MailScanner-install-4.55.10-3
QUOTE:
mail# cd /usr/ports/mail/mailscanner
mail# make install clean
在安装MailScanner的过程中会出现以下几个选项。以下是我的选择
QUOTE:
Options for MailScanner 4.55.10
[X] SPAMASSASSIN Install SpamAssassin
[X] CLAMAV Install ClamAV
[X] CLAMAVMODULE Install ClamAV Module
[ ] BDC Install BitDefender
Options for sqlite 3.3.6
[ ] TCLWRAPPER TCL wrapper for SQLITE
[ ] THREADS Enable threads support
[ ] DEBUG Enable debugging & verbose explain
[ ] DOCS Building docs (depends on TCL)
Options for Mail-SpamAssassin-3.1.6
[X] AS_ROOT Run spamd as root (recommended)
[X] DOMAINKEYS DomainKeys support
[X] SSL Build with SSL support for spamd/spamc
[ ] MYSQL Add MySQL support
[ ] PGSQL Add PostreSQL support
[X] RAZOR Add Vipul's Razor support
[X] SPF_QUERY Add SPF query support
[X] RELAY_COUNTRY Relay country support
[X] TOOLS Install SpamAssassin tools
Options for clamav 0.88.5
[X] MILTER Compile the milter interface
[X] CURL Support URL downloading
[X] LIBUNRAR Support for external Unrar library
[X] STDERR Print logs to stderr instead of stdout
生成初始配置文件
QUOTE:
mail# make initial-config
根据提示创建MailScanner运行所需的目录
mail# mkdir -p /var/spool/MailScanner/incoming
mail# mkdir /var/spool/MailScanner/quarantine
mail# chown -R postfix:postfix /var/spool/MailScanner
分别在rc.conf中加入clamav、spamassassin和MailScanner的启动参数
QUOTE:
mail# echo 'clamav_clamd_enable="YES"' >> /etc/rc.conf
mail# echo 'clamav_freshclam_enable="YES"' >> /etc/rc.conf
mail# echo 'clamav_milter_enable="YES"' >> /etc/rc.conf
mail# echo 'mailscanner_enable="YES"' >> /etc/rc.conf
mail# echo 'spamd_enable="YES"' >> /etc/rc.conf
4.13 安装maildrop-2.0.2
QUOTE:
mail# cd /usr/ports/mail/maildrop
mail# make install WITH_AUTHLIB=yes
以下是我的选择
QUOTE:
Options for maildrop 2.0.2
[ ] AUTH_LDAP LDAP support
[X] AUTH_MYSQL MySQL support
[ ] AUTH_PGSQL PostgreSQL support
[ ] AUTH_USERDB Userdb support
[ ] AUTH_VCHKPW Vpopmail/vchkpw support
QUOTE:
mail# /usr/local/bin/maildrop -v
maildrop 2.0.2 Copyright 1998-2005 Double Precision, Inc.
Courier Authentication Library extension enabled.
Maildir quota extension enabled.
This program is distributed under the terms of the GNU General Public
License. See COPYING for additional information.
出现上面红色的部分表示maildrop支持Courier。
第五章 软件系统配置
为了支持maildrop,先加入vmail用户
QUOTE:
mail# pw adduser vmail -u 1003 -s /sbin/nologin -d /dev/null
5.1 配置cyrus-sasl
创建/usr/local/lib/sasl2/smtpd.conf
QUOTE:
mail# ee /usr/local/lib/sasl2/smtpd.conf
pwcheck_method: auxprop
auxprop_plugin: sql
mech_list: plain login
sql_engine: mysql
sql_hostnames: localhost
sql_user: tmail
sql_passwd: tmail
sql_database: tmail
sql_select: select clear from tmail_users where email='%u@%r' and smtpaccess='Y'
5.2 配置postfix
QUOTE:
mail# ln -s /usr/local/sbin/sendmail /usr/sbin/sendmail
注:如果/usr/sbin/sendmail存在就删了再做上链接,如果升级内核和升级系统后要重新做这一步。
mail# echo ‘postfix: root’ >> /etc/aliases
mail# /usr/local/bin/newaliases
mail# chown postfix:postfix /etc/opiekeys
mail# ee /usr/local/etc/postfix/main.cf
修改/usr/local/etc/postfix/main.cf,在文件最后加入以下内容
QUOTE:
# new add
myhostname = mail.test.com
smtp_helo_name = $myhostname
local_transport = maildrop
mailbox_transport = maildrop
smtpd_error_sleep_time = 0
smtpd_soft_error_limit = 10
smtpd_hard_error_limit = 20
default_process_limit = 100
#alias_maps = hash:/usr/local/etc/postfix/aliases
#Alias_database = hash:/usr/local/etc/postfix/aliases
mydestination = mysql:/usr/local/etc/postfix/mysql-mydest.cf
virtual_transport_maps = mysql:/usr/local/etc/postfix/mysql-transport.cf
virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql-virtual.cf
#virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql-alias.cf
recipient_bcc_maps = mysql:/usr/local/etc/postfix/mysql-autobbc-in.cf
sender_bcc_maps = mysql:/usr/local/etc/postfix/mysql-autobbc-out.cf
local_recipient_maps = $alias_maps $virtual_mailbox_maps $virtual_maps
virtual_mailbox_base = /mail
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql-virtual-maps.cf
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/usr/local/etc/postfix/mysql-virtual-quota.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
virtual_overquota_bounce = yes
virtual_uid_maps = mysql:/usr/local/etc/postfix/mysql-virtual-uid.cf
virtual_gid_maps = mysql:/usr/local/etc/postfix/mysql-virtual-gid.cf
broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_client_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
check_client_access mysql:/usr/local/etc/postfix/mysql-access.cf,
permit_auth_destination,
reject
smtpd_sender_restrictions =
reject_unknown_sender_domain,
reject_non_fqdn_sender,
check_sender_access mysql:/usr/local/etc/postfix/mysql-access.cf,
permit
smtpd_recipient_restrictions =
permit_mynetworks,
check_client_access mysql:/usr/local/etc/postfix/mysql-access.cf,
permit_sasl_authenticated,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
reject_unauth_pipelining,
reject_unauth_destination,
reject_rbl_client cblless.anti-spam.org.cn,
permit
default_destination_recipient_limit = 1
local_destination_concurrency_limit = 1
maildrop_destination_recipient_limit = 1
message_size_limit = 41943040
smtpd_recipient_limit = 10
bounce_queue_lifetime = 12h
maximal_queue_lifetime = 24h
smtpd_delay_reject = yes
smtpd_helo_required = yes
strict_rfc821_envelopes = yes
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-access.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
query = select access from tmail_access where source = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-alias.cf
host = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_virtual
query = select alias from tmail_users where email = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-autobbc-in.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
query = select autobbc from tmail_autobbc where email = '%s' AND come='1'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-autobbc-out.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
query = select autobbc from tmail_autobbc where email = '%s' AND 'out'='1'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-mydest.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_domaininfo
query = select domain from tmail_domaininfo where domain = '%s' AND yesno = '1'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-transport.cf
host = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_domaininfo
query = select transport from tmail_domaininfo where domain = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-virtual-gid.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_users
query = select gid from tmail_users where email = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-virtual-uid.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_users
query = select uid from tmail_users where email = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-virtual-maps.cf
host = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_users
query = select maildir from tmail_users where email = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-virtual-quota.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_users
query = select quota from tmail_users where email = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-virtual.cf
host = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_virtual
query = select destination from tmail_virtual where email = '%s'
5.3 配置Courier-imap
修改Courier相关设置,/usr/local/etc/courier-imap/imapd:
QUOTE:
IMAP_CAPABILITY="IMAP4rev1 CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA"
修改/usr/local/etc/courier-imap/pop3d
QUOTE:
POP3AUTH="LOGIN CRAM-MD5 CRAM-SHA1"
编辑修改/usr/local/etc/authlib/authmysqlrc
QUOTE:
MYSQL_SERVER localhost
MYSQL_USERNAME tmail
MYSQL_PASSWORD tmail
MYSQL_PORT 0
MYSQL_OPT 0
MYSQL_DATABASE tmail
MYSQL_USER_TABLE tmail_users
MYSQL_CRYPT_PWFIELD crypt
#MYSQL_CLEAR_PWFIELD clear
MYSQL_UID_FIELD uid
MYSQL_GID_FIELD gid
MYSQL_LOGIN_FIELD email
MYSQL_HOME_FIELD homedir
MYSQL_NAME_FIELD realname
MYSQL_MAILDIR_FIELD maildir
MYSQL_QUOTA_FIELD quota
MYSQL_AUXOPTIONS_FIELD CONCAT("disableimap=",disableimap,",disablepop3=",disablepop3,",disablewebmail=",disablewebmail,",sharedgroup=",sharedgroup)
MYSQL_WHERE_CLAUSE access='y'
注:红色部分为一行。这里得用tab键来跳格
编辑/usr/local/etc/authlib/authdaemonrc
QUOTE:
authmodulelist="authmysql"
authmodulelistorig="authmysql"
version="authdaemond.mysql"
daemons=5
authdaemonvar=/var/run/authdaemond
subsystem=mail
DEBUG_LOGIN=0
DEFAULTOPTIONS="wbnodsn=1"
5.4 安装Tmail管理工具
本节主要介绍如何安装Tmail管理工具。
更改httpd.conf中的Group www、User www修改为: Group vmail、User vmail
安装Tmail管理工具来设置第一个域名和用户
上传管理工具到网站目录
后修改config/config.inc.php中的
QUOTE:
define(MAILDIR,"/mail"); //邮件存放目录
define(MISC, ".misc");
define(MODE,0700);
$PageSize = 15; //用户列表和域名列表每一页显示多少行
$host = "localhost"; //数据库主机名
$user = "tmail"; //数据库用户名
$dbname = "tmail"; //数据库名称
$password = "tmail"; //数据库密码
设置好后,加一个域名为test.com,加一个邮件用户为: test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
5.5 登录测试
重新启动相关服务
QUOTE:
mail# /usr/local/etc/rc.d/apache22 restart
mail# /usr/local/etc/rc.d/mysql-server restart
mail# /usr/local/etc/rc.d/courier-authdaemond stop
mail# /usr/local/etc/rc.d/courier-authdaemond start
mail# /usr/local/etc/rc.d/courier-imap-imapd.sh restart
mail# /usr/local/etc/rc.d/courier-imap-pop3d.sh restart
mail# /usr/local/etc/rc.d/postfix reload
生成用户名的base64编码
QUOTE:
mail# perl -MMIME::Base64 -e 'print encode_base64(" test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 ");'
dGVzdEB0ZXN0LmNvbQ==
mail# perl -MMIME::Base64 -e 'print encode_base64("000000");'
MDAwMDAw
测试25发送
QUOTE:
mail# telnet localhost 25
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.test.com.
Escape character is '^]'.
220 mail.test.com ESMTP Postfix
ehlo mail
250-mail.test.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME
auth login
334 VXNlcm5hbWU6
dGVzdEB0ZXN0LmNvbQ==
334 UGFzc3dvcmQ6
MDAwMDAw
235 Authentication successful
MAIL FROM:< test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 >
250 Ok
RCPT TO:< test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 >
250 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
SUBJECT:test
test
.
250 Ok: queued as 47C6CB83E
quit
221 Bye
Connection closed by foreign host.
测试110收邮件
QUOTE:
mail# telnet localhost 110
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.test.com.
Escape character is '^]'.
+OK Hello there.
user test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
+OK Password required.
pass 000000
+OK logged in.
list
+OK POP3 clients that break here, they violate STD53.
1 1563
2 401
.
retr 2
+OK 401 octets follow.
Return-Path: < test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 >
Delivered-To: test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
Received: from mail (localhost.test.com [127.0.0.1])
by mail.test.com (Postfix) with ESMTP id 47C6CB83E
for < test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 >; Tue, 11 Jul 2006 13:47:28 +0800 (CST)
SUBJECT:test
Message-Id: < 20060711054736.47C6CB83E@mail.test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 >
Date: Tue, 11 Jul 2006 13:47:28 +0800 (CST)
From: test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
To: undisclosed-recipients:;
test
.
dele 2
+OK Deleted.
quit
+OK Bye-bye.
Connection closed by foreign host.
5.6 垃圾邮件和病毒邮件过滤设置
设置MailScanner
编辑/usr/local/etc/postfix/main.cf
QUOTE:
mail# ee /usr/local/etc/postfix/main.cf
去掉513行的注释
QUOTE:
header_checks = regexp:/usr/local/etc/postfix/header_checks
编辑/usr/local/etc/postfix/header_checks
QUOTE:
mail# ee /usr/local/etc/postfix/header_checks
新加入
/^Received:/ HOLD
重新加载postfix配置文件
mail# postfix reload
编辑/usr/local/etc/MailScanner/MailScanner.conf,以下是我的配置文件,更改相应的参数为下面的格式。
QUOTE:
%org-name% = thismail.org
%org-long-name% = LCSoft
%web-site% = www.thismail.org
%etc-dir% = /usr/local/etc/MailScanner
%report-dir% = /usr/local/share/MailScanner/reports/en
%rules-dir% = /usr/local/etc/MailScanner/rules
%mcp-dir% = /usr/local/etc/MailScanner/mcp
Run As User = postfix
Run As Group = postfix
Incoming Queue Dir = /var/spool/postfix/hold
Outgoing Queue Dir = /var/spool/postfix/incoming
MTA = postfix
Sendmail = /usr/sbin/sendmail
Monitors for ClamAV Updates = /var/db/clamav/*.cvd
SpamAssassin User State Dir = /var/spool/MailScanner/spamassassin
Custom Functions Dir = /usr/local/lib/MailScanner/MailScanner/CustomFunctions
SpamAssassin Install Prefix = /usr/local/bin
SpamAssassin Site Rules Dir = /usr/local/etc/mail/spamassassin
SpamAssassin Local Rules Dir = /usr/local/share/spamassassin
编辑配置文件/usr/local/etc/MailScanner/mcp/mcp.spam.assassin.prefs.conf
QUOTE:
mail# ee /usr/local/etc/MailScanner/mcp/mcp.spam.assassin.prefs.conf
# MailScanner
# MailScanner users, please see the comments at the bottom of this file.
# MailScanner
#
# SpamAssassin user preferences file.
#
# Format:
#
# required_hits n
# (how many hits are required to tag a mail as spam.)
#
# score SYMBOLIC_TEST_NAME n
# (if this is omitted, 1 is used as a default score.
# Set the score to 0 to ignore the test.)
#
# # starts a comment, whitespace is not significant.
#
###########################################################################
# Whitelist and blacklist addresses are *not* patterns; they're just normal
# strings. one exception is that "*@isp.com" is allowed. They should be in
# lower-case. You can either add multiple addrs on one line,
# whitespace-separated, or you can use multiple lines.
#
# Monty Solomon: he posts from an ISP that has often been the source of spam
# (no fault of his own ;), and sometimes uses Bcc: when mailing.
#
#whitelist_from monty@roscom.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
# Add your blacklist entries in the same format...
#
# blacklist_from friend@public.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
# Mail using languages used in these country codes will not be marked
# as being possibly spam in a foreign language.
#
#ok_locales en
skip_rbl_checks 1
use_bayes 0
use_dcc 0
use_pyzor 0
use_razor1 0
use_razor2 0
decode_attachments 1
编辑配置文件/usr/local/etc/MailScanner/rules/max.message.size.rules
QUOTE:
mail# ee /usr/local/etc/MailScanner/rules/max.message.size.rules
# This is an example ruleset to show how rules can have resulting values
# other than yes and no. This ruleset demonstrates having a numerical result.
# The From: and To: rules show how simple domains can be used to select
# different values for the result of the ruleset.
# Note that the fields of each rule line can be separated by any whitespace,
# any combination of tabs and spaces.
#
# The 2 lines involving domain3.com show that for email to user@domain3.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
# has a limit of 5Mbytes per message, while email to any other user
# @domain3.com has a limit of 500Kbytes per message.
#
To: *@domain1.com 10M
To: *@domain2.com 20M
From: user@domain3.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 5M
From: *@domain3.com 500K
#
# The following line specifies the default result used when none of the
# other rules match. In this example,
# Maximum Message Size = 0
# means that there is no limit to the size of the message.
#
FromOrTo: default 0
编辑配置文件/usr/local/etc/MailScanner/rules/bounce.rules
QUOTE:
mail# ee /usr/local/etc/MailScanner/rules/bounce.rules
# You can use this ruleset to enable the "bounce" Spam Action.
# You must *only* enable this for mail from sites with which you have
# agreed to bounce possible spam. Use it on low-scoring spam only (<10)
# and only to your regular customers for use in the rare case that a
# message is mis-tagged as spam when it shouldn't have been.
# Beware that many sites will automatically delete the bounce messages
# created by using this option unless you have agreed this with them in
# advance.
# This next line gives an example of how you might enable this option for
# a frequent customer of yours.
#From: yourcustomer.com yes
# Under no circumstances should this be changed to "yes".
FromOrTo: default no
重新启动mailscanner.
QUOTE:
mail# /usr/local/etc/rc.d/mailscanner restart
加入中文垃圾邮件规则
QUOTE:
mail# cd /usr/local/share/spamassassin
mail# fetch http://www.ccert.edu.cn/spam/sa/Chinese_rules.cf
注意:由于加入了中文垃圾邮件规则,请把垃圾邮件的评分的分数设置为高一些。
我的设置为8,最高分设置为10,这样可以降低中文邮件的错误识别率。用户可以根据自己的需要来改变这两个分值。
QUOTE:
Required SpamAssassin Score = 8
High SpamAssassin Score = 10
为了避免邮件扫描后主题变成乱码,建议改变以下设置为no
QUOTE:
Virus Modify Subject = no
Filename Modify Subject = no
Content Modify Subject = no
Disarmed Modify Subject = no
Spam Modify Subject = yes
High Scoring Spam Modify Subject = no
扫描垃圾邮件所执行的运作
QUOTE:
Spam Actions = deliver
High Scoring Spam Actions = delete
相关运作参数说明:
QUOTE:
"deliver" -- 邮件正常的转送至原来的收信人。
"delete" -- 删除邮件。
"store" -- 将邮件存放至隔离区。
"bounce" -- 将邮件退给寄信人。
"forward" -- 提供一个 forward 的邮件位址给系统,系统会自动转寄一份。
"striphtml" -- 将内嵌 HTML 的邮件转成 Text,你必需要加入 "deliver",系统才会帮你寄邮件。
允许html邮件通行
QUOTE:
Allow IFrame Tags = yes
Allow Form Tags = yes
Allow Script Tags = yes
Allow WebBugs = disarm
Allow Object Codebase Tags = yes
Convert Dangerous HTML To Text = no
Convert HTML To Text = no
允许本机发送出去的邮件不被MailScanner视为垃圾邮件
QUOTE:
mail# ee /usr/local/etc/MailScanner/rules/spam.whitelist.rules
From: 127.0.0.1 yes
以上规则的说明:以上垃圾邮件的规则是加入了中文垃圾邮件主题和内容的评分规则,所以我设置了一个最低分为8分,最高分为10分的规则,8-10分间的邮件会被打上[spamd]的标识,高于10分的邮件会被自动的删除掉,以上规则允许html邮件通过。
第六章 安装webmail
到开邮件邮件技术论坛
http://www.thismail.org/bbs/thread.php?fid=17
取得最新的webmail
下载后传到服务器上的web目录,后配置php的全局变量为打开
QUOTE:
register_globals = On
并编辑webmail/config/config_inc.php中如下参数
QUOTE:
$CFG_BASEPATH = "/tmp/tmail/temp"; //临时目录,如果不存在,修改完配置文件后再手动创建,并附于相关的权限
// Mysql
define(MYSQL_HOST, 'localhost'); //数据库主机名
define(MYSQL_USER, 'postfix'); //数据库用户名
define(MYSQL_PASS, 'postfix'); //数据库密码
define(MYSQL_DATA, 'postfix'); //数据库名称
$CFG_NETDISK_PATH = "/mail/netdisk"; //文件管理(网络磁盘所在的系统路径)如果不存在,修改完配置文件后再手动创建,并附于相关的权限
$CFG_NETDISK_DEFAULT_QUOTA = 10; //文件管理(网络磁盘)默认大小为10MB,用户可根据自己的需要改变大小
。
QUOTE:
mail# mkdir -p /tmp/tmail/temp
mail# chown -R postfix:postfix /tmp/tmail
mail# mkdir -p /mail/netdisk
mail# chown -R postfix:postfix /mail/netdisk
为了webmail能配合maildrop做中文邮件的过滤。请写/usr/sbin/maildecode文件
QUOTE:
mail# ee /usr/sbin/maildecode
#!/usr/bin/perl
# Convert Base64 Or Quoted-printable TO Text
my $a = $ARGV[0] || '';
#Maybe arg is include Subject
if ($a=~/^Subject/) {
$a = $ARGV[1] || '';
};
if ($a=~/=?[w-]+?B?(.*)?=$/) {
use MIME::Base64;
$a = decode_base64($1);
};
if ($a=~/=?[w-]+?Q?(.*)?=$/) {
use MIME::QuotedPrint;
$a = decode_qp($1);
};
#open(OUTFILE, ">/tmp/list.log");
#print OUTFILE $a;
#close(OUTFILE);
print $a;
exit(0);
并改变相关的权限
QUOTE:
mail# chmod 755 /usr/sbin/maildecode
mail# chown -R vmail:vmail /usr/sbin/maildecode
安装成功后的webmail
附一、常见问题
正在收集中……
附二、MailScanner.conf中文参数说明
http://www.thismail.org/bbs/htm_data/7/0509/533.html
更深入一点理解 switch 语句 及 c/c++ 对 const 的处理
谢煜波
http://blog.csdn.net/xiaohan13916830/archive/2004/08/17/76724.aspx
前段时间在论坛上看见台湾李维在<>一书中对windows编程模式中,消息处理部分有如下的一些分析:
他说,在消息处理循环中,一般的形式是这样的
MSG msg ;
switch( msg ){
case WM_XXXXXXX :
....
case WM_XXXXXXX :
....
case WM_XXXXXXX :
....
} ;
李维说,这种模式是很低效的,因应经过汇编后,这种C代码会产生如下的汇编代码
cmp .... .....
jnz .... .....
cmp .... .....
jnz .... .....
cmp .... .....
jnz .... .....
如果你的 case 足够多,比如,你有一万条消息需要处理,而不幸的是你把一条最常用的消息
放在了最后一位,那么当这条消息要得到处理,会首先经过一万次的cmp与jnz, 李维认为,这
是非常非常低效的,实在是低效的忍无可忍,无需再忍~~:P
在起初,我也是这样认为的,但近来的阅读及实验却发现,这种看法非常片面,今天就来谈谈这个问题( 所有实验在 linux 平台下完成 )
首先看一到用 c 编写的程序
/* -------------------- filename : ta.c --------------- */
int switch_test_first( int x )
{
int res ;
switch( x ){
case 100 :
res = 1 ;
break ;
case 102 :
res = 2 ;
break ;
case 103 :
res = 3 ;
break ;
}
return res ;
}
然后,我们用 gcc 将它编译成汇编文件( 使用 -S 开关 )
gcc -S ta.c
将得到如下的汇编文件( ta.s )
.file "ta.c"
.text
.globl switch_test_first
.type switch_test_first,@function
switch_test_first:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl 8(%ebp), %eax
.file "ta.c"
.text
.globl switch_test_first
.type switch_test_first,@function
switch_test_first:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl 8(%ebp), %eax
movl %eax, -8(%ebp)
cmpl $102, -8(%ebp) // 1
je .L4 // 2
cmpl $102, -8(%ebp) // 3
jg .L8 // 4
cmpl $100, -8(%ebp) // 5
je .L3 // 6
jmp .L2 // 7
.L8:
cmpl $103, -8(%ebp)
je .L5
jmp .L2
.L3:
movl $1, -4(%ebp)
jmp .L2
.L4:
movl $2, -4(%ebp)
jmp .L2
.L5:
movl $3, -4(%ebp)
.L2:
movl -4(%ebp), %eax
leave
ret
.Lfe1:
.size switch_test_first,.Lfe1-switch_test_first
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
注意看文件中 // 1 ~ // 7 的部份,从这个部份,我们可以看出,gcc确实是把一些case语句转成了李维所说的那种方式进行处理,我们看见了代码中存在有众多的 cmpl 与 jmp 语句
这就相当于你使用if..else..一样,但是否总是这样呢?
我们下面改动一下 ta.c 这个文件,在里面再多加一些 case 语句
/* -------------- filename : new_ta.c ------------------- */
int switch_test_first( int x )
{
int res ;
switch( x ){
case 100 :
res = 1 ;
break ;
case 102 :
res = 2 ;
break ;
case 103 :
res = 3 ;
break ;
case 104 :
res = 4 ;
break ;
case 105 :
res = 5 ;
break ;
case 106 :
res = 6 ;
break ;
}
return res ;
}
这个 new_ta.c 与原来的 ta.c 在结构上完全相同,唯一不同的就是 case 语句的数量变多了,下面我们来编译一下这个文件
gcc -S new_ta.c
下面是我们产生的更新的汇编文件
.file "new_ta.c"
.text
.globl switch_test_first
.type switch_test_first,@function
switch_test_first:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl 8(%ebp), %eax
subl $100, %eax
movl %eax, -8(%ebp)
cmpl $6, -8(%ebp)
ja .L2
movl -8(%ebp), %edx
movl .L9(,%edx,4), %eax
jmp *%eax
.section .rodata
.align 4
.align 4
.L9: // A
.long .L3
.long .L2
.long .L4
.long .L5
.long .L6
.long .L7
.long .L8
.text
.L3: // 1
movl $1, -4(%ebp)
jmp .L2
.L4: // 2
movl $2, -4(%ebp)
jmp .L2
.L5: // 3
movl $3, -4(%ebp)
jmp .L2 // 4
.L6:
movl $4, -4(%ebp)
jmp .L2 // 5
.L7:
movl $5, -4(%ebp) // 6
jmp .L2
.L8: // 7
movl $6, -4(%ebp)
.L2:
movl -4(%ebp), %eax
leave
ret
.Lfe1:
.size switch_test_first,.Lfe1-switch_test_first
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
仔细比较一下这个最新的 new_ta.s 与前面的 ta.s,精华全在里面了!
首先 new_ta.s 比前面的 ta.s 多了一个 .L9 部分,而且它的 // 1 ~ // 7 中没有了前面
ta.s 文件中所存在的众多的 cmpl 与 jmp 语句,那么,现在这样的代码又是怎么实现
switch 语句中的跳转的呢?我们来仔细分析一下它新多出来的 .L9 部份。
.section .rodata
.align 4
.align 4
.L9:
.long .L3
.long .L2
.long .L4
.long .L5
.long .L6
.long .L7
.long .L8
.text
显而易见,.L9 部份是一个我们最常见的数据结构——表,它的每一项都是一个标号,而这个标号,恰恰是每个 case 语句的入口标号!
这很容易让我们想到,它很可能是用了一张表来存放所有的 case 语句的入口,然后,在
执行 switch 语句的时候就从这个表中直接检出相应的 case 语句的入口地址,然后跳转
到相应的 case 语句去执行,就像hash_table似的。具体是不是这样呢?我们看看进入
switch 部份的代码:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl 8(%ebp), %eax
subl $100, %eax
movl %eax, -8(%ebp)
cmpl $6, -8(%ebp)
ja .L2
movl -8(%ebp), %edx
movl .L9(,%edx,4), %eax // 1
jmp *%eax // 2
果然如此!首先在 // 1 处根据%edp的值(其值相当于表的下标)在.L9的表中找到相应
case 语句的入口地址,并把这个地址存到%eax中,然后通过 // 2 (这是一个间接跳转
语句)转到%eax存放的地址中,也即相应的case语句处。
C编译器,果然聪明!
通过这个分析我们可以知道如下两点:
1. 当 case 语句少的时候,C编译器将其转成 if..else.. 类型进行处理,运用较多的
cmp 与 jmp 语句 ,而当 case 语句较多的时候,C编译器会出成一个跳转表,而直
接通过跳转表进行跳转,这让 switch 具有非常高的效律,而且效律几乎不会因为
case 语句的增长而减小,李维所担忧的问题是完全不会发生的
2. 可以问答下面几个问题:
1. 为什么 case 语句中需要的是整数类型而不能是其余的类型?
这是因为,case 语句中的这个值是用来做跳转表的下标的,因此,当然必须是整数
2. 为什么 case 语句在不加break的时候具有直通性?
这是因为跳转是在进入 switch 是计算出的,而不是在case语句中计算出的,整个
case 语句群就是一块完整而连续的代码,只是switch让其从不同的位置开始执行。
上面的内容,在《Computer Systems A Programmer's Perspective》中有很详细的论述,
感兴趣可以去找来仔细看看~~~
既然,case 语句需要的是整数的常量值,那么我们是否可用 const 类型呢?比如下面
一段代码:
const int c_1 = 100 ;
const int c_2 = 102 ;
void test( int x )
{
switch( x ){
case c_1 :
++x ;
case c_2 :
--x ;
}
}
这段代码,用 c 编译器编译,编译器会提示错误,但在 c++ 编译器中却不会,这主要是由于 c , 与 c++ 编译器对 const 这个东东的处理不同。我们来看看下面一段 c 程序
/*------------- filename : const_c.c -----------*/
const int a = 15 ;
void f( int x )
{
x = a ;
}
同样用 gcc 编译
gcc -S const_c.c
然后,来看看它的汇编文件
.file "const_c.c"
.globl a
.section .rodata
.align 4
.type a,@object
.size a,4
a: // 1
.long 15
.text
.globl f
.type f,@function
f:
pushl %ebp
movl %esp, %ebp
movl a, %eax // 2
movl %eax, 8(%ebp)
leave
ret
.Lfe1:
.size f,.Lfe1-f
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
注意 // 1 处,C 编译器为 a 分配了地址,并把它的值设为 15 ,而在 // 2 处,它是将
a 这个地址中的值赋给了 %eax,这同一般的普通变量而非const 变量赋值没什么两样
下面我们用 c++ 编译器来编译这段代码,它产生的汇编文件如下:
.file "const_cpp.cpp"
.text
.align 2
.globl _Z1fi
.type _Z1fi,@function
_Z1fi:
.LFB2:
pushl %ebp
.LCFI0:
movl %esp, %ebp
.LCFI1:
movl $15, 8(%ebp) // 1
leave
ret
.LFE2:
.Lfe1:
.size _Z1fi,.Lfe1-_Z1fi
.section .rodata
.align 4
.type a,@object
.size a,4
a:
.long 15
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
同样注意// 1 处,它以经把 a 的值用 15 来取代了,
也就是说,在c中const变量的行为更像一个非const变量,而在cpp中,const变量的行为就像是#define
由于 c++ 中,const 变量的值是在编译时就计算出来的,因此,它可以用在 case 语句中,而 c 中,const值在编译时只是一个变量的地址,因此,它无法用在 case 语句中.
-----------------------------------------------------------------------------
参考文献:<>
谢煜波
http://blog.csdn.net/xiaohan13916830/archive/2004/08/17/76724.aspx
前段时间在论坛上看见台湾李维在<
他说,在消息处理循环中,一般的形式是这样的
MSG msg ;
switch( msg ){
case WM_XXXXXXX :
....
case WM_XXXXXXX :
....
case WM_XXXXXXX :
....
} ;
李维说,这种模式是很低效的,因应经过汇编后,这种C代码会产生如下的汇编代码
cmp .... .....
jnz .... .....
cmp .... .....
jnz .... .....
cmp .... .....
jnz .... .....
如果你的 case 足够多,比如,你有一万条消息需要处理,而不幸的是你把一条最常用的消息
放在了最后一位,那么当这条消息要得到处理,会首先经过一万次的cmp与jnz, 李维认为,这
是非常非常低效的,实在是低效的忍无可忍,无需再忍~~:P
在起初,我也是这样认为的,但近来的阅读及实验却发现,这种看法非常片面,今天就来谈谈这个问题( 所有实验在 linux 平台下完成 )
首先看一到用 c 编写的程序
/* -------------------- filename : ta.c --------------- */
int switch_test_first( int x )
{
int res ;
switch( x ){
case 100 :
res = 1 ;
break ;
case 102 :
res = 2 ;
break ;
case 103 :
res = 3 ;
break ;
}
return res ;
}
然后,我们用 gcc 将它编译成汇编文件( 使用 -S 开关 )
gcc -S ta.c
将得到如下的汇编文件( ta.s )
.file "ta.c"
.text
.globl switch_test_first
.type switch_test_first,@function
switch_test_first:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl 8(%ebp), %eax
.file "ta.c"
.text
.globl switch_test_first
.type switch_test_first,@function
switch_test_first:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl 8(%ebp), %eax
movl %eax, -8(%ebp)
cmpl $102, -8(%ebp) // 1
je .L4 // 2
cmpl $102, -8(%ebp) // 3
jg .L8 // 4
cmpl $100, -8(%ebp) // 5
je .L3 // 6
jmp .L2 // 7
.L8:
cmpl $103, -8(%ebp)
je .L5
jmp .L2
.L3:
movl $1, -4(%ebp)
jmp .L2
.L4:
movl $2, -4(%ebp)
jmp .L2
.L5:
movl $3, -4(%ebp)
.L2:
movl -4(%ebp), %eax
leave
ret
.Lfe1:
.size switch_test_first,.Lfe1-switch_test_first
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
注意看文件中 // 1 ~ // 7 的部份,从这个部份,我们可以看出,gcc确实是把一些case语句转成了李维所说的那种方式进行处理,我们看见了代码中存在有众多的 cmpl 与 jmp 语句
这就相当于你使用if..else..一样,但是否总是这样呢?
我们下面改动一下 ta.c 这个文件,在里面再多加一些 case 语句
/* -------------- filename : new_ta.c ------------------- */
int switch_test_first( int x )
{
int res ;
switch( x ){
case 100 :
res = 1 ;
break ;
case 102 :
res = 2 ;
break ;
case 103 :
res = 3 ;
break ;
case 104 :
res = 4 ;
break ;
case 105 :
res = 5 ;
break ;
case 106 :
res = 6 ;
break ;
}
return res ;
}
这个 new_ta.c 与原来的 ta.c 在结构上完全相同,唯一不同的就是 case 语句的数量变多了,下面我们来编译一下这个文件
gcc -S new_ta.c
下面是我们产生的更新的汇编文件
.file "new_ta.c"
.text
.globl switch_test_first
.type switch_test_first,@function
switch_test_first:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl 8(%ebp), %eax
subl $100, %eax
movl %eax, -8(%ebp)
cmpl $6, -8(%ebp)
ja .L2
movl -8(%ebp), %edx
movl .L9(,%edx,4), %eax
jmp *%eax
.section .rodata
.align 4
.align 4
.L9: // A
.long .L3
.long .L2
.long .L4
.long .L5
.long .L6
.long .L7
.long .L8
.text
.L3: // 1
movl $1, -4(%ebp)
jmp .L2
.L4: // 2
movl $2, -4(%ebp)
jmp .L2
.L5: // 3
movl $3, -4(%ebp)
jmp .L2 // 4
.L6:
movl $4, -4(%ebp)
jmp .L2 // 5
.L7:
movl $5, -4(%ebp) // 6
jmp .L2
.L8: // 7
movl $6, -4(%ebp)
.L2:
movl -4(%ebp), %eax
leave
ret
.Lfe1:
.size switch_test_first,.Lfe1-switch_test_first
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
仔细比较一下这个最新的 new_ta.s 与前面的 ta.s,精华全在里面了!
首先 new_ta.s 比前面的 ta.s 多了一个 .L9 部分,而且它的 // 1 ~ // 7 中没有了前面
ta.s 文件中所存在的众多的 cmpl 与 jmp 语句,那么,现在这样的代码又是怎么实现
switch 语句中的跳转的呢?我们来仔细分析一下它新多出来的 .L9 部份。
.section .rodata
.align 4
.align 4
.L9:
.long .L3
.long .L2
.long .L4
.long .L5
.long .L6
.long .L7
.long .L8
.text
显而易见,.L9 部份是一个我们最常见的数据结构——表,它的每一项都是一个标号,而这个标号,恰恰是每个 case 语句的入口标号!
这很容易让我们想到,它很可能是用了一张表来存放所有的 case 语句的入口,然后,在
执行 switch 语句的时候就从这个表中直接检出相应的 case 语句的入口地址,然后跳转
到相应的 case 语句去执行,就像hash_table似的。具体是不是这样呢?我们看看进入
switch 部份的代码:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl 8(%ebp), %eax
subl $100, %eax
movl %eax, -8(%ebp)
cmpl $6, -8(%ebp)
ja .L2
movl -8(%ebp), %edx
movl .L9(,%edx,4), %eax // 1
jmp *%eax // 2
果然如此!首先在 // 1 处根据%edp的值(其值相当于表的下标)在.L9的表中找到相应
case 语句的入口地址,并把这个地址存到%eax中,然后通过 // 2 (这是一个间接跳转
语句)转到%eax存放的地址中,也即相应的case语句处。
C编译器,果然聪明!
通过这个分析我们可以知道如下两点:
1. 当 case 语句少的时候,C编译器将其转成 if..else.. 类型进行处理,运用较多的
cmp 与 jmp 语句 ,而当 case 语句较多的时候,C编译器会出成一个跳转表,而直
接通过跳转表进行跳转,这让 switch 具有非常高的效律,而且效律几乎不会因为
case 语句的增长而减小,李维所担忧的问题是完全不会发生的
2. 可以问答下面几个问题:
1. 为什么 case 语句中需要的是整数类型而不能是其余的类型?
这是因为,case 语句中的这个值是用来做跳转表的下标的,因此,当然必须是整数
2. 为什么 case 语句在不加break的时候具有直通性?
这是因为跳转是在进入 switch 是计算出的,而不是在case语句中计算出的,整个
case 语句群就是一块完整而连续的代码,只是switch让其从不同的位置开始执行。
上面的内容,在《Computer Systems A Programmer's Perspective》中有很详细的论述,
感兴趣可以去找来仔细看看~~~
既然,case 语句需要的是整数的常量值,那么我们是否可用 const 类型呢?比如下面
一段代码:
const int c_1 = 100 ;
const int c_2 = 102 ;
void test( int x )
{
switch( x ){
case c_1 :
++x ;
case c_2 :
--x ;
}
}
这段代码,用 c 编译器编译,编译器会提示错误,但在 c++ 编译器中却不会,这主要是由于 c , 与 c++ 编译器对 const 这个东东的处理不同。我们来看看下面一段 c 程序
/*------------- filename : const_c.c -----------*/
const int a = 15 ;
void f( int x )
{
x = a ;
}
同样用 gcc 编译
gcc -S const_c.c
然后,来看看它的汇编文件
.file "const_c.c"
.globl a
.section .rodata
.align 4
.type a,@object
.size a,4
a: // 1
.long 15
.text
.globl f
.type f,@function
f:
pushl %ebp
movl %esp, %ebp
movl a, %eax // 2
movl %eax, 8(%ebp)
leave
ret
.Lfe1:
.size f,.Lfe1-f
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
注意 // 1 处,C 编译器为 a 分配了地址,并把它的值设为 15 ,而在 // 2 处,它是将
a 这个地址中的值赋给了 %eax,这同一般的普通变量而非const 变量赋值没什么两样
下面我们用 c++ 编译器来编译这段代码,它产生的汇编文件如下:
.file "const_cpp.cpp"
.text
.align 2
.globl _Z1fi
.type _Z1fi,@function
_Z1fi:
.LFB2:
pushl %ebp
.LCFI0:
movl %esp, %ebp
.LCFI1:
movl $15, 8(%ebp) // 1
leave
ret
.LFE2:
.Lfe1:
.size _Z1fi,.Lfe1-_Z1fi
.section .rodata
.align 4
.type a,@object
.size a,4
a:
.long 15
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
同样注意// 1 处,它以经把 a 的值用 15 来取代了,
也就是说,在c中const变量的行为更像一个非const变量,而在cpp中,const变量的行为就像是#define
由于 c++ 中,const 变量的值是在编译时就计算出来的,因此,它可以用在 case 语句中,而 c 中,const值在编译时只是一个变量的地址,因此,它无法用在 case 语句中.
-----------------------------------------------------------------------------
参考文献:<
曾看过一句话,给我非常深刻的印象:“在人生的每段记忆,总会有这么一个人带给记忆以生命。”是的,总有一些东西、一些人、一些细节在脑海徘徊。其实,记得太多东西也并非一件幸运的事,谁记得一切,谁就感到沉重!但当有一天,我突然强烈感到记忆正在慢慢被我忘却,而我一直觉得对一个人最大的伤害、最大的不公平,其实不是仇恨,而是漠视他或她的存在……于是,就有了这个新的分类栏目:转瞬红颜 ,用以怀念我那些逝去或即将逝去的时光,古人曾结绳纪事,我也学着用blog记述那些曾经的存在!
之所以喜欢这部连续剧,其实只是因为觉得女主角好看,才这么说的,一般一部不怎么好的连续剧,我都会努力找出它的优点(尽管有时候优点并不存在),譬如说这部连续剧《甘十九妹》中扮演甘十九妹的杨露mm就很PP,让人如此难忘……
后来,我在貂禅爱上了西施(QQYIRAN的空间)里,看到男女主角相遇时说的那段对白,这才觉得那还是蛮经典的,特别是在当年的连续剧中还是很大胆幽默的,《甘十九妹》这部连续剧改编自香港著名武侠小说家萧逸的同名作品,剧中人物的对白还是蛮简洁的,很有点古龙大师的味道,这可能也与剧中男主角张子健的形象蛮适合的……
那个时候,家里刚好买了台黑白电视,村里安装好了闭路电视,呵呵,山东台演的,感觉不错喔。。。追忆一下:
但愿有来生
-致我心目中最美的仙子甘十九妹
你确乎生于繁华人间,不然,你的喜怒哀乐,离合悲欢,又何以如此真切如斯,感慨缠绵;但,你更如来自瑶宇琼楼,不然,你的音容笑貌,举手投足,又何以如此典雅出尘,风致飘艳?
不明白为了什么,正是世间芸芸众生黯然消魂时,我写下这些文字,为你逝去的芳魂遥寄叹惋,为普天下钟情者送去一份遗恨后的慰藉,为我空虚惆怅的心灵寻一个自由倾诉空间,也许,也许,只是为了这颗赤诚的心.......
提起笔来,真不知以何言描摹你的绝代风华.
''沉鱼落雁,闭月羞花,千娇百媚,倾城倾国;风情万种,颠倒乾坤'',虽都一点也不觉过分,只怕这些给庸脂俗粉们的评语,玷辱了你的高洁.
''清水出芙蓉,天然去雕饰'',只可形容出你端妙仪容的十分之一.
''出淤泥而不染,濯清涟而不妖''.只可概括出你纯挚情操的百分之一.
你正如怒放在冰天雪地中的一枝寒梅,寒风呼啸,你依然含笑嫣然,香飘云天;只为伊人,无怨而有无悔,一颗痴心,亘古不渝.当明媚的春天来到,百卉争艳,因何只有你''零落成泥碾作尘''?当所有的恩怨情仇都勾销,又有谁能看到你秋湖般幽怨的明眸;当人们都陶醉在雪融冰消的欢乐里,又有谁能了解,波光滟滟的春水里,正流淌着你多情的泪花?
你正如清婉绝俗的玉兰,淡淡幽香,浸醉了几多痴儿女温馨的绮梦.你柔情似水,你吹气如兰;你秀发如云,你纤手凝脂.纵然是刀光剑影,绣幕重重,依然可仰你风流飘逸;纵然是血雨腥风,珠帘深深,依然可慕你高贵韵秀.你的芳心芷性,聪敏灵惠,终换得檀郎一世醉心温柔.然而悄然回眸,千帆尽处,花空烟水流.
''孤标傲世偕谁隐,一样花开为底迟'',落寞秋风.坎坷人生,聚散前缘,谁能料定?最难忘,你如泣如诉的琴声?你把爱恨都付与了这妙曼音符,可曾想,比翼双飞的心愿会成空?曾记否,桃源一游,空文萧赋;谁能料,英雄红颜,良辰虚度;诚可怨,神仙眷侣,都化了巫山残梦;最遗恨.知音苦觅,长相厮守只待来生.
一杯香茶,一盏孤灯,你堪比一竿青青翠竹生庭中.你用青春的火热与娇艳,只落得青山寂寂雾蒙蒙.你的良缘夙因,历历平生,只化做凄丽春梦;你的誓言,你的凄艳,只给人世留下长长久久的嗟呀与几缕浅浅淡淡的旧影,你的孜孜不懈地渴望与追求,你的追求的深深浅浅的足迹,重复了古往今来多少有情者曾跋涉过的荆棘路.
你生就寒梅的冰肌玉骨,你独具幽兰的端庄美淑,你占尽翠竹的娉婷娴静;你无愧素菊的高标脱俗......
纵集百卉之妍,也难将你描画出.
你有一颗温婉旖旎的女儿心,一腔得知己死亦无恨的女儿情
你挣扎于尘网又超脱世俗;你明知多情苦偏尝相思豆.
脉脉萧声,拨动了你少女情怀的一场痴恋.
熊熊烈火,记下了你今生最无悔的缱绻.
你爱地那般刻骨铭心,你恨得那般铭心刻骨.
你的笑容比云霞更灿烂,比彩虹更瑰丽;
你的心灵比美玉更无瑕,比明珠更璀璨;
你飘来飞去,绰约身姿,胜似碧霄飞雁;
你妙语连珠,空灵洒脱,真如落花微雨;
你是宿愿的冰湖秋月,你是天生的慧质兰心;
你是历史卷册中姗姗而出的古典仙子;
你是成人童话里令英雄倾倒的红粉佳人;
你是悠悠时空里最姝丽无伦的生灵;
你是茫茫红尘中真正爱过恨过的女人.
你匆匆来了-鲜花为你妍媚,百鸟为你歌唱;
你匆匆去了-落英为你缤纷,万物为你含悲;
桑田沧海,岁月如烟,人世几更改,世景多变迁.
何处寻,你巧笑倩兮的丽影;何处觅,你如诗如歌的琴声?
奈何桥头爱侣为伴,无论天上人间,你该不会寂寥;
三生石畔倾心相许,不管宿命轮回,前世今生,你应该很幸福.
也许,只有生生世世的相依相偎,正是你一生渴盼的天长地久.
也许,只有千载万代的朝朝暮暮.正是你苦苦追求的海烂石枯.
侧耳听,谁在吟,多情却似总无情?轻声唱,谁会听,生愿同欢死同冢,让鲜红的热血为这不该发生的一切恩怨划上一个结束号吧.爱,本没有错与对,更没有该与不该,只有完与未完,了与未了......
钟情的人们会感叹-自古美女英雄总痴情;
钟情的人们会吟唱-那首炽热绵长的恋曲;
钟情的人们会铭记-踏雪无痕里的侠骨柔情;
钟情的人们会传诵-那段轰轰烈烈的美丽故事.......
爱,又有谁能说得清?
又是莺飞草长,柳绿桃红的阳春时节,我默默祈祷-冥冥中自有牵线人,但愿有来世,但愿有来生.




之所以喜欢这部连续剧,其实只是因为觉得女主角好看,才这么说的,一般一部不怎么好的连续剧,我都会努力找出它的优点(尽管有时候优点并不存在),譬如说这部连续剧《甘十九妹》中扮演甘十九妹的杨露mm就很PP,让人如此难忘……
后来,我在貂禅爱上了西施(QQYIRAN的空间)里,看到男女主角相遇时说的那段对白,这才觉得那还是蛮经典的,特别是在当年的连续剧中还是很大胆幽默的,《甘十九妹》这部连续剧改编自香港著名武侠小说家萧逸的同名作品,剧中人物的对白还是蛮简洁的,很有点古龙大师的味道,这可能也与剧中男主角张子健的形象蛮适合的……
那个时候,家里刚好买了台黑白电视,村里安装好了闭路电视,呵呵,山东台演的,感觉不错喔。。。追忆一下:
但愿有来生
-致我心目中最美的仙子甘十九妹
你确乎生于繁华人间,不然,你的喜怒哀乐,离合悲欢,又何以如此真切如斯,感慨缠绵;但,你更如来自瑶宇琼楼,不然,你的音容笑貌,举手投足,又何以如此典雅出尘,风致飘艳?
不明白为了什么,正是世间芸芸众生黯然消魂时,我写下这些文字,为你逝去的芳魂遥寄叹惋,为普天下钟情者送去一份遗恨后的慰藉,为我空虚惆怅的心灵寻一个自由倾诉空间,也许,也许,只是为了这颗赤诚的心.......
提起笔来,真不知以何言描摹你的绝代风华.
''沉鱼落雁,闭月羞花,千娇百媚,倾城倾国;风情万种,颠倒乾坤'',虽都一点也不觉过分,只怕这些给庸脂俗粉们的评语,玷辱了你的高洁.
''清水出芙蓉,天然去雕饰'',只可形容出你端妙仪容的十分之一.
''出淤泥而不染,濯清涟而不妖''.只可概括出你纯挚情操的百分之一.
你正如怒放在冰天雪地中的一枝寒梅,寒风呼啸,你依然含笑嫣然,香飘云天;只为伊人,无怨而有无悔,一颗痴心,亘古不渝.当明媚的春天来到,百卉争艳,因何只有你''零落成泥碾作尘''?当所有的恩怨情仇都勾销,又有谁能看到你秋湖般幽怨的明眸;当人们都陶醉在雪融冰消的欢乐里,又有谁能了解,波光滟滟的春水里,正流淌着你多情的泪花?
你正如清婉绝俗的玉兰,淡淡幽香,浸醉了几多痴儿女温馨的绮梦.你柔情似水,你吹气如兰;你秀发如云,你纤手凝脂.纵然是刀光剑影,绣幕重重,依然可仰你风流飘逸;纵然是血雨腥风,珠帘深深,依然可慕你高贵韵秀.你的芳心芷性,聪敏灵惠,终换得檀郎一世醉心温柔.然而悄然回眸,千帆尽处,花空烟水流.
''孤标傲世偕谁隐,一样花开为底迟'',落寞秋风.坎坷人生,聚散前缘,谁能料定?最难忘,你如泣如诉的琴声?你把爱恨都付与了这妙曼音符,可曾想,比翼双飞的心愿会成空?曾记否,桃源一游,空文萧赋;谁能料,英雄红颜,良辰虚度;诚可怨,神仙眷侣,都化了巫山残梦;最遗恨.知音苦觅,长相厮守只待来生.
一杯香茶,一盏孤灯,你堪比一竿青青翠竹生庭中.你用青春的火热与娇艳,只落得青山寂寂雾蒙蒙.你的良缘夙因,历历平生,只化做凄丽春梦;你的誓言,你的凄艳,只给人世留下长长久久的嗟呀与几缕浅浅淡淡的旧影,你的孜孜不懈地渴望与追求,你的追求的深深浅浅的足迹,重复了古往今来多少有情者曾跋涉过的荆棘路.
你生就寒梅的冰肌玉骨,你独具幽兰的端庄美淑,你占尽翠竹的娉婷娴静;你无愧素菊的高标脱俗......
纵集百卉之妍,也难将你描画出.
你有一颗温婉旖旎的女儿心,一腔得知己死亦无恨的女儿情
你挣扎于尘网又超脱世俗;你明知多情苦偏尝相思豆.
脉脉萧声,拨动了你少女情怀的一场痴恋.
熊熊烈火,记下了你今生最无悔的缱绻.
你爱地那般刻骨铭心,你恨得那般铭心刻骨.
你的笑容比云霞更灿烂,比彩虹更瑰丽;
你的心灵比美玉更无瑕,比明珠更璀璨;
你飘来飞去,绰约身姿,胜似碧霄飞雁;
你妙语连珠,空灵洒脱,真如落花微雨;
你是宿愿的冰湖秋月,你是天生的慧质兰心;
你是历史卷册中姗姗而出的古典仙子;
你是成人童话里令英雄倾倒的红粉佳人;
你是悠悠时空里最姝丽无伦的生灵;
你是茫茫红尘中真正爱过恨过的女人.
你匆匆来了-鲜花为你妍媚,百鸟为你歌唱;
你匆匆去了-落英为你缤纷,万物为你含悲;
桑田沧海,岁月如烟,人世几更改,世景多变迁.
何处寻,你巧笑倩兮的丽影;何处觅,你如诗如歌的琴声?
奈何桥头爱侣为伴,无论天上人间,你该不会寂寥;
三生石畔倾心相许,不管宿命轮回,前世今生,你应该很幸福.
也许,只有生生世世的相依相偎,正是你一生渴盼的天长地久.
也许,只有千载万代的朝朝暮暮.正是你苦苦追求的海烂石枯.
侧耳听,谁在吟,多情却似总无情?轻声唱,谁会听,生愿同欢死同冢,让鲜红的热血为这不该发生的一切恩怨划上一个结束号吧.爱,本没有错与对,更没有该与不该,只有完与未完,了与未了......
钟情的人们会感叹-自古美女英雄总痴情;
钟情的人们会吟唱-那首炽热绵长的恋曲;
钟情的人们会铭记-踏雪无痕里的侠骨柔情;
钟情的人们会传诵-那段轰轰烈烈的美丽故事.......
爱,又有谁能说得清?
又是莺飞草长,柳绿桃红的阳春时节,我默默祈祷-冥冥中自有牵线人,但愿有来世,但愿有来生.




http://www.yuanma.org/data/2006/0803/article_1307.htm
架构基于FreeBSD和Postfix的IGENUS Webmail邮件系统
baidu
本文介绍使用FreeBSD+Postfix+Cyrus-sasl+Courier-imap+igenus+spamassassin+ Clamav+mailscanner+mailscanner-mrtg+mailman来架构一个具有多域名,有邮件列表、webmail、防病毒、防垃圾邮件、web管理界面的邮件系统。
Jacky, $Revision: 4.51 bate $Date: 2005-12-03
系统主要采用MailScanner+clamav+Spamd+APF来对病毒过滤和垃圾邮件过滤。
本文在4.10、5.3、5.4、6.0上安装测试通过,病毒过滤放弃采用amavisd。主要采用执行效率更高的MailSanner来对邮件过滤和垃圾邮件过滤,配置更容易,并且降低了系统开消。让系统更加稳定,经过严格病毒邮件测试成功率达到了100%。垃圾邮件过滤基本上达到了95%的成功率。
Table of Contents
Chapter 1. 系统安装
1.1 安装MySQL
1.2 安装Apache
1.3 安装PHP
1.4 安装zend
1.5 安装openssl
1.6 安装phpMyAdmin
1.7 通过phpMyadmin设置数据库
1.8安装Courier-imap
1.9安装 postfix 和 cyrus-sasl
1.10 安装expect
Chapter 2. 配置邮件服务器
2.1 配置rc.conf
2.2 配置postfix 和 cyrus-sasl
2.3 配置Courier-imap
Chapter 3. 手动设置第一个用户并测试
Chapter 4. 安装postfix管理工具
4.1安装本人开发的postfix管理工具
4.2 用户登录测试
Chapter 5. 防病毒与防垃圾邮件
5.1 安装Clamav
5.2 安装MailScanner
5.3 安装配置Spamassassin
5.4修改Postfix设定档main.cf
5.5修改mailscanner.conf
5.6新增MailScanner所要用到的资料夹
5.7把病毒提示信息改为中文
5.8MailScanner监管进出邮件
5.9 邮件流量监控(mailscanner-mrtg)安装与设置
5.10.安装APF防垃圾邮件
Chapter 6. 安装webmail
Chapter 7邮件列表(mailman)
Chapter 8. 查看系统状态
Chapter 1. 系统安装
安装之前:因用户数据都保存在/var目录下,因此安装FreeBSD时/var的空间应尽量大。FreeBSD的版本为5.3,按最小化安装,软件包只安装cvsup,安装结束后用cvsup更新ports树。在文档中假设服务器的ip地址为192.168.0.2,域名为 toping.net,主机名为mail.toping.net。
请兄弟们仔细一些,注意空格和TAB。
祝兄弟们好运。本人水平有限。如果发现文章中有什么错误和不当的地方请发邮件:scyz@toping.net。我会在第一时间给予答复。
1.1 安装MySQL
mail# cd /usr/ports/databases/mysql40-server
mail# make install clean
编辑/etc/rc.conf,加入
mysql_enable="YES"
1.2 安装Apache
mail# cd /usr/ports/www/apache2
mail# make install clean
编辑/etc/rc.conf,加入
Apache2_enable="YES"
1.3 安装PHP
mail# cd /usr/ports/www/mod_php4
mail# make install clean
我的选择:(注意别选DEBUG,否则会和ZEND有冲突)
[X] APACHE2 Use apache 2.x instead of apache 1.3.x
安装需要的PHP扩展模块
mail# cd /usr/ports/lang/php4-extensions
mail# make install clean
我选择了下面的模块:
[X] BCMATH bc style precision math functions
[X] BZ2 bzip2 library support
[X] CALENDAR calendar conversion support
[X] CRACK crack support
[X] CTYPE ctype functions
[X] CURL CURL support
[X] FTP FTP support
[X] GD GD library support
[X] GETTEXT gettext library support
[X] FILEINFO fileinfo support
[X] IMAP IMAP support
[X] MBSTRING multibyte string support
[X] MCAL Modular Calendar Access Library support
[X] MCRYPT Encryption support
[X] MCVE MCVE support
[X] MHASH Crypto-hashing support
[X] MYSQL MySQL database support
[X] PCRE Perl Compatible Regular Expression support
[X] POSIX POSIX-like functions
[X] SESSION session support
[X] TOKENIZER tokenizer support
[X] XML XML support
[X] ZLIB ZLIB support
最后在编辑/usr/local/etc/apache2/httpd.conf最后加入:
DirectoryIndex index.html index.html.var index.php
#注:在DirectoryIndex这里加入index.php,是为了让apache支持首页为index.php的首页文件
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
Group www、User www修改为: Group postfix、User postfix
注:以上这一步要在postfix安装后再操作
1.4.安装zend
mail# cd /usr/ports/devel/ZendOptimizer
mail# make install clean
因为版权的问题,他不会自动下载。这里你需要到他的官方网站去下载ZendOptimizer-2.5.10a-freebsd4.3-i386.tar.gz到/usr/ports/distfiles目录下面后再安装。
下载地址:
http://downloads.zend.com/optimizer/2.5.10/ZendOptimizer-2.5.10a-freebsd4.3-i386.tar.gz
完成后在/usr/local/etc/php.ini中加入:
[Zend]
zend_optimizer.optimization_level=15
zend_extension_manager.optimizer="/usr/local/lib/php/20020429/Optimizer"
zend_extension_manager.optimizer_ts="/usr/local/lib/php/20020429/Optimizer_TS"
zend_extension="/usr/local/lib/php/20020429/ZendExtensionManager.so"
zend_extension_ts="/usr/local/lib/php/20020429/ZendExtensionManager_TS.so"
重启apache安装完成。
1.5 安装openssl
mail# cd /usr/ports/security/openssl
mail# make install clean
1.6 安装phpMyAdmin
mail# cd /usr/ports/databases/phpmyadmin
mail# make fetch
注:(在这里建议直接下载后复制安装)
mail# cd /usr/ports/distfiles
mail# tar –zxvf PhpMyadmin-x.tar.gz
mail# mv /usr/local/www/phpMyAdmin-x /usr/local/www/data/dbadmin
修改/usr/local/www/data/dbadmin/config.inc.php
$cfg['PmaAbsoluteUri'] = 'http://192.168.0.2/dbadmin/';
$cfg['Servers'][$i]['auth_type'] = 'http'; // Authentication method (config, http or cookie based)?
注:指定phpmyadmin的认证方式为http方式。
在浏览器输入http://192.168. 0.2/dbadmin/,首次进行登入的用户名为root密码为空,登入后可以修改你的密码。
1.7 通过phpMyadmin设置数据库
建立postfix数据库(注意:数据库名称为postfix):
mail# mysql –u root –p
mysql# CREATE DATABASE `postfix` ;
mysql# use postfix;
下面为sql语句:
CREATE TABLE domaininfo (
domain_id int(5) NOT NULL auto_increment,
domain varchar(25) NOT NULL default '',
alias varchar(30) default NULL,
passwd varchar(35) NOT NULL default '',
usernum int(5) NOT NULL default '0',
quota int(11) NOT NULL default '0',
des varchar(30) default NULL,
expire date NOT NULL default '0000-00-00',
active tinyint(1) NOT NULL default '1',
create_time datetime default NULL,
PRIMARY KEY (domain_id),
UNIQUE KEY domain (domain),
KEY domain_id (domain_id)
) TYPE=MyISAM COMMENT='domain information';
INSERT INTO domaininfo VALUES (1,'admin',NULL,'$1$.j3.t12.$I7MGf7ZD2HrWwUWQF88Mg1',0,0,'Super Admin','0000-00-00',1,'0000-00-00 00:00:00');
CREATE TABLE userinfo (
id int(11) NOT NULL auto_increment,
userid varchar(20) NOT NULL default '',
domain_id int(5) NOT NULL default '0',
address varchar(50) NOT NULL default '',
alias varchar(60) default NULL,
passwd varchar(35) NOT NULL default '',
realname varchar(20) default NULL,
quota int(11) NOT NULL default '0',
active tinyint(1) NOT NULL default '0',
homedir varchar(60) NOT NULL default '',
maildir varchar(60) NOT NULL default '',
create_time datetime NOT NULL default '0000-00-00 00:00:00',
`fax` varchar(20) NOT NULL default '',
`telephone` varchar(15) NOT NULL default '',
`sex` int(1) NOT NULL default '0',
`year` int(4) NOT NULL default '0',
`MONTH` int(2) NOT NULL default '0',
`DAY` int(2) NOT NULL default '0',
`education` varchar(4) NOT NULL default '',
`marital` int(1) NOT NULL default '0',
`occupation` varchar(15) NOT NULL default '',
`companyname` varchar(30) NOT NULL default '',
`province` varchar(6) NOT NULL default '',
PRIMARY KEY (id),
UNIQUE KEY address (address)
) TYPE=InnoDB COMMENT='User Information';
注:对于初学者,建议以上操作都在phpmyadmin中操作更加的简便,如果后面要使用igenus请导入原来igenus的sql。
建立数据库用户并授以相应的权限
mail# mysql –u root –p
mysql# use mysql;
mysql# INSERT INTO user (host,user,password) VALUES('localhost','postfix','');
mysql# update user set password=password('postfix') where User='postfix';
mysql# GRANT ALL ON postfix.* TO postfix@localhost IDENTIFIED BY "postfix";
注:这里加用户名和密码都为:postfix。并授权对postfix数据库进行操作
1.8 安装Courier-imap
mail# cd /usr/ports/mail/courier-imap
mail# make install clean
我的选择:
[X] OPENSSL Build with OpenSSL support
[X] AUTH_MYSQL MySQL support
在/etc/rc.conf中加入:
courier_authdaemond_enable="YES"
courier_imap_pop3d_enable="YES"
courier_imap_imapd_enable="YES"
mail# cd /usr/local/etc/courier-imap
mail# cp imapd.cnf.dist imapd.cnf
mail# cp pop3d.cnf.dist pop3d.cnf
mail# /usr/local/etc/rc.d/courier-authdaemond.sh start
注:此时会在/var/run/authdaemond/下产生socket,如果没有下面这一步下面的认证无法通过。
mail# chmod +x /var/run/authdaemond
1.9 安装 postfix 和 cyrus-sasl
mail# cd /usr/ports/security/cyrus-sasl2
mail# make install WITH_AUTHDAEMON=yes
mail# make clean
创建/usr/local/lib/sasl2/smtpd.conf
pwcheck_method: authdaemond
log_level: 3
mech_list: PLAIN LOGIN
authdaemond_path:/var/run/authdaemond/socket
更详细的参数设置请看:
http://www.toping.net/bbs/htm_data/7/0508/330.html
至此,认证部分基本完成。
安装postfix
mail# cd /usr/ports/mail/postfix
mail# make install clean
我的选择:
[X] VDA VDA (Virtual Delivery Agent)
[X] MySQL MySQL map lookups (choose version with WITH_MYSQL_VER)
[X] TLS SSL and TLS
[X] SASL2 Cyrus SASLv2 (Simple Authentication and Security Layer)
回答下面的两问题:
You need user "postfix" added to group "mail".[是否将postfix用户加到mail用户组]
Would you like me to add it [y]? y
Would you like to activate Postfix in /etc/mail/mailer.conf [n]? n
在/etc/rc.conf中加入postfix启动所需的启动选项
在/etc/rc.conf中加入:
sendmail_enable="YES"
sendmail_flags="-bd"
sendmail_pidfile="/var/spool/postfix/pid/master.pid"
sendmail_procname="/usr/local/libexec/postfix/master"
sendmail_outbound_enable="NO"
sendmail_submit_enable="NO"
sendmail_msp_queue_enable="NO"
设置postfix启动所需
mail# ln -s /usr/local/sbin/sendmail /usr/sbin/sendmail
注:如果/usr/sbin/sendmail存在就删了再做上链接,如果升级内核和升级系统后要重新做这一步。
mail# echo ‘postfix: root’ >> /etc/aliases
mail# /usr/local/bin/newaliases
mail# chown postfix:postfix /etc/opiekeys
1.10 安装expect
用于Web客户端建立邮件用户
mail# cd /usr/ports/lang/expect
mail# make install clean
Chapter 2. 配置邮件服务器
本节主要讲述各种服务的参数配置。
2.1 配置rc.conf,编辑/etc/rc.conf
下面是前面所装软件都加入了启动选项的rc.conf配置:
mysql_enable="YES"
apache2_enable="YES"
courier_authdaemond_enable="YES"
courier_imap_pop3d_enable="YES"
courier_imap_imapd_enable="YES"
sendmail_enable="YES"
sendmail_flags="-bd"
sendmail_pidfile="/var/spool/postfix/pid/master.pid"
sendmail_procname="/usr/local/libexec/postfix/master"
sendmail_outbound_enable="NO"
sendmail_submit_enable="NO"
sendmail_msp_queue_enable="NO"
2.2 配置postfix 和 cyrus-sasl
(1)修改/usr/local/etc/postfix/main.cf,在文件最后加入以下内容
mail# ee /usr/local/etc/postfix/main.cf
smtpd_helo_required = yes
strict_rfc821_envelopes = yes
smtpd_etrn_restrictions = permit_mynetworks, reject
#=====================BASE=====================
myhostname = mail.toping.net
mydomain = toping.net
mydestination = $myhostname
local_recipient_maps =
command_directory = /usr/local/sbin
local_transport = virtual
#=====================MySQL=====================
virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:125
virtual_mailbox_base = /
virtual_mailbox_domains = mysql:/usr/local/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_limit = 51200000
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 125
virtual_transport = virtual
virtual_uid_maps = static:125
#=====================Quota=====================
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
virtual_overquota_bounce = yes
#====================SASL=====================
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_delay_reject=yes
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,permit_auth_destination,reject
smtpd_client_restrictions = permit_sasl_authenticated
更详细的参数设置请看论坛:
http://www.toping.net/bbs/htm_data/7/0601/871.html
(4)编辑/usr/local/etc/postfix/mysql_virtual_alias_maps.cf
mail# ee /usr/local/etc/postfix/mysql_virtual_alias_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT alias FROM userinfo WHERE address='%s' AND active = 1
(5)编辑/usr/local/etc/postfix/mysql_virtual_domains_maps.cf
mail# ee /usr/local/etc/postfix/mysql_virtual_domains_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT domain FROM domaininfo WHERE domain='%s'
(6)编辑/usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
mail# ee /usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT maildir FROM userinfo WHERE address='%s' AND active = 1
(7)编辑/usr/local/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
mail# ee /usr/local/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT quota FROM userinfo WHERE address='%s'
2.3 配置Courier-imap
(1)修改Courier相关设置,/usr/local/etc/courier-imap/imapd:
IMAP_CAPABILITY="IMAP4rev1 CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA"
(2)修改/usr/local/etc/courier-imap/pop3d
POP3AUTH="LOGIN CRAM-MD5 CRAM-SHA1"
(3)编辑修改/usr/local/etc/authlib/authmysqlrc
mail# mv /usr/local/etc/authlib/authmysqlrc /usr/local/etc/authlib/authmysqlrc_bak
mail# ee /usr/local/etc/authlib/authmysqlrc
MYSQL_SERVER localhost //数据库主机地址
MYSQL_USERNAME postfix //数据库用户名
MYSQL_PASSWORD postfix //数据库密码
MYSQL_PORT 0
MYSQL_OPT 0
MYSQL_DATABASE postfix //数据库名称
MYSQL_USER_TABLE userinfo
MYSQL_CRYPT_PWFIELD passwd
MYSQL_UID_FIELD '125'
MYSQL_GID_FIELD '125'
MYSQL_LOGIN_FIELD address
MYSQL_HOME_FIELD homedir
MYSQL_NAME_FIELD realname
MYSQL_MAILDIR_FIELD maildir
MYSQL_QUOTA_FIELD quota
注:这里得用tab键来跳格
(4)编辑/usr/local/etc/authlib/authdaemonrc
mail# mv /usr/local/etc/authlib/authdaemonrc /usr/local/etc/authlib/authdaemonrc_bak
mail# ee /usr/local/etc/authlib/authdaemonrc
authmodulelist="authmysql"
authmodulelistorig="authmysql"
version="authdaemond.mysql"
daemons=5
authdaemonvar=/var/run/authdaemond
subsystem=mail
DEBUG_LOGIN=0
DEFAULTOPTIONS="wbnodsn=1"
重启服务器
Chapter 3.手动设置第一个用户并测试
本章介绍如何开通用户,并且测试系统是否正常。
注:增加用户时请到这里生成加密后的密码后直接插入到数据库中就可以了。
http://www.toping.net/soft
mail# mysql
mysql> use postfix;
mysql> show tables;
+-------------------+
| Tables_in_postfix |
+-------------------+
| address |
| admin |
| card |
| domaininfo |
| lastauth |
| logs |
| message |
| personal |
| scheduler |
| stow |
| userinfo |
| vpopmail |
+-------------------+
12 rows in set (0.00 sec)
增加域名和管理员
mysql> desc domaininfo;
+-------------+-------------+------+-----+------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+------------+----------------+
| domain_id | int(5) | | PRI | NULL | auto_increment |
| domain | varchar(25) | | UNI | | |
| alias | varchar(30) | YES | | NULL | |
| passwd | varchar(35) | | | | |
| usernum | int(5) | | | 0 | |
| quota | int(11) | | | 0 | |
| des | varchar(30) | YES | | NULL | |
| expire | date | | | 0000-00-00 | |
| active | tinyint(1) | | | 1 | |
| create_time | datetime | YES | | NULL | |
+-------------+-------------+------+-----+------------+----------------+
10 rows in set (0.00 sec)
mysql> INSERT INTO `domaininfo` VALUES (7, 'toping.net', NULL, '$1$jNXThQXq$KPjm.WE2f2yX5rceY48vX. ', 50, 500, NULL, '0000-00-00', 1, '2005-04-19 23:19:11');
Query OK, 1 row affected (0.00 sec)
注:这里的toping.net的管理密码为:admin123
mysql> desc userinfo;
+-------------+-------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------------------+----------------+
| id | int(11) | | PRI | NULL | auto_increment |
| userid | varchar(20) | | | | |
| domain_id | int(5) | | | 0 | |
| address | varchar(50) | | UNI | | |
| alias | varchar(60) | YES | | NULL | |
| passwd | varchar(35) | | | | |
| realname | varchar(20) | YES | | NULL | |
| quota | int(11) | | | 0 | |
| active | tinyint(1) | | | 0 | |
| homedir | varchar(60) | | | | |
| maildir | varchar(60) | | | | |
| create_time | datetime | | | 0000-00-00 00:00:00 | |
| fax | varchar(20) | | | | |
| telephone | varchar(15) | | | | |
| sex | int(1) | | | 0 | |
| year | int(4) | | | 0 | |
| MONTH | int(2) | | | 0 | |
| DAY | int(2) | | | 0 | |
| education | varchar(4) | | | | |
| marital | int(1) | | | 0 | |
| occupation | varchar(15) | | | | |
| companyname | varchar(30) | | | | |
| province | varchar(6) | | | | |
+-------------+-------------+------+-----+---------------------+----------------+
23 rows in set (0.00 sec)
mysql> INSERT INTO `userinfo` VALUES (8, 'webmaster', 7, 'webmaster@toping.net', NULL,'$1$4DLQeNkz$QKCAQqg244XwvLl2SD11f0', 'webmaster', 209715200, 1, '/var/mail/toping.net/webmaster/', '/var/mail/toping.net/webmaster/Maildir/', '2005-04-20 23:45:17', '', '', 0, 0, 0, 0, '', 0, '', '', '');
注:这里的webmaster用户的邮箱密码为:000000
mysql>quit
设置用户的目录与权限:
Mail# mkdir -p /var/mail/toping.net/webmaster
Mail# /usr/local/bin/maildirmake /var/mail/toping.net/webmaster/Maildir
Mail# chmod -R 777 /var/mail/toping.net/
Mail# chown -R postfix:postfix /var/mail/toping.net
至此用户设置完毕,这里只使用一个域名,同理可以设置多个域名。
Chapter 4.安装postfix管理工具
本节主要介绍如何安装和使用本人开发的postfix管理工具。
4.1安装本人开发的postfix管理工具来设置第一个域名和用户
上传管理工具到网站目录
后修改include/config.inc.php中的
define(DOMAINSDIR,"/home/vmail"); 为 define(DOMAINSDIR,"/var/mail");
define(MYSQL_HOST, 'localhost'); 为 您的MySQL服务器的主机名
define(MYSQL_USER, 'root'); 为 您的MySQL的用户名
define(MYSQL_PASS, 'mypasswd'); 为 您的MySQL的密码
define(MYSQL_DATA, 'postfix'); 为 您的邮件服务器的数据库
修改完成后运行:http://mail.toping.net/webadmin/index.php
完装完成!!
4.2 用户登录测试
用户登录测试
安装p5-MIME-Base64
mail# cd /usr/ports/converters/p5-MIME-Base64/
mail# make install clean
通过p5-MIME-Base64来取得用户名和密码的base64编码
mail# perl -MMIME::Base64 -e 'print encode_base64("webmaster\@toping.net");'
d2VibWFzdGVyQHRvcGluZy5uZXQ=
mail# perl -MMIME::Base64 -e 'print encode_base64("000000");'
MDAwMDAw
测试发送邮件(端口:25):
mail# telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 0.
Escape character is '^]'.
220 mail.toping.net ESMTP Postfix
ehlo mail
250-mail.toping.net
250-PIPELINING
250-SIZE 4194304
250-VRFY
250-ETRN
250-AUTH NTLM LOGIN PLAIN OTP
250-AUTH=NTLM LOGIN PLAIN OTP
250 8BITMIME
auth login
334 VXNlcm5hbWU6
d2VibWFzdGVyQHRvcGluZy5uZXQ= //此为用户名id:webmaster@toping.net
334 UGFzc3dvcmQ6
MDAwMDAw //此为用户密码password:000000
235 Authentication successful
MAIL FROM: //告诉服务器发件人的Email地址
250 Ok
RCPT TO: //告诉服务器收件人的地址
250 OK
DATA //告诉服务器开始写信
354 End data with .
SUBJECT:test //subject后面填写的是邮件的主题
test
. //换行后输入.后按回车,表示信件内容书写完毕
250 Ok: queued as 58DC71D5
quit //发送信件,结束对话,退出SMTP服务器
221 Bye
Connection closed by foreign host
测试收取邮件(端口:110):
mail# telnet 127.0.0.1 110
Trying 127.0.0.1...
Connected to 0
Escape character is '^]'
+OK Hello there
user webmaster@toping.net
+OK Password required
pass 000000
+OK logged in
list
+OK POP3 clients that break here, they violate STD53
1 2217
retr 1 //返回第一封信的全部内容
+OK 2217 octets follow.
Return-Path:
X-Original-To: webmaster@toping.net
Delivered-To: webmaster@toping.net
Received: from mail (localhost.toping.net [127.0.0.1])
by mail.toping.net (Postfix) with ESMTP id 58DC71D5
for ; Mon, 9 Aug 2004 21:11:20 +0800 (CST)
SUBJECT:test
Message-Id: <20040809131120.58DC71D5@mail.toping.net>
Date: Mon, 9 Aug 2004 21:11:20 +0800 (CST)
From: webmaster@toping.net
To: undisclosed-recipients:;
test
.
dele 1 //删除
+OK Deleted
quit
+OK Bye-bye
Connection closed by foreign host
也可以使用任何其它的邮件客户端程序来测试,如foxmail、Outlook Express等等。
Chapter 5. 防病毒与防垃圾邮件
本章介绍病毒与垃圾邮件的防范。
5.1 安装Clamav
mail# cd /usr/ports/security/clamav
mail# make install clean
我的选择:
[X] MILTER Compile the milter interface
[X] CURL Support URL downloading
[X] LIBUNRAR Support for external Unrar library
要想clamav能自动的启动请在/etc/rc.conf中加入:
clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"
重启服务器
测试杀毒
mail# clamscan -r -i /usr/local/www/data
----------- SCAN SUMMARY -----------
Known viruses: 41293
Engine version: 0.87.1
Scanned directories: 53
Scanned files: 602
Infected files: 0
Data scanned: 41.51 MB
Time: 18.294 sec (0 m 18 s)
升级病毒库
mail# freshclam
ClamAV update process started at Sun Dec 4 01:10:02 2005
main.cvd is up to date (version: 34, sigs: 39625, f-level: 5, builder: tkojm)
daily.cvd is up to date (version: 1200, sigs: 1669, f-level: 6, builder: tomek)
5.2 安装MailScanner
mail# cd /usr/ports/mail/mailscanner
mail# make install
第一次执行安装因此需执行make initial-config以建立基本配置文件
mail# make initial-config
mail# make clean
5.3 安装SpamAssassin
mail# cd /usr/ports/mail/p5-Mail-SpamAssassin
mail# make install clean
我的选择:
[X] AS_ROOT Run spamd as root (recommended)
[X] DOMAINKEYS DomainKeys support
[X] SSL Build with SSL support for spamd/spamc
[X] MYSQL Add MySQL support
[X] RAZOR Add Vipul's Razor support
[X] SPF_QUERY Add SPF query support
[X] RELAY_COUNTRY Relay country support
[X] TOOLS Install SpamAssassin tools
5.4修改Postfix设定档main.cf
mail# ee /usr/local/etc/postfix/main.cf
#header_checks = regexp:/usr/local/etc/postfix/header_checks //默认值
header_checks = regexp:/usr/local/etc/postfix/header_checks //把注释去掉
编辑/usr/local/etc/postfix/header_checks
mail# ee /usr/local/etc/postfix/header_checks
/^Received:/ HOLD //新加入
5.5修改mailscanner.conf
mail# ee /usr/local/etc/MailScanner/MailScanner.conf
#Run As User = //默认值
Run As User = postfix //修改后
#Run As Group = //默认值
Run As Group = postfix //修改后
#Incoming Queue Dir = /var/spool/mqueue.in //默认值
Incoming Queue Dir = /var/spool/postfix/hold //修改后
#Outgoing Queue Dir = /var/spool/mqueue //默认值
Outgoing Queue Dir = /var/spool/postfix/incoming //修改后
#MTA = sendmail //默认值
MTA = postfix //修改后
#Virus Scanners = none //默认值
Virus Scanners = clamav //修改后
#Use SpamAssassin = no //默认值
Use SpamAssassin = yes //修改后
5.6新增MailScanner所要用到的资料夹
mail# mkdir /var/spool/MailScanner
mail# mkdir /var/spool/MailScanner/incoming
mail# mkdir /var/spool/MailScanner/quarantine
mail# chown postfix:postfix /var/spool/MailScanner/incoming
mail# chown postfix:postfix /var/spool/MailScanner/quarantine
mail# touch /usr/local/etc/MailScanner/rules/bounce.rules //新建一个空白文件,要不然会出错。
mail# chmod –R 777 /var/spool/postfix
mail#cp /usr/local/etc/MailScanner/mcp/10_example.cf.sample /usr/local/etc/MailScanner/mcp/10_example.cf
mail#cp /usr/local/etc/MailScanner/mcp/mcp.spam.assassin.prefs.conf.sample
/usr/local/etc/MailScanner/mcp/mcp.spam.assassin.prefs.conf
注:这里的倒数一、二行实际操作中为一行
重新启动服务器
测试病毒过滤:
mail# telnet localhost 25
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.toping.net ESMTP Postfix
mail from:webmaster@toping.net
250 Ok
rcpt to:webmaster@toping.net
250 Ok
data
354 End data with .
Subject:Virus test
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
.
250 Ok: queued as F0C221CC20 //出现F0C221CC20这行表示mailscanner运行成功了
quit
221 Bye
Connection closed by foreign host.
5.7把病毒提示信息改为中文
预设系统提示信息为英文,可以下载我修改的中文包。
http://mail.toping.net/mailscanner/cn.rar
注:把下载下来的文件解压后放到/usr/local/share/MailScanner/reports/cn下面去
mail# ee /usr/local/etc/MailScanner/MailScanner.conf
#%report-dir% = /usr/local/share/MailScanner/reports/en //默认值(加载英文)
%report-dir% = /usr/local/share/MailScanner/reports/cn //修改后为读取中文
5.8.用MailScanner来监管进出邮件
mail# ee MailScanner.conf
Archive Mail = %rules-dir%/archive.rules
mail# ee archive.rules
方法一:互相备份, 以上这样并不会造成 loop
FromOrTo: a@toping.net yes forward b@toping.net
FromOrTo: b@toping.net yes forward a@toping.net
方法二:可以 forward 到复数信箱
FromOrTo: a@toping.net yes forward b@toping.net c@toping.net d@toping.net
方法三:同时备份到一个或多个档案及一个或多个信箱
FromOrTo: a@toping.net yes forward /var/spool/MailScanner/archive/a_user_backup.mbx /var/spool/MailScanner/archive/a_user_backup.mbx b@toping.net scyz2@163.com
注:以上为一行,该档案要先建立且确定该档案拥有者与 MailScanner.conf 的 Run As User = XXXXXXX 相同
方法四:备份到数据夹及多个信箱或档案
FromOrTo: a@toping.net yes forward /var/spool/MailScanner/archive/ b@toping.net scyz2@163.com /var/spool/MailScanner/archive/a_user_backup.mbx
注:以上为一行,权限同SAMPLE3;注意事项, 他会依日期再分数据夹, 日期数据夹内的文件名称 mail queue ID, 格式为 postfix mail queue 格式
更详细的mailscanner.cf的参数请看论坛:
http://www.toping.net/bbs/htm_data/7/0509/533.html
5.9.安装MailScanner-mrtg
mail# cd /usr/ports/mail/ mailscanner-mrtg
mail# make install clean
mailscanner-mrtg相关设置
mail# cd /usr/local/etc/mailscanner-mrtg //切换至mailscanner-mrtg 目录
mail# cp mailscanner-mrtg.conf.sample mailscanner-mrtg.conf
mail# cp mailscanner-mrtg.cfg.sample mailscanner-mrtg.cfg
mail# chmod 644 mailscanner-mrtg.conf //更改权限为可修改
mail# chmod 644 mailscanner-mrtg.cfg //更改权限为可修改
mail# ee mailscanner-mrtg.conf //修改mailscanner-mrtg.conf内容如下
#MTA = sendmail //默认值
MTA = postfix //修改后
#Where the MTA puts mail before MailScanner gets it
#Incoming Queue Dir = /var/spool/postfix.in/deferred/ # Postfix
#Incoming Queue Dir = /var/spool/exim.in/input/ # Exim
Incoming Queue Dir = /var/spool/mqueue.in/ # Sendmail //默认值
Incoming Queue Dir = /var/spool/postfix/hold # Postfix //修改后
#Where MailScanner puts your mail after it is scanned
#Outgoing Queue Dir = /var/spool/postfix/incoming/ # Postfix
#Outgoing Queue Dir = /var/spool/exim/input # Exim (?)
Outgoing Queue Dir = /var/spool/mqueue/ # Sendmail //默认值
Outgoing Queue Dir = /var/spool/postfix/incoming/ # Postfix //修改后(把#拿掉)
#Which interfaces to monitor (comma separated list)
Interfaces to Monitor = fxp0 //默认值
Interfaces to Monitor = vr0 //修改后(改成您的网卡吧)
mail# ee /usr/local/etc/apache/httpd.conf //修改apache配置以便读取mailscanner-mrtg数据
内容如下:
#MailScanner Setting
Alias /mailscanner-mrtg/ "/usr/local/www/mailscanner-mrtg/"
Step5.产生MailScanner-Mrtg流量图
mail# /usr/local/bin/mrtg /usr/local/etc/mailscanner-mrtg/mailscanner-mrtg.cfg
mail# crontab -e
*/10 * * * * /usr/local/bin/mrtg /usr/local/etc/mailscanner-mrtg/mailscanner-mrtg.cfg
5.10.安装APF防垃圾邮件
http://apf.org.cn
下载地址:
http://mail.toping.net/apf/apf.rar
下载最新的APF包解压到/usr/local/etc/postfix目录。
这时/usr/local/etc/postfix目录里边有一个apf-posftix.pl的文件
修改/usr/local/etc/postfix/master.cf
mail# ee /usr/local/etc/postfix/master.cf
加入:
apf unix - n n - - spawn
user=nobody argv=/usr/bin/perl /usr/local/etc/postfix/apf-postfix.pl
增加黑白名单:
1、IP黑名单:
ip_black_list.txt
2、IP白名单
ip_white_list.txt
3、域名黑名单
dn_black_list.txt
4、域名白名单
dn_white_list.txt
Chapter 6. 安装webmail
如何使用本人修改的iGENUS for Postfix 2.01
下载地址:
http://mail.toping.net/igenus/igenus_for_postfix_2.01.rar
webmail使用igenus,版本是iGENUS for Postfix 2.01
建议下载本人修改的iGENUS for Postfix 2.01
安装方法参考论坛:
http://www.toping.net/bbs/htm_data/7/0507/174.html
mail# cd /usr/local/www/data
mail# chown -R postfix:postfix phpMyAdmin
mail# cd /usr/local/etc
mail# cp php.ini-dist php.ini
修改/usr/local/etc/php.ini
webmail上传附件设置:
register_globals = On
max_execution_time = 30 //改为60 (增加处理脚本的时间限制)
memory_limit = 8M //改为40M (这样才能发10M的附件)
post_max_size = 8M //改为10M
upload_max_filesize = 2M //改为10M
重启apache
mail# /usr/local/etc/rc.d/apache2.sh restart
Chapter 7. 安装邮件列表(MAILMAN)安装
本节主要讲述邮件列表mailman的安装和配置
设置/etc/make.conf
mail# ee /etc/make.conf
# mail/mailman
MAIL_GID="mailman"
安装mailman
mail# portinstall -m BATCH=yes mail/mailman
配置apache(新加入)
mail# ee /usr/local/etc/apache2/httpd.conf
ScriptAlias /mailman "/usr/local/mailman/cgi-bin"
AllowOverride None
Options none
Order allow,deny
Allow from all
Alias /pipermail "/usr/local/mailman/archives/public"
AllowOverride None
Options +FollowSymlinks
Order allow,deny
Allow from all
用check_perms
mail# /usr/local/mailman/bin/check_perms -f
注:加上-f参数可以修复。
修改/usr/local/mailman/Mailman/mm_cfg.py,加上:
DEFAULT_EMAIL_HOST = 'lists.toping.net'
MTA = 'Postfix'
POSTFIX_STYLE_VIRTUAL_DOMAINS = ['lists.toping.net', 'toping.net']
添加一个邮件列表:
mail# /usr/local/mailman/bin/newlist mailman
把用户添加到邮件列表里测试,建一个文本文件,比如maillists.txt,一行一个邮件地址,然后执行如下命令:
mail# /usr/local/mailman/bin/add_members -n maillists.txt mailman
mail# ee postfix/main.cf
owner_request_special = no
recipient_delimiter = +
virtual_alias_maps = hash:/usr/local/mailman/data/virtual-mailman,
mysql:/usr/local/etc/postfix/mysql/mysql_virtual_alias_maps.cf
alias_maps = hash:/usr/local/mailman/data/aliases,hash:/usr/local/etc/postfix/aliases
mail# ee Default.py
DEFAULT_EMAIL_HOST = 'lists.toping.net'
DEFAULT_URL_HOST = 'lists.toping.net'
DEFAULT_URL_PATTERN = 'http://%s/mailman/'
DEFAULT_SERVER_LANGUAGE = 'zh_CN'
设置virtual-mailman
mail# ee /usr/local/mailman/data/virtual-mailman
lists.meilai.com anything
邮件列表的配置
Default.py和mm_cfg.py的配置是针对全局的,对全局配置文件的修改不会影响到已经存在的邮件列表。mailman提供了config_list这个命令来对单个邮件列表进行配置,先导出该邮件列表的配置:
mail# /usr/local/mailman/bin/config_list -o /tmp/config mailman
然后修改/tmp/config文件,里面有很多选项,可以根据自己的要求修改,比如加上回复到邮件列表的邮件头、去掉mailman自动加的边脚等等,最后把这个配置文件导回给邮件列表就可以了:
mail# /usr/local/mailman/bin/config_list -i /tmp/config mailman
下面你可以通过web去管理你的邮件列表:
http://lists.toping.net/mailman/admin/mailman
查看邮件列表信息:
http://lists.toping.net/mailman/listinfo/mailman/
功能太强大了,这里不一一的讲解,自己去发现吧
Chapter 7. 查看系统状态
本节主要讲述phpSysInfo工具的安装和配置
安装phpSysInfo(2.2)
mail# cd /usr/ports/www/phpSysInfo
mail# make install clean
mail# cd /usr/local/www/data-dist/phpSysInfo
mail# cp config.php.new config.php
架构基于FreeBSD和Postfix的IGENUS Webmail邮件系统
baidu
本文介绍使用FreeBSD+Postfix+Cyrus-sasl+Courier-imap+igenus+spamassassin+ Clamav+mailscanner+mailscanner-mrtg+mailman来架构一个具有多域名,有邮件列表、webmail、防病毒、防垃圾邮件、web管理界面的邮件系统。
Jacky, $Revision: 4.51 bate $Date: 2005-12-03
系统主要采用MailScanner+clamav+Spamd+APF来对病毒过滤和垃圾邮件过滤。
本文在4.10、5.3、5.4、6.0上安装测试通过,病毒过滤放弃采用amavisd。主要采用执行效率更高的MailSanner来对邮件过滤和垃圾邮件过滤,配置更容易,并且降低了系统开消。让系统更加稳定,经过严格病毒邮件测试成功率达到了100%。垃圾邮件过滤基本上达到了95%的成功率。
Table of Contents
Chapter 1. 系统安装
1.1 安装MySQL
1.2 安装Apache
1.3 安装PHP
1.4 安装zend
1.5 安装openssl
1.6 安装phpMyAdmin
1.7 通过phpMyadmin设置数据库
1.8安装Courier-imap
1.9安装 postfix 和 cyrus-sasl
1.10 安装expect
Chapter 2. 配置邮件服务器
2.1 配置rc.conf
2.2 配置postfix 和 cyrus-sasl
2.3 配置Courier-imap
Chapter 3. 手动设置第一个用户并测试
Chapter 4. 安装postfix管理工具
4.1安装本人开发的postfix管理工具
4.2 用户登录测试
Chapter 5. 防病毒与防垃圾邮件
5.1 安装Clamav
5.2 安装MailScanner
5.3 安装配置Spamassassin
5.4修改Postfix设定档main.cf
5.5修改mailscanner.conf
5.6新增MailScanner所要用到的资料夹
5.7把病毒提示信息改为中文
5.8MailScanner监管进出邮件
5.9 邮件流量监控(mailscanner-mrtg)安装与设置
5.10.安装APF防垃圾邮件
Chapter 6. 安装webmail
Chapter 7邮件列表(mailman)
Chapter 8. 查看系统状态
Chapter 1. 系统安装
安装之前:因用户数据都保存在/var目录下,因此安装FreeBSD时/var的空间应尽量大。FreeBSD的版本为5.3,按最小化安装,软件包只安装cvsup,安装结束后用cvsup更新ports树。在文档中假设服务器的ip地址为192.168.0.2,域名为 toping.net,主机名为mail.toping.net。
请兄弟们仔细一些,注意空格和TAB。
祝兄弟们好运。本人水平有限。如果发现文章中有什么错误和不当的地方请发邮件:scyz@toping.net。我会在第一时间给予答复。
1.1 安装MySQL
mail# cd /usr/ports/databases/mysql40-server
mail# make install clean
编辑/etc/rc.conf,加入
mysql_enable="YES"
1.2 安装Apache
mail# cd /usr/ports/www/apache2
mail# make install clean
编辑/etc/rc.conf,加入
Apache2_enable="YES"
1.3 安装PHP
mail# cd /usr/ports/www/mod_php4
mail# make install clean
我的选择:(注意别选DEBUG,否则会和ZEND有冲突)
[X] APACHE2 Use apache 2.x instead of apache 1.3.x
安装需要的PHP扩展模块
mail# cd /usr/ports/lang/php4-extensions
mail# make install clean
我选择了下面的模块:
[X] BCMATH bc style precision math functions
[X] BZ2 bzip2 library support
[X] CALENDAR calendar conversion support
[X] CRACK crack support
[X] CTYPE ctype functions
[X] CURL CURL support
[X] FTP FTP support
[X] GD GD library support
[X] GETTEXT gettext library support
[X] FILEINFO fileinfo support
[X] IMAP IMAP support
[X] MBSTRING multibyte string support
[X] MCAL Modular Calendar Access Library support
[X] MCRYPT Encryption support
[X] MCVE MCVE support
[X] MHASH Crypto-hashing support
[X] MYSQL MySQL database support
[X] PCRE Perl Compatible Regular Expression support
[X] POSIX POSIX-like functions
[X] SESSION session support
[X] TOKENIZER tokenizer support
[X] XML XML support
[X] ZLIB ZLIB support
最后在编辑/usr/local/etc/apache2/httpd.conf最后加入:
DirectoryIndex index.html index.html.var index.php
#注:在DirectoryIndex这里加入index.php,是为了让apache支持首页为index.php的首页文件
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
Group www、User www修改为: Group postfix、User postfix
注:以上这一步要在postfix安装后再操作
1.4.安装zend
mail# cd /usr/ports/devel/ZendOptimizer
mail# make install clean
因为版权的问题,他不会自动下载。这里你需要到他的官方网站去下载ZendOptimizer-2.5.10a-freebsd4.3-i386.tar.gz到/usr/ports/distfiles目录下面后再安装。
下载地址:
http://downloads.zend.com/optimizer/2.5.10/ZendOptimizer-2.5.10a-freebsd4.3-i386.tar.gz
完成后在/usr/local/etc/php.ini中加入:
[Zend]
zend_optimizer.optimization_level=15
zend_extension_manager.optimizer="/usr/local/lib/php/20020429/Optimizer"
zend_extension_manager.optimizer_ts="/usr/local/lib/php/20020429/Optimizer_TS"
zend_extension="/usr/local/lib/php/20020429/ZendExtensionManager.so"
zend_extension_ts="/usr/local/lib/php/20020429/ZendExtensionManager_TS.so"
重启apache安装完成。
1.5 安装openssl
mail# cd /usr/ports/security/openssl
mail# make install clean
1.6 安装phpMyAdmin
mail# cd /usr/ports/databases/phpmyadmin
mail# make fetch
注:(在这里建议直接下载后复制安装)
mail# cd /usr/ports/distfiles
mail# tar –zxvf PhpMyadmin-x.tar.gz
mail# mv /usr/local/www/phpMyAdmin-x /usr/local/www/data/dbadmin
修改/usr/local/www/data/dbadmin/config.inc.php
$cfg['PmaAbsoluteUri'] = 'http://192.168.0.2/dbadmin/';
$cfg['Servers'][$i]['auth_type'] = 'http'; // Authentication method (config, http or cookie based)?
注:指定phpmyadmin的认证方式为http方式。
在浏览器输入http://192.168. 0.2/dbadmin/,首次进行登入的用户名为root密码为空,登入后可以修改你的密码。
1.7 通过phpMyadmin设置数据库
建立postfix数据库(注意:数据库名称为postfix):
mail# mysql –u root –p
mysql# CREATE DATABASE `postfix` ;
mysql# use postfix;
下面为sql语句:
CREATE TABLE domaininfo (
domain_id int(5) NOT NULL auto_increment,
domain varchar(25) NOT NULL default '',
alias varchar(30) default NULL,
passwd varchar(35) NOT NULL default '',
usernum int(5) NOT NULL default '0',
quota int(11) NOT NULL default '0',
des varchar(30) default NULL,
expire date NOT NULL default '0000-00-00',
active tinyint(1) NOT NULL default '1',
create_time datetime default NULL,
PRIMARY KEY (domain_id),
UNIQUE KEY domain (domain),
KEY domain_id (domain_id)
) TYPE=MyISAM COMMENT='domain information';
INSERT INTO domaininfo VALUES (1,'admin',NULL,'$1$.j3.t12.$I7MGf7ZD2HrWwUWQF88Mg1',0,0,'Super Admin','0000-00-00',1,'0000-00-00 00:00:00');
CREATE TABLE userinfo (
id int(11) NOT NULL auto_increment,
userid varchar(20) NOT NULL default '',
domain_id int(5) NOT NULL default '0',
address varchar(50) NOT NULL default '',
alias varchar(60) default NULL,
passwd varchar(35) NOT NULL default '',
realname varchar(20) default NULL,
quota int(11) NOT NULL default '0',
active tinyint(1) NOT NULL default '0',
homedir varchar(60) NOT NULL default '',
maildir varchar(60) NOT NULL default '',
create_time datetime NOT NULL default '0000-00-00 00:00:00',
`fax` varchar(20) NOT NULL default '',
`telephone` varchar(15) NOT NULL default '',
`sex` int(1) NOT NULL default '0',
`year` int(4) NOT NULL default '0',
`MONTH` int(2) NOT NULL default '0',
`DAY` int(2) NOT NULL default '0',
`education` varchar(4) NOT NULL default '',
`marital` int(1) NOT NULL default '0',
`occupation` varchar(15) NOT NULL default '',
`companyname` varchar(30) NOT NULL default '',
`province` varchar(6) NOT NULL default '',
PRIMARY KEY (id),
UNIQUE KEY address (address)
) TYPE=InnoDB COMMENT='User Information';
注:对于初学者,建议以上操作都在phpmyadmin中操作更加的简便,如果后面要使用igenus请导入原来igenus的sql。
建立数据库用户并授以相应的权限
mail# mysql –u root –p
mysql# use mysql;
mysql# INSERT INTO user (host,user,password) VALUES('localhost','postfix','');
mysql# update user set password=password('postfix') where User='postfix';
mysql# GRANT ALL ON postfix.* TO postfix@localhost IDENTIFIED BY "postfix";
注:这里加用户名和密码都为:postfix。并授权对postfix数据库进行操作
1.8 安装Courier-imap
mail# cd /usr/ports/mail/courier-imap
mail# make install clean
我的选择:
[X] OPENSSL Build with OpenSSL support
[X] AUTH_MYSQL MySQL support
在/etc/rc.conf中加入:
courier_authdaemond_enable="YES"
courier_imap_pop3d_enable="YES"
courier_imap_imapd_enable="YES"
mail# cd /usr/local/etc/courier-imap
mail# cp imapd.cnf.dist imapd.cnf
mail# cp pop3d.cnf.dist pop3d.cnf
mail# /usr/local/etc/rc.d/courier-authdaemond.sh start
注:此时会在/var/run/authdaemond/下产生socket,如果没有下面这一步下面的认证无法通过。
mail# chmod +x /var/run/authdaemond
1.9 安装 postfix 和 cyrus-sasl
mail# cd /usr/ports/security/cyrus-sasl2
mail# make install WITH_AUTHDAEMON=yes
mail# make clean
创建/usr/local/lib/sasl2/smtpd.conf
pwcheck_method: authdaemond
log_level: 3
mech_list: PLAIN LOGIN
authdaemond_path:/var/run/authdaemond/socket
更详细的参数设置请看:
http://www.toping.net/bbs/htm_data/7/0508/330.html
至此,认证部分基本完成。
安装postfix
mail# cd /usr/ports/mail/postfix
mail# make install clean
我的选择:
[X] VDA VDA (Virtual Delivery Agent)
[X] MySQL MySQL map lookups (choose version with WITH_MYSQL_VER)
[X] TLS SSL and TLS
[X] SASL2 Cyrus SASLv2 (Simple Authentication and Security Layer)
回答下面的两问题:
You need user "postfix" added to group "mail".[是否将postfix用户加到mail用户组]
Would you like me to add it [y]? y
Would you like to activate Postfix in /etc/mail/mailer.conf [n]? n
在/etc/rc.conf中加入postfix启动所需的启动选项
在/etc/rc.conf中加入:
sendmail_enable="YES"
sendmail_flags="-bd"
sendmail_pidfile="/var/spool/postfix/pid/master.pid"
sendmail_procname="/usr/local/libexec/postfix/master"
sendmail_outbound_enable="NO"
sendmail_submit_enable="NO"
sendmail_msp_queue_enable="NO"
设置postfix启动所需
mail# ln -s /usr/local/sbin/sendmail /usr/sbin/sendmail
注:如果/usr/sbin/sendmail存在就删了再做上链接,如果升级内核和升级系统后要重新做这一步。
mail# echo ‘postfix: root’ >> /etc/aliases
mail# /usr/local/bin/newaliases
mail# chown postfix:postfix /etc/opiekeys
1.10 安装expect
用于Web客户端建立邮件用户
mail# cd /usr/ports/lang/expect
mail# make install clean
Chapter 2. 配置邮件服务器
本节主要讲述各种服务的参数配置。
2.1 配置rc.conf,编辑/etc/rc.conf
下面是前面所装软件都加入了启动选项的rc.conf配置:
mysql_enable="YES"
apache2_enable="YES"
courier_authdaemond_enable="YES"
courier_imap_pop3d_enable="YES"
courier_imap_imapd_enable="YES"
sendmail_enable="YES"
sendmail_flags="-bd"
sendmail_pidfile="/var/spool/postfix/pid/master.pid"
sendmail_procname="/usr/local/libexec/postfix/master"
sendmail_outbound_enable="NO"
sendmail_submit_enable="NO"
sendmail_msp_queue_enable="NO"
2.2 配置postfix 和 cyrus-sasl
(1)修改/usr/local/etc/postfix/main.cf,在文件最后加入以下内容
mail# ee /usr/local/etc/postfix/main.cf
smtpd_helo_required = yes
strict_rfc821_envelopes = yes
smtpd_etrn_restrictions = permit_mynetworks, reject
#=====================BASE=====================
myhostname = mail.toping.net
mydomain = toping.net
mydestination = $myhostname
local_recipient_maps =
command_directory = /usr/local/sbin
local_transport = virtual
#=====================MySQL=====================
virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:125
virtual_mailbox_base = /
virtual_mailbox_domains = mysql:/usr/local/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_limit = 51200000
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 125
virtual_transport = virtual
virtual_uid_maps = static:125
#=====================Quota=====================
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
virtual_overquota_bounce = yes
#====================SASL=====================
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_delay_reject=yes
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,permit_auth_destination,reject
smtpd_client_restrictions = permit_sasl_authenticated
更详细的参数设置请看论坛:
http://www.toping.net/bbs/htm_data/7/0601/871.html
(4)编辑/usr/local/etc/postfix/mysql_virtual_alias_maps.cf
mail# ee /usr/local/etc/postfix/mysql_virtual_alias_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT alias FROM userinfo WHERE address='%s' AND active = 1
(5)编辑/usr/local/etc/postfix/mysql_virtual_domains_maps.cf
mail# ee /usr/local/etc/postfix/mysql_virtual_domains_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT domain FROM domaininfo WHERE domain='%s'
(6)编辑/usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
mail# ee /usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT maildir FROM userinfo WHERE address='%s' AND active = 1
(7)编辑/usr/local/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
mail# ee /usr/local/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT quota FROM userinfo WHERE address='%s'
2.3 配置Courier-imap
(1)修改Courier相关设置,/usr/local/etc/courier-imap/imapd:
IMAP_CAPABILITY="IMAP4rev1 CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA"
(2)修改/usr/local/etc/courier-imap/pop3d
POP3AUTH="LOGIN CRAM-MD5 CRAM-SHA1"
(3)编辑修改/usr/local/etc/authlib/authmysqlrc
mail# mv /usr/local/etc/authlib/authmysqlrc /usr/local/etc/authlib/authmysqlrc_bak
mail# ee /usr/local/etc/authlib/authmysqlrc
MYSQL_SERVER localhost //数据库主机地址
MYSQL_USERNAME postfix //数据库用户名
MYSQL_PASSWORD postfix //数据库密码
MYSQL_PORT 0
MYSQL_OPT 0
MYSQL_DATABASE postfix //数据库名称
MYSQL_USER_TABLE userinfo
MYSQL_CRYPT_PWFIELD passwd
MYSQL_UID_FIELD '125'
MYSQL_GID_FIELD '125'
MYSQL_LOGIN_FIELD address
MYSQL_HOME_FIELD homedir
MYSQL_NAME_FIELD realname
MYSQL_MAILDIR_FIELD maildir
MYSQL_QUOTA_FIELD quota
注:这里得用tab键来跳格
(4)编辑/usr/local/etc/authlib/authdaemonrc
mail# mv /usr/local/etc/authlib/authdaemonrc /usr/local/etc/authlib/authdaemonrc_bak
mail# ee /usr/local/etc/authlib/authdaemonrc
authmodulelist="authmysql"
authmodulelistorig="authmysql"
version="authdaemond.mysql"
daemons=5
authdaemonvar=/var/run/authdaemond
subsystem=mail
DEBUG_LOGIN=0
DEFAULTOPTIONS="wbnodsn=1"
重启服务器
Chapter 3.手动设置第一个用户并测试
本章介绍如何开通用户,并且测试系统是否正常。
注:增加用户时请到这里生成加密后的密码后直接插入到数据库中就可以了。
http://www.toping.net/soft
mail# mysql
mysql> use postfix;
mysql> show tables;
+-------------------+
| Tables_in_postfix |
+-------------------+
| address |
| admin |
| card |
| domaininfo |
| lastauth |
| logs |
| message |
| personal |
| scheduler |
| stow |
| userinfo |
| vpopmail |
+-------------------+
12 rows in set (0.00 sec)
增加域名和管理员
mysql> desc domaininfo;
+-------------+-------------+------+-----+------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+------------+----------------+
| domain_id | int(5) | | PRI | NULL | auto_increment |
| domain | varchar(25) | | UNI | | |
| alias | varchar(30) | YES | | NULL | |
| passwd | varchar(35) | | | | |
| usernum | int(5) | | | 0 | |
| quota | int(11) | | | 0 | |
| des | varchar(30) | YES | | NULL | |
| expire | date | | | 0000-00-00 | |
| active | tinyint(1) | | | 1 | |
| create_time | datetime | YES | | NULL | |
+-------------+-------------+------+-----+------------+----------------+
10 rows in set (0.00 sec)
mysql> INSERT INTO `domaininfo` VALUES (7, 'toping.net', NULL, '$1$jNXThQXq$KPjm.WE2f2yX5rceY48vX. ', 50, 500, NULL, '0000-00-00', 1, '2005-04-19 23:19:11');
Query OK, 1 row affected (0.00 sec)
注:这里的toping.net的管理密码为:admin123
mysql> desc userinfo;
+-------------+-------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------------------+----------------+
| id | int(11) | | PRI | NULL | auto_increment |
| userid | varchar(20) | | | | |
| domain_id | int(5) | | | 0 | |
| address | varchar(50) | | UNI | | |
| alias | varchar(60) | YES | | NULL | |
| passwd | varchar(35) | | | | |
| realname | varchar(20) | YES | | NULL | |
| quota | int(11) | | | 0 | |
| active | tinyint(1) | | | 0 | |
| homedir | varchar(60) | | | | |
| maildir | varchar(60) | | | | |
| create_time | datetime | | | 0000-00-00 00:00:00 | |
| fax | varchar(20) | | | | |
| telephone | varchar(15) | | | | |
| sex | int(1) | | | 0 | |
| year | int(4) | | | 0 | |
| MONTH | int(2) | | | 0 | |
| DAY | int(2) | | | 0 | |
| education | varchar(4) | | | | |
| marital | int(1) | | | 0 | |
| occupation | varchar(15) | | | | |
| companyname | varchar(30) | | | | |
| province | varchar(6) | | | | |
+-------------+-------------+------+-----+---------------------+----------------+
23 rows in set (0.00 sec)
mysql> INSERT INTO `userinfo` VALUES (8, 'webmaster', 7, 'webmaster@toping.net', NULL,'$1$4DLQeNkz$QKCAQqg244XwvLl2SD11f0', 'webmaster', 209715200, 1, '/var/mail/toping.net/webmaster/', '/var/mail/toping.net/webmaster/Maildir/', '2005-04-20 23:45:17', '', '', 0, 0, 0, 0, '', 0, '', '', '');
注:这里的webmaster用户的邮箱密码为:000000
mysql>quit
设置用户的目录与权限:
Mail# mkdir -p /var/mail/toping.net/webmaster
Mail# /usr/local/bin/maildirmake /var/mail/toping.net/webmaster/Maildir
Mail# chmod -R 777 /var/mail/toping.net/
Mail# chown -R postfix:postfix /var/mail/toping.net
至此用户设置完毕,这里只使用一个域名,同理可以设置多个域名。
Chapter 4.安装postfix管理工具
本节主要介绍如何安装和使用本人开发的postfix管理工具。
4.1安装本人开发的postfix管理工具来设置第一个域名和用户
上传管理工具到网站目录
后修改include/config.inc.php中的
define(DOMAINSDIR,"/home/vmail"); 为 define(DOMAINSDIR,"/var/mail");
define(MYSQL_HOST, 'localhost'); 为 您的MySQL服务器的主机名
define(MYSQL_USER, 'root'); 为 您的MySQL的用户名
define(MYSQL_PASS, 'mypasswd'); 为 您的MySQL的密码
define(MYSQL_DATA, 'postfix'); 为 您的邮件服务器的数据库
修改完成后运行:http://mail.toping.net/webadmin/index.php
完装完成!!
4.2 用户登录测试
用户登录测试
安装p5-MIME-Base64
mail# cd /usr/ports/converters/p5-MIME-Base64/
mail# make install clean
通过p5-MIME-Base64来取得用户名和密码的base64编码
mail# perl -MMIME::Base64 -e 'print encode_base64("webmaster\@toping.net");'
d2VibWFzdGVyQHRvcGluZy5uZXQ=
mail# perl -MMIME::Base64 -e 'print encode_base64("000000");'
MDAwMDAw
测试发送邮件(端口:25):
mail# telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 0.
Escape character is '^]'.
220 mail.toping.net ESMTP Postfix
ehlo mail
250-mail.toping.net
250-PIPELINING
250-SIZE 4194304
250-VRFY
250-ETRN
250-AUTH NTLM LOGIN PLAIN OTP
250-AUTH=NTLM LOGIN PLAIN OTP
250 8BITMIME
auth login
334 VXNlcm5hbWU6
d2VibWFzdGVyQHRvcGluZy5uZXQ= //此为用户名id:webmaster@toping.net
334 UGFzc3dvcmQ6
MDAwMDAw //此为用户密码password:000000
235 Authentication successful
MAIL FROM: //告诉服务器发件人的Email地址
250 Ok
RCPT TO: //告诉服务器收件人的地址
250 OK
DATA //告诉服务器开始写信
354 End data with .
SUBJECT:test //subject后面填写的是邮件的主题
test
. //换行后输入.后按回车,表示信件内容书写完毕
250 Ok: queued as 58DC71D5
quit //发送信件,结束对话,退出SMTP服务器
221 Bye
Connection closed by foreign host
测试收取邮件(端口:110):
mail# telnet 127.0.0.1 110
Trying 127.0.0.1...
Connected to 0
Escape character is '^]'
+OK Hello there
user webmaster@toping.net
+OK Password required
pass 000000
+OK logged in
list
+OK POP3 clients that break here, they violate STD53
1 2217
retr 1 //返回第一封信的全部内容
+OK 2217 octets follow.
Return-Path:
X-Original-To: webmaster@toping.net
Delivered-To: webmaster@toping.net
Received: from mail (localhost.toping.net [127.0.0.1])
by mail.toping.net (Postfix) with ESMTP id 58DC71D5
for ; Mon, 9 Aug 2004 21:11:20 +0800 (CST)
SUBJECT:test
Message-Id: <20040809131120.58DC71D5@mail.toping.net>
Date: Mon, 9 Aug 2004 21:11:20 +0800 (CST)
From: webmaster@toping.net
To: undisclosed-recipients:;
test
.
dele 1 //删除
+OK Deleted
quit
+OK Bye-bye
Connection closed by foreign host
也可以使用任何其它的邮件客户端程序来测试,如foxmail、Outlook Express等等。
Chapter 5. 防病毒与防垃圾邮件
本章介绍病毒与垃圾邮件的防范。
5.1 安装Clamav
mail# cd /usr/ports/security/clamav
mail# make install clean
我的选择:
[X] MILTER Compile the milter interface
[X] CURL Support URL downloading
[X] LIBUNRAR Support for external Unrar library
要想clamav能自动的启动请在/etc/rc.conf中加入:
clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"
重启服务器
测试杀毒
mail# clamscan -r -i /usr/local/www/data
----------- SCAN SUMMARY -----------
Known viruses: 41293
Engine version: 0.87.1
Scanned directories: 53
Scanned files: 602
Infected files: 0
Data scanned: 41.51 MB
Time: 18.294 sec (0 m 18 s)
升级病毒库
mail# freshclam
ClamAV update process started at Sun Dec 4 01:10:02 2005
main.cvd is up to date (version: 34, sigs: 39625, f-level: 5, builder: tkojm)
daily.cvd is up to date (version: 1200, sigs: 1669, f-level: 6, builder: tomek)
5.2 安装MailScanner
mail# cd /usr/ports/mail/mailscanner
mail# make install
第一次执行安装因此需执行make initial-config以建立基本配置文件
mail# make initial-config
mail# make clean
5.3 安装SpamAssassin
mail# cd /usr/ports/mail/p5-Mail-SpamAssassin
mail# make install clean
我的选择:
[X] AS_ROOT Run spamd as root (recommended)
[X] DOMAINKEYS DomainKeys support
[X] SSL Build with SSL support for spamd/spamc
[X] MYSQL Add MySQL support
[X] RAZOR Add Vipul's Razor support
[X] SPF_QUERY Add SPF query support
[X] RELAY_COUNTRY Relay country support
[X] TOOLS Install SpamAssassin tools
5.4修改Postfix设定档main.cf
mail# ee /usr/local/etc/postfix/main.cf
#header_checks = regexp:/usr/local/etc/postfix/header_checks //默认值
header_checks = regexp:/usr/local/etc/postfix/header_checks //把注释去掉
编辑/usr/local/etc/postfix/header_checks
mail# ee /usr/local/etc/postfix/header_checks
/^Received:/ HOLD //新加入
5.5修改mailscanner.conf
mail# ee /usr/local/etc/MailScanner/MailScanner.conf
#Run As User = //默认值
Run As User = postfix //修改后
#Run As Group = //默认值
Run As Group = postfix //修改后
#Incoming Queue Dir = /var/spool/mqueue.in //默认值
Incoming Queue Dir = /var/spool/postfix/hold //修改后
#Outgoing Queue Dir = /var/spool/mqueue //默认值
Outgoing Queue Dir = /var/spool/postfix/incoming //修改后
#MTA = sendmail //默认值
MTA = postfix //修改后
#Virus Scanners = none //默认值
Virus Scanners = clamav //修改后
#Use SpamAssassin = no //默认值
Use SpamAssassin = yes //修改后
5.6新增MailScanner所要用到的资料夹
mail# mkdir /var/spool/MailScanner
mail# mkdir /var/spool/MailScanner/incoming
mail# mkdir /var/spool/MailScanner/quarantine
mail# chown postfix:postfix /var/spool/MailScanner/incoming
mail# chown postfix:postfix /var/spool/MailScanner/quarantine
mail# touch /usr/local/etc/MailScanner/rules/bounce.rules //新建一个空白文件,要不然会出错。
mail# chmod –R 777 /var/spool/postfix
mail#cp /usr/local/etc/MailScanner/mcp/10_example.cf.sample /usr/local/etc/MailScanner/mcp/10_example.cf
mail#cp /usr/local/etc/MailScanner/mcp/mcp.spam.assassin.prefs.conf.sample
/usr/local/etc/MailScanner/mcp/mcp.spam.assassin.prefs.conf
注:这里的倒数一、二行实际操作中为一行
重新启动服务器
测试病毒过滤:
mail# telnet localhost 25
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.toping.net ESMTP Postfix
mail from:webmaster@toping.net
250 Ok
rcpt to:webmaster@toping.net
250 Ok
data
354 End data with .
Subject:Virus test
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
.
250 Ok: queued as F0C221CC20 //出现F0C221CC20这行表示mailscanner运行成功了
quit
221 Bye
Connection closed by foreign host.
5.7把病毒提示信息改为中文
预设系统提示信息为英文,可以下载我修改的中文包。
http://mail.toping.net/mailscanner/cn.rar
注:把下载下来的文件解压后放到/usr/local/share/MailScanner/reports/cn下面去
mail# ee /usr/local/etc/MailScanner/MailScanner.conf
#%report-dir% = /usr/local/share/MailScanner/reports/en //默认值(加载英文)
%report-dir% = /usr/local/share/MailScanner/reports/cn //修改后为读取中文
5.8.用MailScanner来监管进出邮件
mail# ee MailScanner.conf
Archive Mail = %rules-dir%/archive.rules
mail# ee archive.rules
方法一:互相备份, 以上这样并不会造成 loop
FromOrTo: a@toping.net yes forward b@toping.net
FromOrTo: b@toping.net yes forward a@toping.net
方法二:可以 forward 到复数信箱
FromOrTo: a@toping.net yes forward b@toping.net c@toping.net d@toping.net
方法三:同时备份到一个或多个档案及一个或多个信箱
FromOrTo: a@toping.net yes forward /var/spool/MailScanner/archive/a_user_backup.mbx /var/spool/MailScanner/archive/a_user_backup.mbx b@toping.net scyz2@163.com
注:以上为一行,该档案要先建立且确定该档案拥有者与 MailScanner.conf 的 Run As User = XXXXXXX 相同
方法四:备份到数据夹及多个信箱或档案
FromOrTo: a@toping.net yes forward /var/spool/MailScanner/archive/ b@toping.net scyz2@163.com /var/spool/MailScanner/archive/a_user_backup.mbx
注:以上为一行,权限同SAMPLE3;注意事项, 他会依日期再分数据夹, 日期数据夹内的文件名称 mail queue ID, 格式为 postfix mail queue 格式
更详细的mailscanner.cf的参数请看论坛:
http://www.toping.net/bbs/htm_data/7/0509/533.html
5.9.安装MailScanner-mrtg
mail# cd /usr/ports/mail/ mailscanner-mrtg
mail# make install clean
mailscanner-mrtg相关设置
mail# cd /usr/local/etc/mailscanner-mrtg //切换至mailscanner-mrtg 目录
mail# cp mailscanner-mrtg.conf.sample mailscanner-mrtg.conf
mail# cp mailscanner-mrtg.cfg.sample mailscanner-mrtg.cfg
mail# chmod 644 mailscanner-mrtg.conf //更改权限为可修改
mail# chmod 644 mailscanner-mrtg.cfg //更改权限为可修改
mail# ee mailscanner-mrtg.conf //修改mailscanner-mrtg.conf内容如下
#MTA = sendmail //默认值
MTA = postfix //修改后
#Where the MTA puts mail before MailScanner gets it
#Incoming Queue Dir = /var/spool/postfix.in/deferred/ # Postfix
#Incoming Queue Dir = /var/spool/exim.in/input/ # Exim
Incoming Queue Dir = /var/spool/mqueue.in/ # Sendmail //默认值
Incoming Queue Dir = /var/spool/postfix/hold # Postfix //修改后
#Where MailScanner puts your mail after it is scanned
#Outgoing Queue Dir = /var/spool/postfix/incoming/ # Postfix
#Outgoing Queue Dir = /var/spool/exim/input # Exim (?)
Outgoing Queue Dir = /var/spool/mqueue/ # Sendmail //默认值
Outgoing Queue Dir = /var/spool/postfix/incoming/ # Postfix //修改后(把#拿掉)
#Which interfaces to monitor (comma separated list)
Interfaces to Monitor = fxp0 //默认值
Interfaces to Monitor = vr0 //修改后(改成您的网卡吧)
mail# ee /usr/local/etc/apache/httpd.conf //修改apache配置以便读取mailscanner-mrtg数据
内容如下:
#MailScanner Setting
Alias /mailscanner-mrtg/ "/usr/local/www/mailscanner-mrtg/"
Step5.产生MailScanner-Mrtg流量图
mail# /usr/local/bin/mrtg /usr/local/etc/mailscanner-mrtg/mailscanner-mrtg.cfg
mail# crontab -e
*/10 * * * * /usr/local/bin/mrtg /usr/local/etc/mailscanner-mrtg/mailscanner-mrtg.cfg
5.10.安装APF防垃圾邮件
http://apf.org.cn
下载地址:
http://mail.toping.net/apf/apf.rar
下载最新的APF包解压到/usr/local/etc/postfix目录。
这时/usr/local/etc/postfix目录里边有一个apf-posftix.pl的文件
修改/usr/local/etc/postfix/master.cf
mail# ee /usr/local/etc/postfix/master.cf
加入:
apf unix - n n - - spawn
user=nobody argv=/usr/bin/perl /usr/local/etc/postfix/apf-postfix.pl
增加黑白名单:
1、IP黑名单:
ip_black_list.txt
2、IP白名单
ip_white_list.txt
3、域名黑名单
dn_black_list.txt
4、域名白名单
dn_white_list.txt
Chapter 6. 安装webmail
如何使用本人修改的iGENUS for Postfix 2.01
下载地址:
http://mail.toping.net/igenus/igenus_for_postfix_2.01.rar
webmail使用igenus,版本是iGENUS for Postfix 2.01
建议下载本人修改的iGENUS for Postfix 2.01
安装方法参考论坛:
http://www.toping.net/bbs/htm_data/7/0507/174.html
mail# cd /usr/local/www/data
mail# chown -R postfix:postfix phpMyAdmin
mail# cd /usr/local/etc
mail# cp php.ini-dist php.ini
修改/usr/local/etc/php.ini
webmail上传附件设置:
register_globals = On
max_execution_time = 30 //改为60 (增加处理脚本的时间限制)
memory_limit = 8M //改为40M (这样才能发10M的附件)
post_max_size = 8M //改为10M
upload_max_filesize = 2M //改为10M
重启apache
mail# /usr/local/etc/rc.d/apache2.sh restart
Chapter 7. 安装邮件列表(MAILMAN)安装
本节主要讲述邮件列表mailman的安装和配置
设置/etc/make.conf
mail# ee /etc/make.conf
# mail/mailman
MAIL_GID="mailman"
安装mailman
mail# portinstall -m BATCH=yes mail/mailman
配置apache(新加入)
mail# ee /usr/local/etc/apache2/httpd.conf
ScriptAlias /mailman "/usr/local/mailman/cgi-bin"
AllowOverride None
Options none
Order allow,deny
Allow from all
Alias /pipermail "/usr/local/mailman/archives/public"
AllowOverride None
Options +FollowSymlinks
Order allow,deny
Allow from all
用check_perms
mail# /usr/local/mailman/bin/check_perms -f
注:加上-f参数可以修复。
修改/usr/local/mailman/Mailman/mm_cfg.py,加上:
DEFAULT_EMAIL_HOST = 'lists.toping.net'
MTA = 'Postfix'
POSTFIX_STYLE_VIRTUAL_DOMAINS = ['lists.toping.net', 'toping.net']
添加一个邮件列表:
mail# /usr/local/mailman/bin/newlist mailman
把用户添加到邮件列表里测试,建一个文本文件,比如maillists.txt,一行一个邮件地址,然后执行如下命令:
mail# /usr/local/mailman/bin/add_members -n maillists.txt mailman
mail# ee postfix/main.cf
owner_request_special = no
recipient_delimiter = +
virtual_alias_maps = hash:/usr/local/mailman/data/virtual-mailman,
mysql:/usr/local/etc/postfix/mysql/mysql_virtual_alias_maps.cf
alias_maps = hash:/usr/local/mailman/data/aliases,hash:/usr/local/etc/postfix/aliases
mail# ee Default.py
DEFAULT_EMAIL_HOST = 'lists.toping.net'
DEFAULT_URL_HOST = 'lists.toping.net'
DEFAULT_URL_PATTERN = 'http://%s/mailman/'
DEFAULT_SERVER_LANGUAGE = 'zh_CN'
设置virtual-mailman
mail# ee /usr/local/mailman/data/virtual-mailman
lists.meilai.com anything
邮件列表的配置
Default.py和mm_cfg.py的配置是针对全局的,对全局配置文件的修改不会影响到已经存在的邮件列表。mailman提供了config_list这个命令来对单个邮件列表进行配置,先导出该邮件列表的配置:
mail# /usr/local/mailman/bin/config_list -o /tmp/config mailman
然后修改/tmp/config文件,里面有很多选项,可以根据自己的要求修改,比如加上回复到邮件列表的邮件头、去掉mailman自动加的边脚等等,最后把这个配置文件导回给邮件列表就可以了:
mail# /usr/local/mailman/bin/config_list -i /tmp/config mailman
下面你可以通过web去管理你的邮件列表:
http://lists.toping.net/mailman/admin/mailman
查看邮件列表信息:
http://lists.toping.net/mailman/listinfo/mailman/
功能太强大了,这里不一一的讲解,自己去发现吧
Chapter 7. 查看系统状态
本节主要讲述phpSysInfo工具的安装和配置
安装phpSysInfo(2.2)
mail# cd /usr/ports/www/phpSysInfo
mail# make install clean
mail# cd /usr/local/www/data-dist/phpSysInfo
mail# cp config.php.new config.php
$ su - root
Password:
# sysinstall
选择Configure>Distributions,选择man项,点击OK。
Password:
# sysinstall
选择Configure>Distributions,选择man项,点击OK。
#include <list>
#include <iostream>
using namespace std;
int main(int argc, char * argv[])
{
list<int> lst;
for (int i = 0; i < 10; ++i)
lst.push_back(i); //将i推入list<int>
list<int>::iterator it = lst.end();
++it;
cout << *it << endl;
++it;
cout << *it << endl; //移动指针
return 0;
}
$ ./test
0
1
list<string> m_member;
for (i=m_mllist.begin(); i!=m_mllist.end(); ++i)
{
outFile << *i << endl;
fprintf(stderr,"Line=%d,File=%s",__LINE__,__FILE__);
list<string>::const_iterator itr=i->m_member.begin();
fprintf(stderr,"%s",itr->c_str());
}
#include <iostream>
using namespace std;
int main(int argc, char * argv[])
{
list<int> lst;
for (int i = 0; i < 10; ++i)
lst.push_back(i); //将i推入list<int>
list<int>::iterator it = lst.end();
++it;
cout << *it << endl;
++it;
cout << *it << endl; //移动指针
return 0;
}
$ ./test
0
1
list<string> m_member;
for (i=m_mllist.begin(); i!=m_mllist.end(); ++i)
{
outFile << *i << endl;
fprintf(stderr,"Line=%d,File=%s",__LINE__,__FILE__);
list<string>::const_iterator itr=i->m_member.begin();
fprintf(stderr,"%s",itr->c_str());
}
杭州市近年相继获得了联合国人居奖、国家环境保护模范城市、全国绿化模范城市、全国社会治安群众满意率最高城市、中国最佳商业城市三连冠等众多荣誉称号。
特别值得注意的是,杭州市统计局对3000户杭州居民家庭的抽样调查显示,17.6%的杭州人感到幸福,比较幸福的占32.0%,幸福程度一般的占47%,感觉到不幸福和感觉不是很幸福的人只占了3.4%。
“杭州现象”赢得无数关注的目光。这些目光同时也在探究:原因何在?
发展与美丽联姻
“我是在1986年第一次到杭州的,印象最深的是杭州非常美丽,但经济还未腾飞;时隔20年再次来到杭州,我惊讶于她的变化,她已是中国经济最为发达的城市之一,而她依然平静而美丽。”在中国投资环境论坛上,世界银行中国和蒙古局局长杜大伟如此感叹。“最主要的是,杭州在发展经济的同时,仍然保持了一个美丽城市应有的品质;作为一个典范,杭州一方面实现了经济的快速发展,同时又很好保护了环境,提高了生活质量。”
从美丽天堂到投资天堂,这一进程概括了杭州20年的巨大变化,而世行官员杜大伟的个人感受正是其中的缩影。从世行4年的跟踪调查结果看,杭州是一座在和谐中创造财富的城市,各种要素的均衡发展形成了强大的吸引力。
和谐创造财富
杭州经济社会发展非常迅速,“经济强市、文化名城、旅游胜地、天堂硅谷”的四张“金名片”日益锃亮。杭州市还从自身特色出发,围绕打造“天堂硅谷”,加快高新技术产业发展,拉长了通讯、软件、集成电路、数字电视、动漫、网络游戏等六条产业链,形成一大批优秀高新企业,以此引领“和谐创业”,提高人民群众的经济生活品质。
杭州的市民,讲诚信、守秩序,对外来务工者和外来投资者普遍比较友善。他们还很注意个人之间、家庭之间、部门和行业之间的平衡和协调。这些都极大地增强了投资创业者的安全感、归宿感和幸福感。
有容,乃悦
2006年农民工网站新农门网对十多个城市5000名外来民工所作的问卷调查显示,杭州是最能留住农民工的城市之一。
杭州市副市长杨戌标说,农民工对一座城市的满意度,意味着这座城市的和谐程度,这其中杭州民工学校的“进城教育”功不可没。5年来,杭州市700多个建筑工地开办了免费民工学校,十万多名外来务工者在这里开始融入杭州,向新市民转变。民工学校解决的不仅仅是外来务工人员的职业教育问题,更重要的是找到了城市与城市建设者之间的对话平台,让民工真实感觉到城市给予的关爱,彼此接纳,和谐相处。
杨戌标说,像要求一个合格市民那样要求外来民工之前,首先应该给予他们市民应享受的权利。在我们抱怨、指责外来民工给城市管理带来这样那样的问题之前,从市民到城市的管理者都应该想一想,我们有没有尽到教育、引导的责任?
老吾老 幼吾幼
2006年,杭州市政府正式通过《杭州市城镇老年居民大病住院基本医疗保险试行办法》和《杭州市少年儿童大病住院基本医疗保险试行办法》,两个办法将分别于2007年4月1日和9月1日施行。杭州的城镇居民,从此将人人享有基本医疗保障。
两个新政策的共同点在于,老人、孩子参保的范围,仅包含了住院和规定病种门诊的费用,试行办法先满足“大病住院”基本需求有医疗保障,避免一个家庭因病致贫。缴费方式上,以个人、家庭缴费为主,财政适当补助。儿童医保,在杭打工者子女,也可参保。
真正的公平是机会平等
目前,杭州市已有191所中小学实施“名校集团化”战略,成立了51个教育集团,城区的义务教育阶段优质学校比例达到80%,优质高中招生比例达到86.1%。
浙江省委常委、杭州市委书记王国平说:“优质教育公平是社会公平的基础,是和谐社会的基石。我们不是搞精英教育、贵族教育,而是要坚持平民化、普及化。目前优质教育收费过高,其根本原因是优质教育供不应求。我们要通过‘名校集团化’战略,以最低的成本增加优质教育的供给,从根本上解决教育乱收费,让困难群体也能‘上好学’。”
杭州市实施“名校集团化”战略,有四点共识:教育公平是社会公平的基础,而优质教育公平,是解决像杭州这样的发达地区所有教育问题的关键;“名校集团化”是实现杭州教育均衡化的必由之路;教育办得好不好,应该由学生和家长说了算,应该由社会和市场说了算;教育质量上去,教育费用下来,是市委、市政府的目标和承诺,坚持把教育的社会效益放在第一位,让更多的孩子接受更好的教育,不让他们输在人生的起跑线上,是市委、市政府的责任。
人与自然
好房子的标准很多,小区环境、配套设施、房屋结构等都是非常重要的因素,但归根结底只有一条,就是生活舒适度——给人一种安静、愉悦的感受。“杭州的人居和居住环境,在全国都是处于比较高的水平。”作为第二届杭州市“最佳人居环境奖”和“最佳人居奖”专家评审团的主任委员,中国工程院院士、建筑大师程泰宁认为,杭州有着得天独厚的自然条件和人文底蕴,这是很好的基础。近年来政府和开发商在打造居住品质上也下了很大工夫,许多开发商都想把品质做得好一点,形成了良性竞争的氛围。有些小区把原来的山水树木都原汁原味地保留了下来,体现了自然味道,这样的环境在北京、上海等地方都是很难看到的。
荣登“中国幸福城市”榜首
“中国幸福城市”排行由《求是》杂志社旗下的《小康》杂志联合新浪网、央视国际、中国网等网络媒体对中国70个城市的“幸福度”进行调查。调查结果显示,杭州名列榜首。
《小康》杂志的总结报道中形容杭州拥有“‘天堂’般的幸福”:“在这样一个风景如画的城市居住的人也都有一种心满意足的幸福感,这种幸福感也直接反映在了数次的调查中。据了解,杭州是在各项幸福指标中获得冠军最多的城市。让很多杭州人自豪的是:在杭州,富人和穷人之间的幸福指数差距并不很大,因为健康、亲情、休闲、环境等都是快乐的源泉。”
“幸福在哪里呀,幸福在哪里,幸福在那小朋友的眼睛里,那里有红花呀,那里有绿草,还有那会唱歌的小黄鹂……”
特别值得注意的是,杭州市统计局对3000户杭州居民家庭的抽样调查显示,17.6%的杭州人感到幸福,比较幸福的占32.0%,幸福程度一般的占47%,感觉到不幸福和感觉不是很幸福的人只占了3.4%。
“杭州现象”赢得无数关注的目光。这些目光同时也在探究:原因何在?
发展与美丽联姻
“我是在1986年第一次到杭州的,印象最深的是杭州非常美丽,但经济还未腾飞;时隔20年再次来到杭州,我惊讶于她的变化,她已是中国经济最为发达的城市之一,而她依然平静而美丽。”在中国投资环境论坛上,世界银行中国和蒙古局局长杜大伟如此感叹。“最主要的是,杭州在发展经济的同时,仍然保持了一个美丽城市应有的品质;作为一个典范,杭州一方面实现了经济的快速发展,同时又很好保护了环境,提高了生活质量。”
从美丽天堂到投资天堂,这一进程概括了杭州20年的巨大变化,而世行官员杜大伟的个人感受正是其中的缩影。从世行4年的跟踪调查结果看,杭州是一座在和谐中创造财富的城市,各种要素的均衡发展形成了强大的吸引力。
和谐创造财富
杭州经济社会发展非常迅速,“经济强市、文化名城、旅游胜地、天堂硅谷”的四张“金名片”日益锃亮。杭州市还从自身特色出发,围绕打造“天堂硅谷”,加快高新技术产业发展,拉长了通讯、软件、集成电路、数字电视、动漫、网络游戏等六条产业链,形成一大批优秀高新企业,以此引领“和谐创业”,提高人民群众的经济生活品质。
杭州的市民,讲诚信、守秩序,对外来务工者和外来投资者普遍比较友善。他们还很注意个人之间、家庭之间、部门和行业之间的平衡和协调。这些都极大地增强了投资创业者的安全感、归宿感和幸福感。
有容,乃悦
2006年农民工网站新农门网对十多个城市5000名外来民工所作的问卷调查显示,杭州是最能留住农民工的城市之一。
杭州市副市长杨戌标说,农民工对一座城市的满意度,意味着这座城市的和谐程度,这其中杭州民工学校的“进城教育”功不可没。5年来,杭州市700多个建筑工地开办了免费民工学校,十万多名外来务工者在这里开始融入杭州,向新市民转变。民工学校解决的不仅仅是外来务工人员的职业教育问题,更重要的是找到了城市与城市建设者之间的对话平台,让民工真实感觉到城市给予的关爱,彼此接纳,和谐相处。
杨戌标说,像要求一个合格市民那样要求外来民工之前,首先应该给予他们市民应享受的权利。在我们抱怨、指责外来民工给城市管理带来这样那样的问题之前,从市民到城市的管理者都应该想一想,我们有没有尽到教育、引导的责任?
老吾老 幼吾幼
2006年,杭州市政府正式通过《杭州市城镇老年居民大病住院基本医疗保险试行办法》和《杭州市少年儿童大病住院基本医疗保险试行办法》,两个办法将分别于2007年4月1日和9月1日施行。杭州的城镇居民,从此将人人享有基本医疗保障。
两个新政策的共同点在于,老人、孩子参保的范围,仅包含了住院和规定病种门诊的费用,试行办法先满足“大病住院”基本需求有医疗保障,避免一个家庭因病致贫。缴费方式上,以个人、家庭缴费为主,财政适当补助。儿童医保,在杭打工者子女,也可参保。
真正的公平是机会平等
目前,杭州市已有191所中小学实施“名校集团化”战略,成立了51个教育集团,城区的义务教育阶段优质学校比例达到80%,优质高中招生比例达到86.1%。
浙江省委常委、杭州市委书记王国平说:“优质教育公平是社会公平的基础,是和谐社会的基石。我们不是搞精英教育、贵族教育,而是要坚持平民化、普及化。目前优质教育收费过高,其根本原因是优质教育供不应求。我们要通过‘名校集团化’战略,以最低的成本增加优质教育的供给,从根本上解决教育乱收费,让困难群体也能‘上好学’。”
杭州市实施“名校集团化”战略,有四点共识:教育公平是社会公平的基础,而优质教育公平,是解决像杭州这样的发达地区所有教育问题的关键;“名校集团化”是实现杭州教育均衡化的必由之路;教育办得好不好,应该由学生和家长说了算,应该由社会和市场说了算;教育质量上去,教育费用下来,是市委、市政府的目标和承诺,坚持把教育的社会效益放在第一位,让更多的孩子接受更好的教育,不让他们输在人生的起跑线上,是市委、市政府的责任。
人与自然
好房子的标准很多,小区环境、配套设施、房屋结构等都是非常重要的因素,但归根结底只有一条,就是生活舒适度——给人一种安静、愉悦的感受。“杭州的人居和居住环境,在全国都是处于比较高的水平。”作为第二届杭州市“最佳人居环境奖”和“最佳人居奖”专家评审团的主任委员,中国工程院院士、建筑大师程泰宁认为,杭州有着得天独厚的自然条件和人文底蕴,这是很好的基础。近年来政府和开发商在打造居住品质上也下了很大工夫,许多开发商都想把品质做得好一点,形成了良性竞争的氛围。有些小区把原来的山水树木都原汁原味地保留了下来,体现了自然味道,这样的环境在北京、上海等地方都是很难看到的。
荣登“中国幸福城市”榜首
“中国幸福城市”排行由《求是》杂志社旗下的《小康》杂志联合新浪网、央视国际、中国网等网络媒体对中国70个城市的“幸福度”进行调查。调查结果显示,杭州名列榜首。
《小康》杂志的总结报道中形容杭州拥有“‘天堂’般的幸福”:“在这样一个风景如画的城市居住的人也都有一种心满意足的幸福感,这种幸福感也直接反映在了数次的调查中。据了解,杭州是在各项幸福指标中获得冠军最多的城市。让很多杭州人自豪的是:在杭州,富人和穷人之间的幸福指数差距并不很大,因为健康、亲情、休闲、环境等都是快乐的源泉。”
“幸福在哪里呀,幸福在哪里,幸福在那小朋友的眼睛里,那里有红花呀,那里有绿草,还有那会唱歌的小黄鹂……”
cvs co src/entplatform-entadmin
cvs co ports/entplatform-entadmin
CVSROOT=:ext:xiangdong2@cvs.internal.sina.com.cn:/cvsroot/mailrept
环境变量:export 或者:setenv
当年的包搬家时候给丢了,记录一下,呵呵!
cvs co ports/entplatform-entadmin
CVSROOT=:ext:xiangdong2@cvs.internal.sina.com.cn:/cvsroot/mailrept
环境变量:export 或者:setenv
set CVSROOT=:ext:xiangdong2@cvs.internal.sina.com.cn:/cvsroot/mailrept //FreeBSD
当年的包搬家时候给丢了,记录一下,呵呵!
#include <string>
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
ifstream fin("MyData.txt");
string str; while(getline(fin,str))
{
//一行一行地读,直到失败为止
cout<<str<<endl; //显示出来
}
return 0;
}
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
ofstream outfile;
ifstream infile;
char value;
outfile.open("a.txt");
outfile << "abcd";
outfile.close();
infile.open("a.txt");
if (infile.is_open())
{
while(infile.get(value))
cout<<value;
}
cout << endl;
infile.close();
return 0;
}
#include "iostream"
#include "str.h"
#include <fstream>
#include <sstream> //用来连接字符串的
using namespace std;
int main()
{
/*
char *pVar = NULL;
cout << strinfo ;
cin >> strinfo;
if( strinfo == "winter" )
cout << "you are winter!"<<endl;
strinfo += " , Welcome to China!";
cout << strinfo ;
string strtmp = "How are you? " + strinfo;
for(int i = 0 ; i < strtmp.size(); i ++)
cout<<strtmp<<strtmp.size();
*/
ifstream fin("MyData.txt");
string str;
ostringstream osTmp;
while(getline(fin,str))
{
osTmp<<"select enterpriseid from domain where enterpriseid="<<str;
cout<<str<<endl; //显示出来
}
cout <<osTmp.str();
}
ostringstream osTmp
osTmp<<"select enterpriseid from domain where enterpriseid="<<enterpriseID<<" and name like'%"<<_defaultConf.defaultDomain<<"' limit 1";
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
ifstream fin("MyData.txt");
string str; while(getline(fin,str))
{
//一行一行地读,直到失败为止
cout<<str<<endl; //显示出来
}
return 0;
}
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
ofstream outfile;
ifstream infile;
char value;
outfile.open("a.txt");
outfile << "abcd";
outfile.close();
infile.open("a.txt");
if (infile.is_open())
{
while(infile.get(value))
cout<<value;
}
cout << endl;
infile.close();
return 0;
}
#include "iostream"
#include "str.h"
#include <fstream>
#include <sstream> //用来连接字符串的
using namespace std;
int main()
{
/*
char *pVar = NULL;
cout << strinfo ;
cin >> strinfo;
if( strinfo == "winter" )
cout << "you are winter!"<<endl;
strinfo += " , Welcome to China!";
cout << strinfo ;
string strtmp = "How are you? " + strinfo;
for(int i = 0 ; i < strtmp.size(); i ++)
cout<<strtmp<<strtmp.size();
*/
ifstream fin("MyData.txt");
string str;
ostringstream osTmp;
while(getline(fin,str))
{
osTmp<<"select enterpriseid from domain where enterpriseid="<<str;
cout<<str<<endl; //显示出来
}
cout <<osTmp.str();
}
ostringstream osTmp
osTmp<<"select enterpriseid from domain where enterpriseid="<<enterpriseID<<" and name like'%"<<_defaultConf.defaultDomain<<"' limit 1";
sysinstall
选择网卡项目:
然后:
/etc/netstart
sh /etc/rc
/etc/rc.d/netif restart
选择网卡项目:
然后:
/etc/netstart
sh /etc/rc
/etc/rc.d/netif restart
FreeBSD6.2的SSH服务配置
1.配置SSH服务自动启动
查看文件/etc/rc.conf中有没有sshd_enable="YES" ,如果没有,将它附加到文件末尾
并使用如下命令启动SSH服务:
/etc/rc.d/sshd start
2. 配置SSH服务配置文件
#cd /etc/ssh
#ee sshd_config
将以下语句前的#去掉
Port 22 //端口号为22
Protocol 2 //使用SSH2.x协议
AddressFamily any
ListenAddress 0.0.0.0 //在本地所有IPv4地址上监听
如果要允许root用户使用SSH登录,则将
#PermitRootLogin no 更改为 PermitRootLogin yes
如果要允许其它用户登录,可在文件末尾添加以下条目
AllowUsers huzhenwei@192.168.10.100 //允许huzhenwei从192.168.10.100登录
AllowUsers oaadmin sqlsa //允许oaadmin、sqlsa从任意IP地址
//登录,多个用户可写在同一行
配置完成后,使用如下命令重启SSH服务:
#/etc/rc.d/sshd reload
1.配置SSH服务自动启动
查看文件/etc/rc.conf中有没有sshd_enable="YES" ,如果没有,将它附加到文件末尾
并使用如下命令启动SSH服务:
/etc/rc.d/sshd start
2. 配置SSH服务配置文件
#cd /etc/ssh
#ee sshd_config
将以下语句前的#去掉
Port 22 //端口号为22
Protocol 2 //使用SSH2.x协议
AddressFamily any
ListenAddress 0.0.0.0 //在本地所有IPv4地址上监听
如果要允许root用户使用SSH登录,则将
#PermitRootLogin no 更改为 PermitRootLogin yes
如果要允许其它用户登录,可在文件末尾添加以下条目
AllowUsers huzhenwei@192.168.10.100 //允许huzhenwei从192.168.10.100登录
AllowUsers oaadmin sqlsa //允许oaadmin、sqlsa从任意IP地址
//登录,多个用户可写在同一行
配置完成后,使用如下命令重启SSH服务:
#/etc/rc.d/sshd reload
大家用linux的时候难免会要上传和下载资料, 这时候就要借助于ftp了.下面把ftp的使用总结如下:
1.配置ftp. ftp配置文件一般放在/etc/vsftpd 或者 /etc目录下. 大家如果想用root用户来登陆,可以这样做.打开ftpusers和user_list, 再root和nobody前面加上#.在实际情况不提倡这样,否则太危险了.
2启动ftp. /sbin/service vsftpd start
这时候你就可以用root用户ftp到linux上了.很简单.
1.配置ftp. ftp配置文件一般放在/etc/vsftpd 或者 /etc目录下. 大家如果想用root用户来登陆,可以这样做.打开ftpusers和user_list, 再root和nobody前面加上#.在实际情况不提倡这样,否则太危险了.
2启动ftp. /sbin/service vsftpd start
这时候你就可以用root用户ftp到linux上了.很简单.
#include<stdio.h>
#include<vector>
#include <iostream>
using namespace std;
void main()
{
int i = 0;
vector<int> v;
for( i = 0; i < 10; i++ )
{
v.push_back( i );//把元素一个一个存入到vector中
}
for( i = 0; i < v.size(); i++ )//v.size() 表示vector存入元素的个数
{
cout << v[ i ] << " "; //把每个元素显示出来
}
cont << endl;
}
注:你也可以用v.begin()和v.end() 来得到vector开始的和结束的元素地址的指针位置。你也可以这样做:
vector<int>::iterator iter;
for( iter = v.begin(); iter != v.end(); iter++ )
{
cout << *iter << endl;
}
2. 对于二维vector的定义。
1)定义一个10个vector元素,并对每个vector符值1-10。
#include<stdio.h>
#include<vector>
#include <iostream>
using namespace std;
void main()
{
int i = 0, j = 0;
//定义一个二维的动态数组,有10行,每一行是一个用一个vector存储这一行的数据。
所以每一行的长度是可以变化的。之所以用到vector<int>(0)是对vector初始化,否则不能对vector存入元素。
vector< vector<int> > Array( 10, vector<int>(0) );
for( j = 0; j < 10; j++ )
{
for ( i = 0; i < 9; i++ )
{
Array[ j ].push_back( i );
}
}
for( j = 0; j < 10; j++ )
{
for( i = 0; i < Array[ j ].size(); i++ )
{
cout << Array[ j ][ i ] << " ";
}
cout<< endl;
}
}
2)定义一个行列都是变化的数组。
#include<stdio.h>
#include<vector>
#include <iostream>
using namespace std;
void main()
{
int i = 0, j = 0;
vector< vector<int> > Array;
vector< int > line;
for( j = 0; j < 10; j++ )
{
Array.push_back( line );//要对每一个vector初始化,否则不能存入元素。
for ( i = 0; i < 9; i++ )
{
Array[ j ].push_back( i );
}
}
for( j = 0; j < 10; j++ )
{
for( i = 0; i < Array[ j ].size(); i++ )
{
cout << Array[ j ][ i ] << " ";
}
cout<< endl;
}
}
上面就是我对vector使用的总结,更深入的使用,大家查查vector的手册吧。欢迎批评指正。
用std::vector的const_iterator对元素赋值会怎样?
c++ builder 6中就是改变不了元素的值,不会编译不过,执行也不报错。这玩意儿把我害惨了,害我找了好长时间。
有空测试下vc7.1,vc8和c++ builder 2007,gcc
写了个测试程序vc7.1下居然能改变值:
参考如下代码,就知道为何要这个vector了:
#include <vector>
struct stUpdateItem
{
bool _downloadSucceeded;
stUpdateItem() : _downloadSucceeded(false)
{}
};
struct stDownItem
{
stUpdateItem* _pItem;
bool _bPack;
stDownItem(stUpdateItem* item, bool bPack) : _pItem(item),_bPack(bPack)
{}
};
typedef std::vector<stDownItem> tDownItems;
int _tmain(int argc, _TCHAR* argv[])
{
tDownItems downList;
stUpdateItem item1;
stUpdateItem item2;
stDownItem downItem1(&item1,true);
stDownItem downItem2(&item2,false);
downList.push_back(downItem1);
downList.push_back(downItem2);
for (tDownItems::const_iterator it = downList.begin(); it != downList.end(); ++it)
{
if(true == it->_pItem->_downloadSucceeded)
{
std::cout << "before change, found!" << std::endl;
}
}
for (tDownItems::const_iterator it = downList.begin(); it != downList.end(); ++it)
{
it->_pItem->_downloadSucceeded = true;
}
for (tDownItems::const_iterator it = downList.begin(); it != downList.end(); ++it)
{
if(true == it->_pItem->_downloadSucceeded)
{
std::cout << "after change, found!" << std::endl;
}
}
return 0;
}
参考:http://stl.winterxy.com/html/item_26.html
#include<vector>
#include <iostream>
using namespace std;
void main()
{
int i = 0;
vector<int> v;
for( i = 0; i < 10; i++ )
{
v.push_back( i );//把元素一个一个存入到vector中
}
for( i = 0; i < v.size(); i++ )//v.size() 表示vector存入元素的个数
{
cout << v[ i ] << " "; //把每个元素显示出来
}
cont << endl;
}
注:你也可以用v.begin()和v.end() 来得到vector开始的和结束的元素地址的指针位置。你也可以这样做:
vector<int>::iterator iter;
for( iter = v.begin(); iter != v.end(); iter++ )
{
cout << *iter << endl;
}
2. 对于二维vector的定义。
1)定义一个10个vector元素,并对每个vector符值1-10。
#include<stdio.h>
#include<vector>
#include <iostream>
using namespace std;
void main()
{
int i = 0, j = 0;
//定义一个二维的动态数组,有10行,每一行是一个用一个vector存储这一行的数据。
所以每一行的长度是可以变化的。之所以用到vector<int>(0)是对vector初始化,否则不能对vector存入元素。
vector< vector<int> > Array( 10, vector<int>(0) );
for( j = 0; j < 10; j++ )
{
for ( i = 0; i < 9; i++ )
{
Array[ j ].push_back( i );
}
}
for( j = 0; j < 10; j++ )
{
for( i = 0; i < Array[ j ].size(); i++ )
{
cout << Array[ j ][ i ] << " ";
}
cout<< endl;
}
}
2)定义一个行列都是变化的数组。
#include<stdio.h>
#include<vector>
#include <iostream>
using namespace std;
void main()
{
int i = 0, j = 0;
vector< vector<int> > Array;
vector< int > line;
for( j = 0; j < 10; j++ )
{
Array.push_back( line );//要对每一个vector初始化,否则不能存入元素。
for ( i = 0; i < 9; i++ )
{
Array[ j ].push_back( i );
}
}
for( j = 0; j < 10; j++ )
{
for( i = 0; i < Array[ j ].size(); i++ )
{
cout << Array[ j ][ i ] << " ";
}
cout<< endl;
}
}
上面就是我对vector使用的总结,更深入的使用,大家查查vector的手册吧。欢迎批评指正。
用std::vector的const_iterator对元素赋值会怎样?
c++ builder 6中就是改变不了元素的值,不会编译不过,执行也不报错。这玩意儿把我害惨了,害我找了好长时间。
有空测试下vc7.1,vc8和c++ builder 2007,gcc
写了个测试程序vc7.1下居然能改变值:
参考如下代码,就知道为何要这个vector了:
#include <vector>
struct stUpdateItem
{
bool _downloadSucceeded;
stUpdateItem() : _downloadSucceeded(false)
{}
};
struct stDownItem
{
stUpdateItem* _pItem;
bool _bPack;
stDownItem(stUpdateItem* item, bool bPack) : _pItem(item),_bPack(bPack)
{}
};
typedef std::vector<stDownItem> tDownItems;
int _tmain(int argc, _TCHAR* argv[])
{
tDownItems downList;
stUpdateItem item1;
stUpdateItem item2;
stDownItem downItem1(&item1,true);
stDownItem downItem2(&item2,false);
downList.push_back(downItem1);
downList.push_back(downItem2);
for (tDownItems::const_iterator it = downList.begin(); it != downList.end(); ++it)
{
if(true == it->_pItem->_downloadSucceeded)
{
std::cout << "before change, found!" << std::endl;
}
}
for (tDownItems::const_iterator it = downList.begin(); it != downList.end(); ++it)
{
it->_pItem->_downloadSucceeded = true;
}
for (tDownItems::const_iterator it = downList.begin(); it != downList.end(); ++it)
{
if(true == it->_pItem->_downloadSucceeded)
{
std::cout << "after change, found!" << std::endl;
}
}
return 0;
}
参考:http://stl.winterxy.com/html/item_26.html
电视剧《甘十九妹》的主题曲,一首凄美的旋律映衬出了那令人断肠的结局。
-
如果来生还是今世的重复,纵然多情要比无情苦。
如果来生还是今世的重复,你是否还是这样不在乎?……
-
在很多时候,现实往往是令人痛苦和无助的。甘十九妹——萧逸笔下一个美丽、坚强、自信、能干、聪明、勇敢、对爱坚贞的一个女子,与他深爱着的男人尹剑平成为了上一代人仇恨的牺牲品,成为了不可逃避的宿敌。
-
与一般女子不同的是,甘十九妹她不仅风华绝代、武功高强、机敏聪明,更有着对爱情的忠贞和敢爱敢恨的性格。她向“尹心”投怀送抱,二人间有限的接触也总是她在主动,一旦确定心意后更是坚贞不移,甚至到“依剑平”将她杀死那一刻,才知道尹剑平一直在“欺骗”她——爱人“尹心”、敌人“依剑平”竟是同一个人。尽管如此,她仍对自己的师姐说她深爱此人,希望师姐不要为她报仇。
-
尹剑平望着垂死的甘十九妹,那是一个他深爱而又不敢爱的人,在得知父仇已报后,做出了他应该也必须做出的唯一决定——剖腹自杀。“这样我可以跟你一起去了!”
-
随着那一声断肠的“尹哥哥……”,“两个血人缓缓地接近着,终于紧紧地拥抱一团。当他们那样紧紧抱在一起时,这个天底下不再有也没有什么力量,能够把他们分开了。 ”
…… …… ……
-
听这首老歌、感动了我十年的老歌。每句话,每个字,都让我泪流满面……
每次想起那对相拥死去的恋人,先是心痛,然后便觉得他们才是真的幸福。而这世上,还有没有人,能在某个时候,和我相拥着离开这个世界?
烟花美丽,是因为太绚烂,还是因为那霎那的光彩;
流星迷人,是因为太耀亮,还是因为那短暂的永恒?
如果来生还是今世的重复,你是否还是这样不在乎?
-
“不知道如何开始
难预料怎样结束
都说是多情要比无情苦
你为何还要脉脉含情
是不是你太疏忽
是不是你很糊涂
爱到尽头也回不到当初
你为何还要如此执固
如果来生还是今世的重复
纵然多情要比无情苦
如果来生还是今世的重复
你是否还是这样不在乎
如果来生还是今世的重复
纵然多情要比无情苦
如果来生还是今世的重复
你是否还是这样不在乎 !……”
-
如果来生还是今世的重复,纵然多情要比无情苦。
如果来生还是今世的重复,你是否还是这样不在乎?……
-
在很多时候,现实往往是令人痛苦和无助的。甘十九妹——萧逸笔下一个美丽、坚强、自信、能干、聪明、勇敢、对爱坚贞的一个女子,与他深爱着的男人尹剑平成为了上一代人仇恨的牺牲品,成为了不可逃避的宿敌。
-
与一般女子不同的是,甘十九妹她不仅风华绝代、武功高强、机敏聪明,更有着对爱情的忠贞和敢爱敢恨的性格。她向“尹心”投怀送抱,二人间有限的接触也总是她在主动,一旦确定心意后更是坚贞不移,甚至到“依剑平”将她杀死那一刻,才知道尹剑平一直在“欺骗”她——爱人“尹心”、敌人“依剑平”竟是同一个人。尽管如此,她仍对自己的师姐说她深爱此人,希望师姐不要为她报仇。
-
尹剑平望着垂死的甘十九妹,那是一个他深爱而又不敢爱的人,在得知父仇已报后,做出了他应该也必须做出的唯一决定——剖腹自杀。“这样我可以跟你一起去了!”
-
随着那一声断肠的“尹哥哥……”,“两个血人缓缓地接近着,终于紧紧地拥抱一团。当他们那样紧紧抱在一起时,这个天底下不再有也没有什么力量,能够把他们分开了。 ”
…… …… ……
-
听这首老歌、感动了我十年的老歌。每句话,每个字,都让我泪流满面……
每次想起那对相拥死去的恋人,先是心痛,然后便觉得他们才是真的幸福。而这世上,还有没有人,能在某个时候,和我相拥着离开这个世界?
烟花美丽,是因为太绚烂,还是因为那霎那的光彩;
流星迷人,是因为太耀亮,还是因为那短暂的永恒?
如果来生还是今世的重复,你是否还是这样不在乎?
-
“不知道如何开始
难预料怎样结束
都说是多情要比无情苦
你为何还要脉脉含情
是不是你太疏忽
是不是你很糊涂
爱到尽头也回不到当初
你为何还要如此执固
如果来生还是今世的重复
纵然多情要比无情苦
如果来生还是今世的重复
你是否还是这样不在乎
如果来生还是今世的重复
纵然多情要比无情苦
如果来生还是今世的重复
你是否还是这样不在乎 !……”