FreeBSD成功对一目录下有多个小文件成功批量删除的写法:find /var/spool/clientmqueue -type f -delete
前置来自:https://jackxiang.com/post/9321/ ,cp filename{,bak} , find /var/www/ -name file -exec cp {}{,.bak} ; 递归备份文件,大括号扩展:cp和mv搭配{,}在shell作用,cp 快速备份 bash{} 扩展。 要查找一个指定后缀文件里有没有一些指定字符串,显示出文件和行号等,还是用 xargs方便,如下:
上面一句顶exec两句,如下:
背景:删除一些vim的临时文件及批量文件修改时间之外的过期文件,有用xargs的也有用exec......但是这个命令的后面这一部分得小心点写,有一个空格。
第一:花括号}后面必须得有空格.
第二:最后斜杠后面必须得有分号。
第三:exec前面有一个中横线,否则也不行,三者必须要注意。
摘自:https://jackxiang.com/post/7859/
(1)删除10天以来没有修改的文件,经常使用的短小精悍又不失效率的命令隆重出场ing:
(2)find /data/***/logs -mtime +30 //查找30天里没有被修改的文件
来自:http://jackxiang.com/post/3557/
————————————————————————————————————————————————
用man find可以看到下面的说明:
-mtime n
Files data was last modified n*24 hours ago.
参考mtime英文帮助来自:http://zhidao.baidu.com/link?url=EaXnp9x5fKWF40ACYNZlx1tA0Pyw_qHd7N7cWQ246XiS8fXSLmetBTxlqFT9HHgSB7g4cSHemtozCjrCIdYVjK
____________________________________________________________________________
使用find和xargs
有时可能需要在系统中查找具有某一特征的文件(例如文件权限、文件属主、文件长度、
文件类型等等)。这样做可能有很多原因。可能出于安全性的考虑,或是一般性的系统管理任
务,或许只是为了找出一个不知保存在什么地方的文件。F i n d是一个非常有效的工具,它可
以遍历当前目录甚至于整个文件系统来查找某些文件或目录。
在本章中,我们介绍以下内容:
* find命令选项。
* 使用f i n d命令不同选项的例子。
* 配合f i n d使用x a rg s命令的例子。
由于f i n d具有如此强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间
来了解一下。即使系统中含有网络文件系统( N F S ),f i n d命令在该文件系统中同样有效,只要
你具有相应的权限。
在运行一个非常消耗资源的f i n d命令时,很多人都倾向于把它放在后台执行,因为遍历一
个大的文件系统可能会花费很长的时间(这里是指3 0 G字节以上的文件系统)。
F i n d命令的一般形式为:
find pathname -options [-print -exec -ok]
让我们来看看该命令的参数:
pathname find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print find命令将匹配的文件输出到标准输出。
-exec find命令对匹配的文件执行该参数所给出的s h e l l命令。相应命令的形式为' c o m m -
and' {} \;,注意{ }和\;之间的空格。
-ok 和- e x e c的作用相同,只不过以一种更为安全的模式来执行该参数所给出的s h e l l命令,
在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
find命令选项
f i n d命令有很多选项或表达式,每一个选项前面跟随一个横杠-。让我们先来看一下该命
令的主要选项,然后再给出一些例子。
-name 按照文件名查找文件。
-perm 按照文件权限来查找文件。
-prune 使用这一选项可以使f i n d命令不在当前指定的目录中查找,如果同时使用了- d e p t h
选项,那么- p r u n e选项将被f i n d命令忽略。
-user 按照文件属主来查找文件。
-group 按照文件所属的组来查找文件。
-mtime -n +n 按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n
表示文件更改时间距现在n天以前。F i n d命令还有- a t i m e和- c t i m e选项,但它们都和- m t i m e选项
相似,所以我们在这里只介绍- m t i m e选项。
-nogroup 查找无有效所属组的文件,即该文件所属的组在/ e t c / g r o u p s中不存在。
-nouser 查找无有效属主的文件,即该文件的属主在/ e t c / p a s s w d中不存在。
-newer file1 ! file2 查找更改时间比文件f i l e 1新但比文件f i l e 2旧的文件。
-type 查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
-size n[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-fstype 查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件
/ e t c / f s t a b中找到,该配置文件中包含了本系统中有关文件系统的信息。
-mount 在查找文件时不跨越文件系统m o u n t点。
-follow 如果f i n d命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio 对匹配的文件使用c p i o命令,将这些文件备份到磁带设备中。
使用name选项
文件名选项是f i n d命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用。
可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。
不管当前路径是什么,如果想要在自己的根目录$ H O M E中查找文件名符合* . t x t的文件,
使用~作为' p a t h n a m e参数,波浪号~代表了你的$ H O M E目录。
$ find ~ -name "*.txt" -print
想要在当前目录及子目录中查找所有的' * . t x t'文件,可以用:
$ find . -name "*.txt" -print
想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:
$ find . -name "[A-Z]*" -print
想要在/ e t c目录中查找文件名以h o s t开头的文件,可以用:
$ find /etc -name "host*" -print
想要查找$ H O M E目录中的文件,可以用:
$ find ~ -name "*" -print 或find . -print
要想让系统高负荷运行,就从根目录开始查找所有的文件。如果希望在系统管理员那里
保留一个好印象的话,最好在这么做之前考虑清楚!
$ find / -name "*" -print
如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是* . t x t的文
件,下面的命令就能够返回名为a x 3 7 . t x t的文件:
$ find . -name "[a-z][a-z][0--9][0--9].txt" -print
使用perm选项
如果希望按照文件权限模式来查找文件的话,可以采用- p e r m选项。你可能需要找到所有
用户都具有执行权限的文件,或是希望查看某个用户目录下的文件权限类型。在使用这一选
项的时候,最好使用八进制的权限表示法。
为了在当前目录下查找文件权限位为7 5 5的文件,即文件属主可以读、写、执行,其他用
户可以读、执行的文件,可以用:
$ find . -perm 755 -print
如果希望在当前目录下查找所有用户都可读、写、执行的文件(要小心这种情况),我们
可以使用f i n d命令的- p e r m选项。在八进制数字前面要加一个横杠-。在下面的命令中- p e r m代
表按照文件权限查找,而' 0 0 7'和你在c h m o d命令的绝对模式中所采用的表示法完全相同。
$ find . -perm -007 -print
忽略某个目录
如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,
那么可以使用- p r u n e选项来指出需要忽略的目录。在使用- p r u n e选项时要当心,因为如果你同
时使用了- d e p t h选项,那么- p r u n e选项就会被f i n d命令忽略。
如果希望在/ a p p s目录下查找文件,但不希望在/ a p p s / b i n目录下查找,可以用:
$ find /apps -name "/apps/bin" -prune -o -print
2.1.4 使用user和nouser选项
如果希望按照文件属主查找文件,可以给出相应的用户名。例如,在$ H O M E目录中查找
文件属主为d a v e的文件,可以用:
$ find ~ -user dave -print
在/ e t c目录下查找文件属主为u u c p的文件:
$ find /etc -user uucp -print
为了查找属主帐户已经被删除的文件,可以使用- n o u s e r选项。这样就能够找到那些属主
在/ e t c / p a s s w d文件中没有有效帐户的文件。在使用- n o u s e r选项时,不必给出用户名; f i n d命令
能够为你完成相应的工作。例如,希望在/ h o m e目录下查找所有的这类文件,可以用:
$ find /home -nouser -print
使用group和nogroup选项
就像u s e r和n o u s e r选项一样,针对文件所属于的用户组, f i n d命令也具有同样的选项,为
了在/ a p p s目录下查找属于a c c t s用户组的文件,可以用:
$ find /apps -group accts -print
要查找没有有效所属用户组的所有文件,可以使用n o g r o u p选项。下面的f i n d命令从文件
系统的根目录处查找这样的文件
$ fine/-nogroup-print
按照更改时间查找文件
如果希望按照更改时间来查找文件,可以使用m t i m e选项。如果系统突然没有可用空间了,
很有可能某一个文件的长度在此期间增长迅速,这时就可以用m t i m e选项来查找这样的文件。
用减号-来限定更改时间在距今n日以内的文件,而用加号+来限定更改时间在距今n日以前的
文件。
希望在系统根目录下查找更改时间在5日以内的文件,可以用:
$ find / -mtime -5 -print
为了在/ v a r / a d m目录下查找更改时间在3日以前的文件,可以用:
$ find /var/adm -mtime +3 -print
查找比某个文件新或旧的文件
如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用- n e w e r选
项。它的一般形式为:
newest_file_name ! oldest_file_name
其中,!是逻辑非符号。
这里有两个文件,它们的更改时间大约相差两天。
下面给出的f i n d命令能够查找更改时间比文件a g e . a w k新但比文件b e l t s . a w k旧的文件:
如果想使用f i n d命令的这一选项来查找更改时间在两个小时以内的文件,除非有一个现成
的文件其更改时间恰好在两个小时以前,否则就没有可用来比较更改时间的文件。为了解决
这一问题,可以首先创建一个文件并将其日期和时间戳设置为所需要的时间。这可以用t o u c h
命令来实现。
假设现在的时间是2 3 : 4 0,希望查找更改时间在两个小时以内的文件,可以首先创建这样
一个文件:
一个符合要求的文件已经被创建;这里我们假设今天是五月四日,而该文件的更改时间
是2 1 : 4 0,比现在刚好早两个小时。
现在我们就可以使用f i n d命令的- n e w e r选项在当前目录下查找所有更改时间在两个小时以
内的文件:
$ find . -newer dstamp -print
使用type选项
U N I X或L I N U X系统中有若干种不同的文件类型,这部分内容我们在前面的章节已经做了
介绍,这里就不再赘述。如果要在/ e t c目录下查找所有的目录,可以用:
$ find /etc -type d -print
为了在当前目录下查找除目录以外的所有类型的文件,可以用:
$ find . ! -type d -print
为了在/ e t c目录下查找所有的符号链接文件,可以用:
$ find /etc -type l -print
2.1.9 使用size选项
可以按照文件长度来查找文件,这里所指的文件长度既可以用块( b l o c k)来计量,也可
以用字节来计量。以字节计量文件长度的表达形式为N c;以块计量文件长度只用数字表示即
可。
就我个人而言,我总是使用以字节计的方式,在按照文件长度查找文件时,大多数人都
喜欢使用这种以字节表示的文件长度,而不用块的数目来表示,除非是在查看文件系统的大
小,因为这时使用块来计量更容易转换。
为了在当前目录下查找文件长度大于1 M字节的文件,可以用:
$ find . -size +1000000c -print
为了在/ h o m e / a p a c h e目录下查找文件长度恰好为1 0 0字节的文件,可以用:
$ find /home/apache -size 100c -print
为了在当前目录下查找长度超过1 0块的文件(一块等于5 1 2字节),可以用:
$ find . -size +10 -print
使用depth选项
在使用f i n d命令时,可能希望先匹配所有的文件,再在子目录中查找。使用d e p t h选项就
可以使f i n d命令这样做。这样做的一个原因就是,当在使用f i n d命令向磁带上备份文件系统时,
希望首先备份所有的文件,其次再备份子目录中的文件。
在下面的例子中, f i n d命令从文件系统的根目录开始,查找一个名为C O N . F I L E的文件。
它将首先匹配所有的文件然后再进入子目录中查找。
$ find / -name "CON.FILE" -depth -print
使用mount选项
在当前的文件系统中查找文件(不进入其他文件系统),可以使用f i n d命令的m o u n t选项。
在下面的例子中,我们从当前目录开始查找位于本文件系统中文件名以X C结尾的文件:
$ find . -name "*.XC" -mount -print
使用cpio选项
c p i o命令可以用来向磁带设备备份文件或从中恢复文件。可以使用f i n d命令在整个文件系
统中(更多的情况下是在部分文件系统中)查找文件,然后用c p i o命令将其备份到磁带上。
如果希望使用c p i o命令备份/ e t c、/ h o m e和/ a p p s目录中的文件,可以使用下面所给出的命
令,不过要记住你是在文件系统的根目录下:
(在上面的例子中,第一行末尾的\告诉s h e l l命令还未结束,忽略\后面的回车。)
在上面的例子中,应当注意到路径中缺少/。这叫作相对路径。之所以使用相对路径,是
因为在从磁带中恢复这些文件的时候,可以选择恢复文件的路径。例如,可以将这些文件先
恢复到另外一个目录中,对它们进行某些操作后,再恢复到原始目录中。如果在备份时使用
了绝对路径,例如/ e t c,那么在恢复时,就只能恢复到/ e t c目录中去,别无其他选择。在上面
的例子中,我告诉f i n d命令首先进入/ e t c目录,然后是/ h o m e和/ a p p s目录,先匹配这些目录下
的文件,然后再匹配其子目录中的文件,所有这些结果将通过管道传递给c p i o命令进行备份。
顺便说一下,在上面的例子中c p i o命令使用了C 6 5 5 3 6选项,我本可以使用B选项,不过这
样每块的大小只有5 1 2 字节,而使用了C 6 5 5 3 6 选项后,块的大小变成了6 4 K 字节
(6 5 5 3 6 / 1 0 2 4)。
使用exec或ok来执行shell命令
当匹配到一些文件以后,可能希望对其进行某些操作,这时就可以使用- e x e c选项。一旦
f i n d命令匹配到了相应的文件,就可以用- e x e c选项中的命令对其进行操作(在有些操作系统
中只允许- e x e c选项执行诸如l s或ls -l这样的命令)。大多数用户使用这一选项是为了查找旧文
件并删除它们。这里我强烈地建议你在真正执行r m命令删除文件之前,最好先用l s命令看一
下,确认它们是所要删除的文件。
e x e c选项后面跟随着所要执行的命令,然后是一对儿{ },一个空格和一个\,最后是一个
分号。
为了使用e x e c选项,必须要同时使用p r i n t选项。如果验证一下f i n d命令,会发现该命令只
输出从当前路径起的相对路径及文件名。
为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在f i n d命令的- e x e c选项中,例如:
上面的例子中,f i n d命令匹配到了当前目录下的所有普通文件,并在- e x e c选项中使用ls -l
命令将它们列出。
为了在/ l o g s目录中查找更改时间在5日以前的文件并删除它们,可以用:
$ find logs -type f -mtime +5 -exec rm {} \;
记住,在s h e l l中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!
当使用诸如m v或r m命令时,可以使用- e x e c选项的安全模式。它将在对每个匹配到的文件
进行操作之前提示你。在下面的例子中, f i n d命令在当前目录中查找所有文件名以. L O G结尾、
更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。
按y键删除文件,按n键不删除。
任何形式的命令都可以在- e x e c选项中使用。在下面的例子中我们使用g r e p命令。f i n d命令
首先匹配所有文件名为" p a s s w d *"的文件,例如p a s s w d、p a s s w d . o l d、p a s s w d . b a k,然后执
行g r e p命令看看在这些文件中是否存在一个r o u n d e r用户。
find命令的例子
我们已经介绍了f i n d命令的基本选项,下面给出f i n d命令的一些其他的例子。
为了匹配$ H O M E目录下的所有文件,下面两种方法都可以使用:
$ find $HOME -print
$ find ~ -print
为了在当前目录中查找s u i d置位,文件属主具有读、写、执行权限,并且文件所属组的用
户和其他用户具有读和执行的权限的文件,可以用:
$ find . -type f -perm 4755 -print
为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径,可以用:
$ find / -type f -size 0 -exec ls -l {} \;
为了查找/ v a r / l o g s目录中更改时间在7日以前的普通文件,并删除它们,可以用:
$ find /var/logs -type f -mtime +7 -exec rm {} \;
为了查找系统中所有属于a u d i t组的文件,可以用:
$find /-name -group audit -print
我们的一个审计系统每天创建一个审计日志文件。日志文件名的最后含有数字,这样我
们一眼就可以看出哪个文件是最新的,哪个是最旧的。A d m i n . l o g 文件编上了序号:
a d m i n . l o g . 0 0 1、a d m i n . l o g . 0 0 2等等。下面的f i n d命令将删除/ l o g s目录中访问时间在7日以前、
含有数字后缀的a d m i n . l o g文件。该命令只检查三位数字,所以相应日志文件的后缀不要超过
9 9 9。
$ find /logs -name 'admin.log[0-9][0-9][0-9] '-atime +7 -exec rm {} \;
为了查找当前文件系统中的所有目录并排序,可以用:
$ find . -type d -print -local -mount |sort
为了查找系统中所有的r m t磁带设备,可以用:
$ find /dev/rmt -print
xargs
在使用f i n d命令的- e x e c选项处理匹配到的文件时, f i n d命令将所有匹配到的文件一起传递
给e x e c执行。不幸的是,有些系统对能够传递给e x e c的命令长度有限制,这样在f i n d命令运行
几分钟之后,就会出现溢出错误。错误信息通常是"参数列太长"或"参数列溢出"。这就是
x a rg s命令的用处所在,特别是与f i n d命令一起使用。F i n d命令把匹配到的文件传递给x a rg s命
令,而x a rg s命令每次只获取一部分文件而不是全部,不像- e x e c选项那样。这样它可以先处理
最先获取的一部分文件,然后是下一批,并如此继续下去。在有些系统中,使用- e x e c选项会
为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次
执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;而使用
x a rg s命令则只有一个进程。另外,在使用x a rg s命令时,究竟是一次获取所有的参数,还是分
批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参
数来确定。
让我们来看看x a rg s命令是如何同f i n d命令一起使用的,并给出一些例子。
下面的例子查找系统中的每一个普通文件,然后使用x a rg s命令来测试它们分别属于哪类
文件:
下面的例子在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到
/tmp/core.log 文件中:
$ find . -name "core" -print | xargs echo "" >/tmp/core.log
下面的例子在/ a p p s / a u d i t目录下查找所有用户具有读、写和执行权限的文件,并收回相应
的写权限:
$ find /apps/audit -perm -7 -print | xargs chmod o-w
在下面的例子中,我们用g r e p命令在所有的普通文件中搜索d e v i c e这个词:
$ find / -type f -print | xargs grep "device"
在下面的例子中,我们用g r e p命令在当前目录下的所有普通文件中搜索D B O这个词:
$ find . -name \ *-type f -print | xargs grep "DBO"
注意,在上面的例子中, \用来取消f i n d命令中的*在s h e l l中的特殊含义。
小结
f i n d命令是一个非常优秀的工具,它可以按照用户指定的准则来匹配文件。使用e x e c和
x a rg s可以使用户对所匹配到的文件执行几乎所有的命令。
前置来自:https://jackxiang.com/post/9321/ ,cp filename{,bak} , find /var/www/ -name file -exec cp {}{,.bak} ; 递归备份文件,大括号扩展:cp和mv搭配{,}在shell作用,cp 快速备份 bash{} 扩展。 要查找一个指定后缀文件里有没有一些指定字符串,显示出文件和行号等,还是用 xargs方便,如下:
上面一句顶exec两句,如下:
背景:删除一些vim的临时文件及批量文件修改时间之外的过期文件,有用xargs的也有用exec......但是这个命令的后面这一部分得小心点写,有一个空格。
第一:花括号}后面必须得有空格.
第二:最后斜杠后面必须得有分号。
第三:exec前面有一个中横线,否则也不行,三者必须要注意。
摘自:https://jackxiang.com/post/7859/
(1)删除10天以来没有修改的文件,经常使用的短小精悍又不失效率的命令隆重出场ing:
(2)find /data/***/logs -mtime +30 //查找30天里没有被修改的文件
来自:http://jackxiang.com/post/3557/
————————————————————————————————————————————————
用man find可以看到下面的说明:
-mtime n
Files data was last modified n*24 hours ago.
参考mtime英文帮助来自:http://zhidao.baidu.com/link?url=EaXnp9x5fKWF40ACYNZlx1tA0Pyw_qHd7N7cWQ246XiS8fXSLmetBTxlqFT9HHgSB7g4cSHemtozCjrCIdYVjK
____________________________________________________________________________
使用find和xargs
有时可能需要在系统中查找具有某一特征的文件(例如文件权限、文件属主、文件长度、
文件类型等等)。这样做可能有很多原因。可能出于安全性的考虑,或是一般性的系统管理任
务,或许只是为了找出一个不知保存在什么地方的文件。F i n d是一个非常有效的工具,它可
以遍历当前目录甚至于整个文件系统来查找某些文件或目录。
在本章中,我们介绍以下内容:
* find命令选项。
* 使用f i n d命令不同选项的例子。
* 配合f i n d使用x a rg s命令的例子。
由于f i n d具有如此强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间
来了解一下。即使系统中含有网络文件系统( N F S ),f i n d命令在该文件系统中同样有效,只要
你具有相应的权限。
在运行一个非常消耗资源的f i n d命令时,很多人都倾向于把它放在后台执行,因为遍历一
个大的文件系统可能会花费很长的时间(这里是指3 0 G字节以上的文件系统)。
F i n d命令的一般形式为:
find pathname -options [-print -exec -ok]
让我们来看看该命令的参数:
pathname find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print find命令将匹配的文件输出到标准输出。
-exec find命令对匹配的文件执行该参数所给出的s h e l l命令。相应命令的形式为' c o m m -
and' {} \;,注意{ }和\;之间的空格。
-ok 和- e x e c的作用相同,只不过以一种更为安全的模式来执行该参数所给出的s h e l l命令,
在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
find命令选项
f i n d命令有很多选项或表达式,每一个选项前面跟随一个横杠-。让我们先来看一下该命
令的主要选项,然后再给出一些例子。
-name 按照文件名查找文件。
-perm 按照文件权限来查找文件。
-prune 使用这一选项可以使f i n d命令不在当前指定的目录中查找,如果同时使用了- d e p t h
选项,那么- p r u n e选项将被f i n d命令忽略。
-user 按照文件属主来查找文件。
-group 按照文件所属的组来查找文件。
-mtime -n +n 按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n
表示文件更改时间距现在n天以前。F i n d命令还有- a t i m e和- c t i m e选项,但它们都和- m t i m e选项
相似,所以我们在这里只介绍- m t i m e选项。
-nogroup 查找无有效所属组的文件,即该文件所属的组在/ e t c / g r o u p s中不存在。
-nouser 查找无有效属主的文件,即该文件的属主在/ e t c / p a s s w d中不存在。
-newer file1 ! file2 查找更改时间比文件f i l e 1新但比文件f i l e 2旧的文件。
-type 查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
-size n[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-fstype 查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件
/ e t c / f s t a b中找到,该配置文件中包含了本系统中有关文件系统的信息。
-mount 在查找文件时不跨越文件系统m o u n t点。
-follow 如果f i n d命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio 对匹配的文件使用c p i o命令,将这些文件备份到磁带设备中。
使用name选项
文件名选项是f i n d命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用。
可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。
不管当前路径是什么,如果想要在自己的根目录$ H O M E中查找文件名符合* . t x t的文件,
使用~作为' p a t h n a m e参数,波浪号~代表了你的$ H O M E目录。
$ find ~ -name "*.txt" -print
想要在当前目录及子目录中查找所有的' * . t x t'文件,可以用:
$ find . -name "*.txt" -print
想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:
$ find . -name "[A-Z]*" -print
想要在/ e t c目录中查找文件名以h o s t开头的文件,可以用:
$ find /etc -name "host*" -print
想要查找$ H O M E目录中的文件,可以用:
$ find ~ -name "*" -print 或find . -print
要想让系统高负荷运行,就从根目录开始查找所有的文件。如果希望在系统管理员那里
保留一个好印象的话,最好在这么做之前考虑清楚!
$ find / -name "*" -print
如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是* . t x t的文
件,下面的命令就能够返回名为a x 3 7 . t x t的文件:
$ find . -name "[a-z][a-z][0--9][0--9].txt" -print
使用perm选项
如果希望按照文件权限模式来查找文件的话,可以采用- p e r m选项。你可能需要找到所有
用户都具有执行权限的文件,或是希望查看某个用户目录下的文件权限类型。在使用这一选
项的时候,最好使用八进制的权限表示法。
为了在当前目录下查找文件权限位为7 5 5的文件,即文件属主可以读、写、执行,其他用
户可以读、执行的文件,可以用:
$ find . -perm 755 -print
如果希望在当前目录下查找所有用户都可读、写、执行的文件(要小心这种情况),我们
可以使用f i n d命令的- p e r m选项。在八进制数字前面要加一个横杠-。在下面的命令中- p e r m代
表按照文件权限查找,而' 0 0 7'和你在c h m o d命令的绝对模式中所采用的表示法完全相同。
$ find . -perm -007 -print
忽略某个目录
如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,
那么可以使用- p r u n e选项来指出需要忽略的目录。在使用- p r u n e选项时要当心,因为如果你同
时使用了- d e p t h选项,那么- p r u n e选项就会被f i n d命令忽略。
如果希望在/ a p p s目录下查找文件,但不希望在/ a p p s / b i n目录下查找,可以用:
$ find /apps -name "/apps/bin" -prune -o -print
2.1.4 使用user和nouser选项
如果希望按照文件属主查找文件,可以给出相应的用户名。例如,在$ H O M E目录中查找
文件属主为d a v e的文件,可以用:
$ find ~ -user dave -print
在/ e t c目录下查找文件属主为u u c p的文件:
$ find /etc -user uucp -print
为了查找属主帐户已经被删除的文件,可以使用- n o u s e r选项。这样就能够找到那些属主
在/ e t c / p a s s w d文件中没有有效帐户的文件。在使用- n o u s e r选项时,不必给出用户名; f i n d命令
能够为你完成相应的工作。例如,希望在/ h o m e目录下查找所有的这类文件,可以用:
$ find /home -nouser -print
使用group和nogroup选项
就像u s e r和n o u s e r选项一样,针对文件所属于的用户组, f i n d命令也具有同样的选项,为
了在/ a p p s目录下查找属于a c c t s用户组的文件,可以用:
$ find /apps -group accts -print
要查找没有有效所属用户组的所有文件,可以使用n o g r o u p选项。下面的f i n d命令从文件
系统的根目录处查找这样的文件
$ fine/-nogroup-print
按照更改时间查找文件
如果希望按照更改时间来查找文件,可以使用m t i m e选项。如果系统突然没有可用空间了,
很有可能某一个文件的长度在此期间增长迅速,这时就可以用m t i m e选项来查找这样的文件。
用减号-来限定更改时间在距今n日以内的文件,而用加号+来限定更改时间在距今n日以前的
文件。
希望在系统根目录下查找更改时间在5日以内的文件,可以用:
$ find / -mtime -5 -print
为了在/ v a r / a d m目录下查找更改时间在3日以前的文件,可以用:
$ find /var/adm -mtime +3 -print
查找比某个文件新或旧的文件
如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用- n e w e r选
项。它的一般形式为:
newest_file_name ! oldest_file_name
其中,!是逻辑非符号。
这里有两个文件,它们的更改时间大约相差两天。
下面给出的f i n d命令能够查找更改时间比文件a g e . a w k新但比文件b e l t s . a w k旧的文件:
如果想使用f i n d命令的这一选项来查找更改时间在两个小时以内的文件,除非有一个现成
的文件其更改时间恰好在两个小时以前,否则就没有可用来比较更改时间的文件。为了解决
这一问题,可以首先创建一个文件并将其日期和时间戳设置为所需要的时间。这可以用t o u c h
命令来实现。
假设现在的时间是2 3 : 4 0,希望查找更改时间在两个小时以内的文件,可以首先创建这样
一个文件:
一个符合要求的文件已经被创建;这里我们假设今天是五月四日,而该文件的更改时间
是2 1 : 4 0,比现在刚好早两个小时。
现在我们就可以使用f i n d命令的- n e w e r选项在当前目录下查找所有更改时间在两个小时以
内的文件:
$ find . -newer dstamp -print
使用type选项
U N I X或L I N U X系统中有若干种不同的文件类型,这部分内容我们在前面的章节已经做了
介绍,这里就不再赘述。如果要在/ e t c目录下查找所有的目录,可以用:
$ find /etc -type d -print
为了在当前目录下查找除目录以外的所有类型的文件,可以用:
$ find . ! -type d -print
为了在/ e t c目录下查找所有的符号链接文件,可以用:
$ find /etc -type l -print
2.1.9 使用size选项
可以按照文件长度来查找文件,这里所指的文件长度既可以用块( b l o c k)来计量,也可
以用字节来计量。以字节计量文件长度的表达形式为N c;以块计量文件长度只用数字表示即
可。
就我个人而言,我总是使用以字节计的方式,在按照文件长度查找文件时,大多数人都
喜欢使用这种以字节表示的文件长度,而不用块的数目来表示,除非是在查看文件系统的大
小,因为这时使用块来计量更容易转换。
为了在当前目录下查找文件长度大于1 M字节的文件,可以用:
$ find . -size +1000000c -print
为了在/ h o m e / a p a c h e目录下查找文件长度恰好为1 0 0字节的文件,可以用:
$ find /home/apache -size 100c -print
为了在当前目录下查找长度超过1 0块的文件(一块等于5 1 2字节),可以用:
$ find . -size +10 -print
使用depth选项
在使用f i n d命令时,可能希望先匹配所有的文件,再在子目录中查找。使用d e p t h选项就
可以使f i n d命令这样做。这样做的一个原因就是,当在使用f i n d命令向磁带上备份文件系统时,
希望首先备份所有的文件,其次再备份子目录中的文件。
在下面的例子中, f i n d命令从文件系统的根目录开始,查找一个名为C O N . F I L E的文件。
它将首先匹配所有的文件然后再进入子目录中查找。
$ find / -name "CON.FILE" -depth -print
使用mount选项
在当前的文件系统中查找文件(不进入其他文件系统),可以使用f i n d命令的m o u n t选项。
在下面的例子中,我们从当前目录开始查找位于本文件系统中文件名以X C结尾的文件:
$ find . -name "*.XC" -mount -print
使用cpio选项
c p i o命令可以用来向磁带设备备份文件或从中恢复文件。可以使用f i n d命令在整个文件系
统中(更多的情况下是在部分文件系统中)查找文件,然后用c p i o命令将其备份到磁带上。
如果希望使用c p i o命令备份/ e t c、/ h o m e和/ a p p s目录中的文件,可以使用下面所给出的命
令,不过要记住你是在文件系统的根目录下:
(在上面的例子中,第一行末尾的\告诉s h e l l命令还未结束,忽略\后面的回车。)
在上面的例子中,应当注意到路径中缺少/。这叫作相对路径。之所以使用相对路径,是
因为在从磁带中恢复这些文件的时候,可以选择恢复文件的路径。例如,可以将这些文件先
恢复到另外一个目录中,对它们进行某些操作后,再恢复到原始目录中。如果在备份时使用
了绝对路径,例如/ e t c,那么在恢复时,就只能恢复到/ e t c目录中去,别无其他选择。在上面
的例子中,我告诉f i n d命令首先进入/ e t c目录,然后是/ h o m e和/ a p p s目录,先匹配这些目录下
的文件,然后再匹配其子目录中的文件,所有这些结果将通过管道传递给c p i o命令进行备份。
顺便说一下,在上面的例子中c p i o命令使用了C 6 5 5 3 6选项,我本可以使用B选项,不过这
样每块的大小只有5 1 2 字节,而使用了C 6 5 5 3 6 选项后,块的大小变成了6 4 K 字节
(6 5 5 3 6 / 1 0 2 4)。
使用exec或ok来执行shell命令
当匹配到一些文件以后,可能希望对其进行某些操作,这时就可以使用- e x e c选项。一旦
f i n d命令匹配到了相应的文件,就可以用- e x e c选项中的命令对其进行操作(在有些操作系统
中只允许- e x e c选项执行诸如l s或ls -l这样的命令)。大多数用户使用这一选项是为了查找旧文
件并删除它们。这里我强烈地建议你在真正执行r m命令删除文件之前,最好先用l s命令看一
下,确认它们是所要删除的文件。
e x e c选项后面跟随着所要执行的命令,然后是一对儿{ },一个空格和一个\,最后是一个
分号。
为了使用e x e c选项,必须要同时使用p r i n t选项。如果验证一下f i n d命令,会发现该命令只
输出从当前路径起的相对路径及文件名。
为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在f i n d命令的- e x e c选项中,例如:
上面的例子中,f i n d命令匹配到了当前目录下的所有普通文件,并在- e x e c选项中使用ls -l
命令将它们列出。
为了在/ l o g s目录中查找更改时间在5日以前的文件并删除它们,可以用:
$ find logs -type f -mtime +5 -exec rm {} \;
记住,在s h e l l中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!
当使用诸如m v或r m命令时,可以使用- e x e c选项的安全模式。它将在对每个匹配到的文件
进行操作之前提示你。在下面的例子中, f i n d命令在当前目录中查找所有文件名以. L O G结尾、
更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。
按y键删除文件,按n键不删除。
任何形式的命令都可以在- e x e c选项中使用。在下面的例子中我们使用g r e p命令。f i n d命令
首先匹配所有文件名为" p a s s w d *"的文件,例如p a s s w d、p a s s w d . o l d、p a s s w d . b a k,然后执
行g r e p命令看看在这些文件中是否存在一个r o u n d e r用户。
find命令的例子
我们已经介绍了f i n d命令的基本选项,下面给出f i n d命令的一些其他的例子。
为了匹配$ H O M E目录下的所有文件,下面两种方法都可以使用:
$ find $HOME -print
$ find ~ -print
为了在当前目录中查找s u i d置位,文件属主具有读、写、执行权限,并且文件所属组的用
户和其他用户具有读和执行的权限的文件,可以用:
$ find . -type f -perm 4755 -print
为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径,可以用:
$ find / -type f -size 0 -exec ls -l {} \;
为了查找/ v a r / l o g s目录中更改时间在7日以前的普通文件,并删除它们,可以用:
$ find /var/logs -type f -mtime +7 -exec rm {} \;
为了查找系统中所有属于a u d i t组的文件,可以用:
$find /-name -group audit -print
我们的一个审计系统每天创建一个审计日志文件。日志文件名的最后含有数字,这样我
们一眼就可以看出哪个文件是最新的,哪个是最旧的。A d m i n . l o g 文件编上了序号:
a d m i n . l o g . 0 0 1、a d m i n . l o g . 0 0 2等等。下面的f i n d命令将删除/ l o g s目录中访问时间在7日以前、
含有数字后缀的a d m i n . l o g文件。该命令只检查三位数字,所以相应日志文件的后缀不要超过
9 9 9。
$ find /logs -name 'admin.log[0-9][0-9][0-9] '-atime +7 -exec rm {} \;
为了查找当前文件系统中的所有目录并排序,可以用:
$ find . -type d -print -local -mount |sort
为了查找系统中所有的r m t磁带设备,可以用:
$ find /dev/rmt -print
xargs
在使用f i n d命令的- e x e c选项处理匹配到的文件时, f i n d命令将所有匹配到的文件一起传递
给e x e c执行。不幸的是,有些系统对能够传递给e x e c的命令长度有限制,这样在f i n d命令运行
几分钟之后,就会出现溢出错误。错误信息通常是"参数列太长"或"参数列溢出"。这就是
x a rg s命令的用处所在,特别是与f i n d命令一起使用。F i n d命令把匹配到的文件传递给x a rg s命
令,而x a rg s命令每次只获取一部分文件而不是全部,不像- e x e c选项那样。这样它可以先处理
最先获取的一部分文件,然后是下一批,并如此继续下去。在有些系统中,使用- e x e c选项会
为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次
执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;而使用
x a rg s命令则只有一个进程。另外,在使用x a rg s命令时,究竟是一次获取所有的参数,还是分
批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参
数来确定。
让我们来看看x a rg s命令是如何同f i n d命令一起使用的,并给出一些例子。
下面的例子查找系统中的每一个普通文件,然后使用x a rg s命令来测试它们分别属于哪类
文件:
下面的例子在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到
/tmp/core.log 文件中:
$ find . -name "core" -print | xargs echo "" >/tmp/core.log
下面的例子在/ a p p s / a u d i t目录下查找所有用户具有读、写和执行权限的文件,并收回相应
的写权限:
$ find /apps/audit -perm -7 -print | xargs chmod o-w
在下面的例子中,我们用g r e p命令在所有的普通文件中搜索d e v i c e这个词:
$ find / -type f -print | xargs grep "device"
在下面的例子中,我们用g r e p命令在当前目录下的所有普通文件中搜索D B O这个词:
$ find . -name \ *-type f -print | xargs grep "DBO"
注意,在上面的例子中, \用来取消f i n d命令中的*在s h e l l中的特殊含义。
小结
f i n d命令是一个非常优秀的工具,它可以按照用户指定的准则来匹配文件。使用e x e c和
x a rg s可以使用户对所匹配到的文件执行几乎所有的命令。
32 typedef struct
33 {
34 unsigned enterpriseID;
35 string enterpriseName;
36 string telephone;
37 unsigned long long quota;
38 unsigned long long realQuota;
39 unsigned expiration;
40 unsigned flag;
41 unsigned openlong;
42 string enterpriseStatusName;
43 string regTime;
44 string endDate;
45 string subDomain;//for shenbak to stop and start enterprise
46 }enterpriseVectorNode;
vector <enterpriseVectorNode> _enterpriseVector;
for ( vector<enterpriseVectorNode>::iterator it = _enterpriseVector.begin(); it != _enterpriseVector.end() ; ++it )
{
if ( cnt % 2 == 0 )
bgCorlor = "#f8f8f8";
else
bgCorlor = "#f5f5f5";
osTmp<<"<tr align=center "<<bgCorlor<<">";
osTmp<<"<td><input type=checkbox name=enterpriseID[] value="<<it->enterpriseID<<"></td>";
osTmp<<"<td><a href=\""<<linkUrl<<it->enterpriseID<<"\">"<<it->enterpriseName<<"</a></td>";
osTmp<<"<td>"<<it->subDomain<<"</td>";
osTmp<<"<td>"<<it->telephone<<"</td>";
osTmp<<"<td>"<<it->quota<<"</td>";
osTmp<<"<td>"<<it->realQuota<<"</td>";
osTmp<<"<td>"<<it->enterpriseStatusName<<"</td>";
osTmp<<"<td>"<<it->regTime<<"</td>";
osTmp<<"<td>"<<it->endDate<<"</td>";
osTmp<<"</tr>";
}
for( int i = 0; i < list.GetCount( ); i++ )
{
row.Empty();
sql_get2( list[i], row );
enterpriseVectorNode tmpNode;
tmpNode.enterpriseID = atoi((LPCSTR) *row[ 0 ] );
tmpNode.enterpriseName =(LPCSTR) *row[ 1 ] ;
tmpNode.telephone = (LPCSTR) *row[ 2 ] ;
tmpNode.quota = atol((LPCSTR) * row[ 3 ] );
tmpNode.realQuota = atol( (LPCSTR) *row[ 4 ] );
tmpNode.expiration = atoi( (LPCSTR) *row[ 5 ] );
tmpNode.flag = atoi( (LPCSTR) *row[ 6 ] );
tmpNode.regTime = (LPCSTR) *row[ 7 ];
tmpNode.openlong = atoi( (LPCSTR) *row[ 8 ] );
tmpNode.subDomain = (LPCSTR) *row[ 9 ];
initEnterpriseStatus( tmpNode );
string tmpStr;
dateAdd( tmpNode.regTime, tmpStr, tmpNode.openlong, 'd', errMsg );
tmpNode.endDate = tmpStr;
_enterpriseVector.push_back( tmpNode );
}
33 {
34 unsigned enterpriseID;
35 string enterpriseName;
36 string telephone;
37 unsigned long long quota;
38 unsigned long long realQuota;
39 unsigned expiration;
40 unsigned flag;
41 unsigned openlong;
42 string enterpriseStatusName;
43 string regTime;
44 string endDate;
45 string subDomain;//for shenbak to stop and start enterprise
46 }enterpriseVectorNode;
vector <enterpriseVectorNode> _enterpriseVector;
for ( vector<enterpriseVectorNode>::iterator it = _enterpriseVector.begin(); it != _enterpriseVector.end() ; ++it )
{
if ( cnt % 2 == 0 )
bgCorlor = "#f8f8f8";
else
bgCorlor = "#f5f5f5";
osTmp<<"<tr align=center "<<bgCorlor<<">";
osTmp<<"<td><input type=checkbox name=enterpriseID[] value="<<it->enterpriseID<<"></td>";
osTmp<<"<td><a href=\""<<linkUrl<<it->enterpriseID<<"\">"<<it->enterpriseName<<"</a></td>";
osTmp<<"<td>"<<it->subDomain<<"</td>";
osTmp<<"<td>"<<it->telephone<<"</td>";
osTmp<<"<td>"<<it->quota<<"</td>";
osTmp<<"<td>"<<it->realQuota<<"</td>";
osTmp<<"<td>"<<it->enterpriseStatusName<<"</td>";
osTmp<<"<td>"<<it->regTime<<"</td>";
osTmp<<"<td>"<<it->endDate<<"</td>";
osTmp<<"</tr>";
}
for( int i = 0; i < list.GetCount( ); i++ )
{
row.Empty();
sql_get2( list[i], row );
enterpriseVectorNode tmpNode;
tmpNode.enterpriseID = atoi((LPCSTR) *row[ 0 ] );
tmpNode.enterpriseName =(LPCSTR) *row[ 1 ] ;
tmpNode.telephone = (LPCSTR) *row[ 2 ] ;
tmpNode.quota = atol((LPCSTR) * row[ 3 ] );
tmpNode.realQuota = atol( (LPCSTR) *row[ 4 ] );
tmpNode.expiration = atoi( (LPCSTR) *row[ 5 ] );
tmpNode.flag = atoi( (LPCSTR) *row[ 6 ] );
tmpNode.regTime = (LPCSTR) *row[ 7 ];
tmpNode.openlong = atoi( (LPCSTR) *row[ 8 ] );
tmpNode.subDomain = (LPCSTR) *row[ 9 ];
initEnterpriseStatus( tmpNode );
string tmpStr;
dateAdd( tmpNode.regTime, tmpStr, tmpNode.openlong, 'd', errMsg );
tmpNode.endDate = tmpStr;
_enterpriseVector.push_back( tmpNode );
}
在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能。
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。
mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15
//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.
//如果只给定一个参数,它表示返回最大的记录行数目:
mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行
//换句话说,LIMIT n 等价于 LIMIT 0,n。
LIMIT A B => 从A+1--->A+B
每页10条举例:
Limit 0 10 =>1 ------>10 (第一页) (0+10)/10
Limit 10 10 =>11 ---->20 (第二页) (10+10)/10
limit 20 10 =>21 ---->30 (第三页) (20+10)/10
。。。。。。。 (第N页)
$offset=($this->page-1)*$this->limit; //$offset就是0,10,20
page=(totalpage-1)/onepage's Number;
LIMIT (page-1)*onepage's,NO onepage's Nnumber;
示例:
$pos_start = ($page - 1) * $page_size;
$sql = "select * from {$this->table_name} where touid={$uid} and fromuid={$frienduid} order by ctime desc limit {$pos_start}, {$page_size}";
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。
mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15
//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.
//如果只给定一个参数,它表示返回最大的记录行数目:
mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行
//换句话说,LIMIT n 等价于 LIMIT 0,n。
LIMIT A B => 从A+1--->A+B
每页10条举例:
Limit 0 10 =>1 ------>10 (第一页) (0+10)/10
Limit 10 10 =>11 ---->20 (第二页) (10+10)/10
limit 20 10 =>21 ---->30 (第三页) (20+10)/10
。。。。。。。 (第N页)
$offset=($this->page-1)*$this->limit; //$offset就是0,10,20
page=(totalpage-1)/onepage's Number;
LIMIT (page-1)*onepage's,NO onepage's Nnumber;
示例:
$pos_start = ($page - 1) * $page_size;
$sql = "select * from {$this->table_name} where touid={$uid} and fromuid={$frienduid} order by ctime desc limit {$pos_start}, {$page_size}";
public function GetSingleList ($uid, $frienduid, $page, $page_size = 20)
{
//add by zaifeng 2009-1-13
$rearr = array();
$sql1 = "select count(*) as num from {$this->table_name} where touid={$uid} and fromuid={$frienduid} ";
$ret = $this->objPdo->Select($sql1);
if($ret){
$total = $this->objPdo->FetchAll();
$rearr['count'] = $total[0]['num'];
}
//end add
$pos_start = ($page - 1) * $page_size;
$sql = "select * from {$this->table_name} where touid={$uid} and fromuid={$frienduid} order by ctime desc limit {$pos_start}, {$page_size}";
$result = $this->objPdo->Select($sql);
if ($result)
{
$rs_array = $this->objPdo->FetchAll();
$rearr['record'] = $rs_array;
return $rearr;
}
return FALSE;
}
{
//add by zaifeng 2009-1-13
$rearr = array();
$sql1 = "select count(*) as num from {$this->table_name} where touid={$uid} and fromuid={$frienduid} ";
$ret = $this->objPdo->Select($sql1);
if($ret){
$total = $this->objPdo->FetchAll();
$rearr['count'] = $total[0]['num'];
}
//end add
$pos_start = ($page - 1) * $page_size;
$sql = "select * from {$this->table_name} where touid={$uid} and fromuid={$frienduid} order by ctime desc limit {$pos_start}, {$page_size}";
$result = $this->objPdo->Select($sql);
if ($result)
{
$rs_array = $this->objPdo->FetchAll();
$rearr['record'] = $rs_array;
return $rearr;
}
return FALSE;
}
void trim(string& str)
{
str.erase(str.find_last_not_of(' ')+1, string::npos);
str.erase(0, str.find_first_not_of(' '));
}
//去前后空格函数结束
//参数检验
//特殊客户验证
//char *flag_domain = "afeng@afeng.sina.net"; // 这个是查要有的字符串
string flag_domain = strDomain;
ifstream fin("domain.txt");
string str;
while(getline(fin,str))
{
trim(str);//去掉读出的一行前后空格
if(flag_domain==str)
{
//printf("Content-Type:text/html\n\n");
//printf("果然有该域名\n\n");
domain_reg_filter=1;
}
}
//特殊客户验证完毕
{
str.erase(str.find_last_not_of(' ')+1, string::npos);
str.erase(0, str.find_first_not_of(' '));
}
//去前后空格函数结束
//参数检验
//特殊客户验证
//char *flag_domain = "afeng@afeng.sina.net"; // 这个是查要有的字符串
string flag_domain = strDomain;
ifstream fin("domain.txt");
string str;
while(getline(fin,str))
{
trim(str);//去掉读出的一行前后空格
if(flag_domain==str)
{
//printf("Content-Type:text/html\n\n");
//printf("果然有该域名\n\n");
domain_reg_filter=1;
}
}
//特殊客户验证完毕
怎样识别好坏女人
从感情上讲,女人真正爱上一个男人是用一生的,男人也是这样。女人只不过更容易爱上一个男人,男人的爱是有选择的。多么花的男人真正爱的也只有一个女人。
女人的爱喜欢浪漫和空灵的,男人的爱是实际的现实的。
女人爱一个人是生生死死的自私的,一旦要恨起来是刻骨铭心的仇恨,仇恨的时间还比较长,很难忘记。男人恨过就忘记了。女人记在心里,甚至寻找机会报复。男人虽有小心眼的,报复的心里也有。但是很少去行动。
女人把爱恨交织在一起,有时候分不出爱和恨来,概念是混淆的。
女人在处理感情问题的时候,少有转身就走的,决心不是那么坚决,因为她总怀念曾经有过的浪漫情感,尽管有时候是自己想结束一段情感。
男人有时候看不到希望,扭身就走,连头都不回。男人想,既然你提出分手,肯定已经想好了,肯定情感已经不属于自己了,依恋已经没有任何作用了,那又何苦?所以头也不回就走了。当男人消失在她的视野的时候,她会有些怜悯自己也怜悯那个被她抛弃的人,她会落泪,悲伤不知道为什么?是后悔?不是!是依恋也不是。就是那么莫名其妙,就是那样无名。
很多男人失败在只要稍加沉稳,做些工作,走上感情偏道的女人就会回头,但是他们没有那么做。
女人小性儿,任性是女人的天生性情,好在后天的教养培养了素养,多少有些克制。当男人对任性的女人没办法的时候,他就有了办法,那就是下决心分手了。当女人发现的时候就有些后悔了,真爱的人会去争取谅解,稍有不稳定的情感基础就可能因此结束一切。
矫情也是女人的看家本领,她不认为是弱点,女人稍微矫情也没什么,就怕把矫情当了撒娇,那就麻烦大了。撒娇是女人温柔的一面和矫情是有区别的,撒娇的女人可爱,矫情的女人让人讨厌。
虚荣更是女人私家物。没有不虚荣的女人,这也不是错。虚荣的女人到给男人上进的压力,督促男人为自己和家庭做贡献。但是,虚荣无边的时候,成了无底洞的时候,麻烦也来了。男人的动力就变成懒惰和无奈了。女人总往高处看,看的是不实际的东西,她们往往把梦当现实去看待,这样男人就不堪负重了。任何好的男人都受不了女人无边际的虚荣心。
目光短浅也是女人的弱点,她们从来看即时的利益,很少有远见看到未来。她们认为眼前的和未来没什么联系,所以即时的不满足会导致她不高兴,发生任性或胡搅蛮缠的态度。
女人都看不上狐媚的女人,嘴撇的很远,眼睛却乜斜着看,心理想自己狐媚起来比她强,实际自己心理也想跃跃欲试。
比美是女性的天性,只不过不象孔雀来个开屏,实际心屏已经开了。暗地里较着劲。
聪明的女人把一切看在心里,不表露出来,没人的时候自己修饰自己,偷偷地去赶时髦和时尚。
女人一切劣根性实际是男人宠出来的,你不去宠她,她说你不爱她,你去宠她她说你好,好的时间常了,就腻歪了,感觉你没气质也没气度。
女人就你近了她就疏远你,远了她就怨恨你。所以,女人不是东西,不是轻易就能拿起和放下的。
不过女人是可以调教的,你适当地拿她当宝瓶,然后再拿她做可有可无的瓦罐或许好些。
从感情上讲,女人真正爱上一个男人是用一生的,男人也是这样。女人只不过更容易爱上一个男人,男人的爱是有选择的。多么花的男人真正爱的也只有一个女人。
女人的爱喜欢浪漫和空灵的,男人的爱是实际的现实的。
女人爱一个人是生生死死的自私的,一旦要恨起来是刻骨铭心的仇恨,仇恨的时间还比较长,很难忘记。男人恨过就忘记了。女人记在心里,甚至寻找机会报复。男人虽有小心眼的,报复的心里也有。但是很少去行动。
女人把爱恨交织在一起,有时候分不出爱和恨来,概念是混淆的。
女人在处理感情问题的时候,少有转身就走的,决心不是那么坚决,因为她总怀念曾经有过的浪漫情感,尽管有时候是自己想结束一段情感。
男人有时候看不到希望,扭身就走,连头都不回。男人想,既然你提出分手,肯定已经想好了,肯定情感已经不属于自己了,依恋已经没有任何作用了,那又何苦?所以头也不回就走了。当男人消失在她的视野的时候,她会有些怜悯自己也怜悯那个被她抛弃的人,她会落泪,悲伤不知道为什么?是后悔?不是!是依恋也不是。就是那么莫名其妙,就是那样无名。
很多男人失败在只要稍加沉稳,做些工作,走上感情偏道的女人就会回头,但是他们没有那么做。
女人小性儿,任性是女人的天生性情,好在后天的教养培养了素养,多少有些克制。当男人对任性的女人没办法的时候,他就有了办法,那就是下决心分手了。当女人发现的时候就有些后悔了,真爱的人会去争取谅解,稍有不稳定的情感基础就可能因此结束一切。
矫情也是女人的看家本领,她不认为是弱点,女人稍微矫情也没什么,就怕把矫情当了撒娇,那就麻烦大了。撒娇是女人温柔的一面和矫情是有区别的,撒娇的女人可爱,矫情的女人让人讨厌。
虚荣更是女人私家物。没有不虚荣的女人,这也不是错。虚荣的女人到给男人上进的压力,督促男人为自己和家庭做贡献。但是,虚荣无边的时候,成了无底洞的时候,麻烦也来了。男人的动力就变成懒惰和无奈了。女人总往高处看,看的是不实际的东西,她们往往把梦当现实去看待,这样男人就不堪负重了。任何好的男人都受不了女人无边际的虚荣心。
目光短浅也是女人的弱点,她们从来看即时的利益,很少有远见看到未来。她们认为眼前的和未来没什么联系,所以即时的不满足会导致她不高兴,发生任性或胡搅蛮缠的态度。
女人都看不上狐媚的女人,嘴撇的很远,眼睛却乜斜着看,心理想自己狐媚起来比她强,实际自己心理也想跃跃欲试。
比美是女性的天性,只不过不象孔雀来个开屏,实际心屏已经开了。暗地里较着劲。
聪明的女人把一切看在心里,不表露出来,没人的时候自己修饰自己,偷偷地去赶时髦和时尚。
女人一切劣根性实际是男人宠出来的,你不去宠她,她说你不爱她,你去宠她她说你好,好的时间常了,就腻歪了,感觉你没气质也没气度。
女人就你近了她就疏远你,远了她就怨恨你。所以,女人不是东西,不是轻易就能拿起和放下的。
不过女人是可以调教的,你适当地拿她当宝瓶,然后再拿她做可有可无的瓦罐或许好些。
机箱:永阳YY-A209 价格:250元;
内存:Kingmax 1GB DDR2 800 Long-DIMM 价格:185+185=370 组2G双通道;
硬盘:西捷160G HardDisk 160G SATA 价格:500元
cpu:Core 2 Duo(酷睿e6300) 1220元;(价格太高了,主板也支持不了。可笑)
Intel奔腾双核 E2140(盒) 价格:估计500来块钱 减少800块钱
电源:长城350 150 元;
主板:华硕主板945p P5LD2 SE 豪华版本 700元
显卡:华硕的一款6200独立显卡 黑潮ib100 也可
液显:明基 FP94VW 1949元 鼠标、键盘 三星anypro 水系套装(水晶键+水之灵动) 120元
光驱:BenQ 1650V 180元
(合计:5439元-800块钱)
控制在5000内的最终配置:
http://www.happycun.com/doc.doc
内存:Kingmax 1GB DDR2 800 Long-DIMM 价格:185+185=370 组2G双通道;
硬盘:西捷160G HardDisk 160G SATA 价格:500元
cpu:Core 2 Duo(酷睿e6300) 1220元;(价格太高了,主板也支持不了。可笑)
Intel奔腾双核 E2140(盒) 价格:估计500来块钱 减少800块钱
电源:长城350 150 元;
主板:华硕主板945p P5LD2 SE 豪华版本 700元
显卡:华硕的一款6200独立显卡 黑潮ib100 也可
液显:明基 FP94VW 1949元 鼠标、键盘 三星anypro 水系套装(水晶键+水之灵动) 120元
光驱:BenQ 1650V 180元
(合计:5439元-800块钱)
控制在5000内的最终配置:
http://www.happycun.com/doc.doc
糯米面或黏玉米面的汤圆面料存放时间过长,做出的汤圆就会发红;制作好的汤圆用盒或塑料袋包装,由于其含量校高又密不透气,因此极易变质而变色。颜色的改变说明米面已被一种叫做“酵米面黄杆菌”的病菌所污染,食用后会引起中毒。“酵米面黄杆菌”可释放出一种剧毒素——黄杆菌毒素A,其毒性强烈,耐热性和抵抗力极缋,无论是油煎、火烙、蒸煮等烹调方法均不能破坏其毒性。被“酵米面黄杆菌”所污染的霉变汤圆面料,一般中毒量为0.1—0.3克/千克,为防止 “酵米面黄杆菌”毒素A中毒发生,汤圆面料要现磨现做现吃,存放期超过3天以上的,勿再食用。
问题详述:我全身过敏..身上用东西一碰就会跳起来.而且很痒...
最佳答案: 应该是丘疹性荨麻疹,临床表现一般是:皮损为1~2cm大的圆形或椭圆形风团样丘疹,中心有丘疹、丘疱疹或水疱,有时为大疱或血疱。风团损害可很快消失,但丘疹可存在1周左右。皮损数目不定,不互相融合,可分批陆续出现。消退后遗留暂时性色素沉着。治疗;一般用抗过敏药物,如息斯敏,或肌注强力解毒敏。
可外用含0.5%~l%薄荷脑或酚的炉甘石洗剂或2%樟脑霜,也可外用止痒粉,有继发感染的皮损,可外用新霉素软膏。
另外1。要搞好环境卫生及居室卫生,以杜绝跳蚤,臭虫、蚊、螨等的孳生。2.住所喷撒杀虫剂,以消灭叮咬人们的节肢动物。3.限制过量蛋白(牛乳、鸡蛋)、糖果糕点的摄入,补充新鲜青菜、水果。
发现了一个药方,但要坚持服药一段时间。药方如下:甲氰咪呱片.扑尔敏片.脑益嗪片各1片;Vc片2片;均每天3次.病程短的连服半月,长的服一月.一定要坚持服用!
【用法用量】口服。一日一次。12岁以上儿童及成人:每日不超过10mg。6-12岁儿童,每日5mg。6岁以下儿童:每日每公斤体重0.2mg/kg。15公斤体重以上小儿:每日3毫克。成人和儿童都不应超过上述推荐剂量服用。
【药品名称】 通用名称:阿司咪唑 商品名称:息斯敏 英文名称:Astemizole Tablets 汉语拼音:Asimizuo Pian【规 格】3mg【参考价格】15.40元/盒(30片)*【批准文号】国药准字H19999510【生产企业】西安杨森制药有限公司【功能主治】/【适应症】本品用于治疗常年性和季节性过敏性鼻炎、过敏性结膜炎、慢性荨麻疹和其它过敏性反应症状及体征。【用法用量】口服。一日一次。12岁以上儿童及成人:每日不超过10mg。6-12岁儿童,每日5mg。6岁以下儿童:每日每公斤体重0.2mg/kg。15公斤体重以上小儿:每日3毫克。成人和儿童都不应超过上述推荐剂量服用。【不良反应】1.心血管系统:根据国外文献报道,超量服用本品可发生Q-T间期延长或室性心律失常,包括表现为晕厥的尖端扭转型室性心动过速。2.偶见体重增加,过敏反应(如:血管性水肿、支气管痉挛、光敏感、瘙痒、皮疹),且有个别惊厥、良性感觉异常、肌痛/关节痛、水肿、情绪紊乱、失眠、恶梦、基转移氨酶升高和肝炎的报道。其中大部分病例是否与息斯敏有直接关系尚不明确。【禁 忌】1.对本品过敏者禁用。2.妊娠妇女禁用。3.由于本品广泛经肝脏代谢,故有严重肝功能障碍者禁用。4.存在Q-T间期延长和低钾血症患者禁用。5.禁忌与已有心律失常者的某些治疗药物合用。如:抗心律失常药、安定药(Neuroleptic)、三环类抗抑郁药、特非那丁。6.禁忌与艾滋病毒蛋白酶抑制剂(如:利托那韦、茚地那韦),Mibefradil(一种新型的钙拮抗剂),治疗剂量的奎宁合用。7.禁忌超剂量服用。【注意事项】1.因阿司咪唑广泛地经肝脏代谢,患有显著肝功能障碍的患者应尽量避免服用本品。2.具有心电图Q-T间期延长倾向的患者服用阿司咪唑有可能导致Q-T间期延长和/或室性心律失常。因此建议患有先天性Q-T综合征或同服可能延长Q-T间期的药物(包括抗心律失常药和特非那丁)及低血钾症的患者应尽量避免服用本品。【孕妇及哺乳期妇女用药】1.动物实验表明,阿司咪唑对生殖功能无影响、无致畸作用,在给很大剂量(40mg/kg)时,对家兔胚胎无毒性,但对大鼠胚胎有毒性作用。在大样本的人群试验中,阿司咪唑不增加胚胎异常。2.在对哺乳期的狗进行的实验中,阿司咪唑及其代谢产物从母乳中排出,但其浓度很低。3.阿司咪唑在孕妇和哺乳期妇女中应用尚未发现对发育中的胎儿存在潜在的危害。哺乳期妇女必须在医生指导下权衡利弊使用。
最佳答案: 应该是丘疹性荨麻疹,临床表现一般是:皮损为1~2cm大的圆形或椭圆形风团样丘疹,中心有丘疹、丘疱疹或水疱,有时为大疱或血疱。风团损害可很快消失,但丘疹可存在1周左右。皮损数目不定,不互相融合,可分批陆续出现。消退后遗留暂时性色素沉着。治疗;一般用抗过敏药物,如息斯敏,或肌注强力解毒敏。
可外用含0.5%~l%薄荷脑或酚的炉甘石洗剂或2%樟脑霜,也可外用止痒粉,有继发感染的皮损,可外用新霉素软膏。
另外1。要搞好环境卫生及居室卫生,以杜绝跳蚤,臭虫、蚊、螨等的孳生。2.住所喷撒杀虫剂,以消灭叮咬人们的节肢动物。3.限制过量蛋白(牛乳、鸡蛋)、糖果糕点的摄入,补充新鲜青菜、水果。
发现了一个药方,但要坚持服药一段时间。药方如下:甲氰咪呱片.扑尔敏片.脑益嗪片各1片;Vc片2片;均每天3次.病程短的连服半月,长的服一月.一定要坚持服用!
【用法用量】口服。一日一次。12岁以上儿童及成人:每日不超过10mg。6-12岁儿童,每日5mg。6岁以下儿童:每日每公斤体重0.2mg/kg。15公斤体重以上小儿:每日3毫克。成人和儿童都不应超过上述推荐剂量服用。
【药品名称】 通用名称:阿司咪唑 商品名称:息斯敏 英文名称:Astemizole Tablets 汉语拼音:Asimizuo Pian【规 格】3mg【参考价格】15.40元/盒(30片)*【批准文号】国药准字H19999510【生产企业】西安杨森制药有限公司【功能主治】/【适应症】本品用于治疗常年性和季节性过敏性鼻炎、过敏性结膜炎、慢性荨麻疹和其它过敏性反应症状及体征。【用法用量】口服。一日一次。12岁以上儿童及成人:每日不超过10mg。6-12岁儿童,每日5mg。6岁以下儿童:每日每公斤体重0.2mg/kg。15公斤体重以上小儿:每日3毫克。成人和儿童都不应超过上述推荐剂量服用。【不良反应】1.心血管系统:根据国外文献报道,超量服用本品可发生Q-T间期延长或室性心律失常,包括表现为晕厥的尖端扭转型室性心动过速。2.偶见体重增加,过敏反应(如:血管性水肿、支气管痉挛、光敏感、瘙痒、皮疹),且有个别惊厥、良性感觉异常、肌痛/关节痛、水肿、情绪紊乱、失眠、恶梦、基转移氨酶升高和肝炎的报道。其中大部分病例是否与息斯敏有直接关系尚不明确。【禁 忌】1.对本品过敏者禁用。2.妊娠妇女禁用。3.由于本品广泛经肝脏代谢,故有严重肝功能障碍者禁用。4.存在Q-T间期延长和低钾血症患者禁用。5.禁忌与已有心律失常者的某些治疗药物合用。如:抗心律失常药、安定药(Neuroleptic)、三环类抗抑郁药、特非那丁。6.禁忌与艾滋病毒蛋白酶抑制剂(如:利托那韦、茚地那韦),Mibefradil(一种新型的钙拮抗剂),治疗剂量的奎宁合用。7.禁忌超剂量服用。【注意事项】1.因阿司咪唑广泛地经肝脏代谢,患有显著肝功能障碍的患者应尽量避免服用本品。2.具有心电图Q-T间期延长倾向的患者服用阿司咪唑有可能导致Q-T间期延长和/或室性心律失常。因此建议患有先天性Q-T综合征或同服可能延长Q-T间期的药物(包括抗心律失常药和特非那丁)及低血钾症的患者应尽量避免服用本品。【孕妇及哺乳期妇女用药】1.动物实验表明,阿司咪唑对生殖功能无影响、无致畸作用,在给很大剂量(40mg/kg)时,对家兔胚胎无毒性,但对大鼠胚胎有毒性作用。在大样本的人群试验中,阿司咪唑不增加胚胎异常。2.在对哺乳期的狗进行的实验中,阿司咪唑及其代谢产物从母乳中排出,但其浓度很低。3.阿司咪唑在孕妇和哺乳期妇女中应用尚未发现对发育中的胎儿存在潜在的危害。哺乳期妇女必须在医生指导下权衡利弊使用。
呵呵,2007年过去了,2008年来到了,2008年啊,估计是一个好年成,该走了喔,到友谊宾馆坐大巴到首都机场,然后就可以上飞机到杭州了,祝我自己好运,(*^__^*) 嘻嘻……,加油。忘掉过去展望未来。。。。。
博主:回忆未来
2007-2-6
博主:回忆未来
2007-2-6
http://man.ddvip.com/os/freebsd_book_chs/ch22.htm
什么是FreeBSD?
http://man.ddvip.com/os/freebsd_book_chs/ch01.htm
http://man.ddvip.com/os/freebsd_book_chs/ch02.htm
。
。
。
什么是FreeBSD?
http://man.ddvip.com/os/freebsd_book_chs/ch01.htm
http://man.ddvip.com/os/freebsd_book_chs/ch02.htm
。
。
。
我想说既然我们来到这个世界上,就不能太客气了,人在哪里我们就混到哪里,上学的时候老师教育我们说,我们来到这个世界,不是为了从中拿走什么,而是要努力为这个世界增添光彩,那时候我同意,现在我也同意,可是怎样才能做到呢,我相信这一点他们也不清楚,就是清楚他们也不一定能做到,他们告诉我们的只是他们的梦想,好吧我们听他们的,把他们的梦想当成我们的,我们像他们一样,为了梦想去奋斗,可是梦想是艰难的,因为那梦想就是我们所有人的人生,就是我们的爱情,我们的事业,我们的幸福。可是,当我们把那抽象的梦想变成一件件具体的事情的时候,我发现我们离那梦想很遥远,特别遥远,但是我们不会放弃,我们会努力做好每一件事。在这个世界上,我们会碰到很多好事儿,也会碰到很多坏事儿,今天以前它们都过去了,明天它们还会跟我们迎头相撞,我们的态度是,我们谁也不怵坏事儿
"真实"和"谎言"一起到河边洗澡, 先上岸的"谎言"偷偷穿上"真实"的衣服不肯归还,固执的 "真实" 死也不肯穿上"谎言"的衣服,只好一丝不挂光溜溜地走回家。从此,人们眼中只有穿着真实外衣的谎言,却怎么也无法接受赤裸裸的真实!
"真实"和"谎言"一起到河边洗澡, 先上岸的"谎言"偷偷穿上"真实"的衣服不肯归还,固执的 "真实" 死也不肯穿上"谎言"的衣服,只好一丝不挂光溜溜地走回家。从此,人们眼中只有穿着真实外衣的谎言,却怎么也无法接受赤裸裸的真实!
本文介绍使用
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