更深入一点理解 switch 语句 及 c/c++ 对 const 的处理
                                    谢煜波
http://blog.csdn.net/xiaohan13916830/archive/2004/08/17/76724.aspx


前段时间在论坛上看见台湾李维在<>一书中对windows编程模式中,消息处理部分有如下的一些分析:
他说,在消息处理循环中,一般的形式是这样的
MSG msg ;
switch( msg ){
        case WM_XXXXXXX :
                ....
        case WM_XXXXXXX :
                ....
        case WM_XXXXXXX :
                ....
} ;
李维说,这种模式是很低效的,因应经过汇编后,这种C代码会产生如下的汇编代码
        cmp .... .....
        jnz .... .....
        cmp .... .....
        jnz .... .....
        cmp .... .....
        jnz .... .....
如果你的 case 足够多,比如,你有一万条消息需要处理,而不幸的是你把一条最常用的消息
放在了最后一位,那么当这条消息要得到处理,会首先经过一万次的cmp与jnz, 李维认为,这
是非常非常低效的,实在是低效的忍无可忍,无需再忍~~:P

在起初,我也是这样认为的,但近来的阅读及实验却发现,这种看法非常片面,今天就来谈谈这个问题( 所有实验在 linux 平台下完成 )

首先看一到用 c 编写的程序
/* -------------------- filename : ta.c --------------- */
int switch_test_first( int x )
{
        int res ;
        switch( x ){
                case 100 :
                        res = 1 ;
                        break ;
                case 102 :
                        res = 2 ;
                        break ;
                case 103 :
                        res = 3 ;
                        break ;
        }
        return res ;
}
然后,我们用 gcc 将它编译成汇编文件( 使用 -S 开关 )
gcc -S ta.c
将得到如下的汇编文件( ta.s )
        .file   "ta.c"
        .text
.globl switch_test_first
        .type   switch_test_first,@function
switch_test_first:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $8, %esp
        movl    8(%ebp), %eax
        .file   "ta.c"
        .text
.globl switch_test_first
        .type   switch_test_first,@function
switch_test_first:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $8, %esp
        movl    8(%ebp), %eax
        movl    %eax, -8(%ebp)
        cmpl    $102, -8(%ebp)          // 1
        je      .L4                     // 2
        cmpl    $102, -8(%ebp)          // 3    
        jg      .L8                     // 4
        cmpl    $100, -8(%ebp)          // 5
        je      .L3                     // 6
        jmp     .L2                     // 7
.L8:
        cmpl    $103, -8(%ebp)
        je      .L5
        jmp     .L2
.L3:
        movl    $1, -4(%ebp)
        jmp     .L2
.L4:
        movl    $2, -4(%ebp)
        jmp     .L2
.L5:
        movl    $3, -4(%ebp)
.L2:
        movl    -4(%ebp), %eax
        leave
        ret
.Lfe1:
        .size   switch_test_first,.Lfe1-switch_test_first
        .ident  "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"

注意看文件中 // 1 ~ // 7 的部份,从这个部份,我们可以看出,gcc确实是把一些case语句转成了李维所说的那种方式进行处理,我们看见了代码中存在有众多的 cmpl 与 jmp 语句
这就相当于你使用if..else..一样,但是否总是这样呢?

我们下面改动一下 ta.c 这个文件,在里面再多加一些 case 语句
/* -------------- filename : new_ta.c ------------------- */
int switch_test_first( int x )
{
        int res ;
        switch( x ){
                case 100 :
                        res = 1 ;
                        break ;
                case 102 :
                        res = 2 ;
                        break ;
                case 103 :
                        res = 3 ;
                        break ;
                case 104 :
                        res = 4 ;
                        break ;
                case 105 :
                        res = 5 ;
                        break ;
                case 106 :
                        res = 6 ;
                        break ;
        }
        return res ;
}
这个 new_ta.c 与原来的 ta.c 在结构上完全相同,唯一不同的就是 case 语句的数量变多了,下面我们来编译一下这个文件
gcc -S new_ta.c
下面是我们产生的更新的汇编文件
        .file   "new_ta.c"
        .text
.globl switch_test_first
        .type   switch_test_first,@function
switch_test_first:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $8, %esp
        movl    8(%ebp), %eax
        subl    $100, %eax
        movl    %eax, -8(%ebp)
        cmpl    $6, -8(%ebp)
        ja      .L2
        movl    -8(%ebp), %edx
        movl    .L9(,%edx,4), %eax
        jmp     *%eax
        .section        .rodata
        .align 4
        .align 4
.L9:                             // A
        .long   .L3
        .long   .L2
        .long   .L4
        .long   .L5
        .long   .L6
        .long   .L7
        .long   .L8
        .text
.L3:                            // 1
        movl    $1, -4(%ebp)
        jmp     .L2
.L4:                            // 2
        movl    $2, -4(%ebp)
        jmp     .L2
.L5:                            // 3
        movl    $3, -4(%ebp)
        jmp     .L2             // 4  
.L6:
        movl    $4, -4(%ebp)
        jmp     .L2             // 5
.L7:
        movl    $5, -4(%ebp)    // 6
        jmp     .L2
.L8:                            // 7
        movl    $6, -4(%ebp)
.L2:                            
        movl    -4(%ebp), %eax
        leave
        ret
.Lfe1:
        .size   switch_test_first,.Lfe1-switch_test_first
        .ident  "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"

仔细比较一下这个最新的 new_ta.s 与前面的 ta.s,精华全在里面了!
首先 new_ta.s 比前面的 ta.s 多了一个 .L9 部分,而且它的 // 1 ~ // 7 中没有了前面
ta.s 文件中所存在的众多的 cmpl 与 jmp 语句,那么,现在这样的代码又是怎么实现
switch 语句中的跳转的呢?我们来仔细分析一下它新多出来的 .L9 部份。
        .section        .rodata
        .align 4
        .align 4
.L9:
        .long   .L3
        .long   .L2
        .long   .L4
        .long   .L5
        .long   .L6
        .long   .L7
        .long   .L8
        .text
显而易见,.L9 部份是一个我们最常见的数据结构——表,它的每一项都是一个标号,而这个标号,恰恰是每个 case 语句的入口标号!
这很容易让我们想到,它很可能是用了一张表来存放所有的 case 语句的入口,然后,在
执行 switch 语句的时候就从这个表中直接检出相应的 case 语句的入口地址,然后跳转
到相应的 case 语句去执行,就像hash_table似的。具体是不是这样呢?我们看看进入
switch 部份的代码:

        pushl   %ebp
        movl    %esp, %ebp
        subl    $8, %esp
        movl    8(%ebp), %eax
        subl    $100, %eax
        movl    %eax, -8(%ebp)
        cmpl    $6, -8(%ebp)
        ja      .L2
        movl    -8(%ebp), %edx
        movl    .L9(,%edx,4), %eax // 1
        jmp     *%eax              // 2
果然如此!首先在 // 1 处根据%edp的值(其值相当于表的下标)在.L9的表中找到相应
case 语句的入口地址,并把这个地址存到%eax中,然后通过 // 2 (这是一个间接跳转
语句)转到%eax存放的地址中,也即相应的case语句处。
C编译器,果然聪明!

通过这个分析我们可以知道如下两点:
1. 当 case 语句少的时候,C编译器将其转成 if..else.. 类型进行处理,运用较多的
   cmp 与 jmp 语句 ,而当 case 语句较多的时候,C编译器会出成一个跳转表,而直
   接通过跳转表进行跳转,这让 switch 具有非常高的效律,而且效律几乎不会因为
   case 语句的增长而减小,李维所担忧的问题是完全不会发生的
2. 可以问答下面几个问题:
   1. 为什么 case 语句中需要的是整数类型而不能是其余的类型?
      这是因为,case 语句中的这个值是用来做跳转表的下标的,因此,当然必须是整数
   2. 为什么 case 语句在不加break的时候具有直通性?
      这是因为跳转是在进入 switch 是计算出的,而不是在case语句中计算出的,整个
      case 语句群就是一块完整而连续的代码,只是switch让其从不同的位置开始执行。

上面的内容,在《Computer Systems A Programmer's Perspective》中有很详细的论述,
感兴趣可以去找来仔细看看~~~

既然,case 语句需要的是整数的常量值,那么我们是否可用 const 类型呢?比如下面
一段代码:

const int c_1 = 100 ;
const int c_2 = 102 ;

void test( int x )
{
        switch( x ){
                case c_1 :
                        ++x ;
                case c_2 :
                        --x ;
        }
}

这段代码,用 c 编译器编译,编译器会提示错误,但在 c++ 编译器中却不会,这主要是由于 c , 与 c++ 编译器对 const 这个东东的处理不同。我们来看看下面一段 c 程序
/*------------- filename : const_c.c -----------*/
const int a = 15 ;

void f( int x )
{
        x = a ;
}
同样用 gcc 编译
gcc -S const_c.c
然后,来看看它的汇编文件
        .file   "const_c.c"
.globl a
        .section        .rodata
        .align 4
        .type   a,@object
        .size   a,4
a:                             // 1
        .long   15
        .text
.globl f
        .type   f,@function
f:
        pushl   %ebp
        movl    %esp, %ebp
        movl    a, %eax        // 2  
        movl    %eax, 8(%ebp)
        leave
        ret
.Lfe1:
        .size   f,.Lfe1-f
        .ident  "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
注意 // 1 处,C 编译器为 a 分配了地址,并把它的值设为 15 ,而在 // 2 处,它是将
a 这个地址中的值赋给了 %eax,这同一般的普通变量而非const 变量赋值没什么两样

下面我们用 c++ 编译器来编译这段代码,它产生的汇编文件如下:
        .file   "const_cpp.cpp"
        .text
        .align 2
.globl _Z1fi
        .type   _Z1fi,@function
_Z1fi:
.LFB2:
        pushl   %ebp
.LCFI0:
        movl    %esp, %ebp
.LCFI1:
        movl    $15, 8(%ebp)  // 1
        leave
        ret
.LFE2:
.Lfe1:
        .size   _Z1fi,.Lfe1-_Z1fi
        .section        .rodata
        .align 4
        .type   a,@object
        .size   a,4
a:
        .long   15
        .ident  "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
同样注意// 1 处,它以经把 a 的值用 15 来取代了,
也就是说,在c中const变量的行为更像一个非const变量,而在cpp中,const变量的行为就像是#define
由于 c++ 中,const 变量的值是在编译时就计算出来的,因此,它可以用在 case 语句中,而 c 中,const值在编译时只是一个变量的地址,因此,它无法用在 case 语句中.
-----------------------------------------------------------------------------
参考文献:<>
            曾看过一句话,给我非常深刻的印象:“在人生的每段记忆,总会有这么一个人带给记忆以生命。”是的,总有一些东西、一些人、一些细节在脑海徘徊。其实,记得太多东西也并非一件幸运的事,谁记得一切,谁就感到沉重!但当有一天,我突然强烈感到记忆正在慢慢被我忘却,而我一直觉得对一个人最大的伤害、最大的不公平,其实不是仇恨,而是漠视他或她的存在……于是,就有了这个新的分类栏目:转瞬红颜 ,用以怀念我那些逝去或即将逝去的时光,古人曾结绳纪事,我也学着用blog记述那些曾经的存在!

             之所以喜欢这部连续剧,其实只是因为觉得女主角好看,才这么说的,一般一部不怎么好的连续剧,我都会努力找出它的优点(尽管有时候优点并不存在),譬如说这部连续剧《甘十九妹》中扮演甘十九妹的杨露mm就很PP,让人如此难忘……

              后来,我在貂禅爱上了西施(QQYIRAN的空间)里,看到男女主角相遇时说的那段对白,这才觉得那还是蛮经典的,特别是在当年的连续剧中还是很大胆幽默的,《甘十九妹》这部连续剧改编自香港著名武侠小说家萧逸的同名作品,剧中人物的对白还是蛮简洁的,很有点古龙大师的味道,这可能也与剧中男主角张子健的形象蛮适合的……

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


点击在新窗口中浏览此图片

点击在新窗口中浏览此图片

点击在新窗口中浏览此图片

点击在新窗口中浏览此图片

点击在新窗口中浏览此图片

点击在新窗口中浏览此图片

点击在新窗口中浏览此图片
http://www.yuanma.org/data/2006/0803/article_1307.htm
架构基于FreeBSD和Postfix的IGENUS Webmail邮件系统
baidu

  本文介绍使用FreeBSD+Postfix+Cyrus-sasl+Courier-imap+igenus+spamassassin+ Clamav+mailscanner+mailscanner-mrtg+mailman来架构一个具有多域名,有邮件列表、webmail、防病毒、防垃圾邮件、web管理界面的邮件系统。

Jacky, $Revision: 4.51 bate $Date: 2005-12-03

  系统主要采用MailScanner+clamav+Spamd+APF来对病毒过滤和垃圾邮件过滤。

  本文在4.10、5.3、5.4、6.0上安装测试通过,病毒过滤放弃采用amavisd。主要采用执行效率更高的MailSanner来对邮件过滤和垃圾邮件过滤,配置更容易,并且降低了系统开消。让系统更加稳定,经过严格病毒邮件测试成功率达到了100%。垃圾邮件过滤基本上达到了95%的成功率。

Table of Contents
Chapter 1. 系统安装
1.1 安装MySQL
1.2 安装Apache
1.3 安装PHP
1.4 安装zend
1.5 安装openssl
1.6 安装phpMyAdmin
1.7 通过phpMyadmin设置数据库
1.8安装Courier-imap
1.9安装 postfix 和 cyrus-sasl
1.10 安装expect
Chapter 2. 配置邮件服务器
2.1 配置rc.conf
2.2 配置postfix 和 cyrus-sasl
2.3 配置Courier-imap
Chapter 3. 手动设置第一个用户并测试
Chapter 4. 安装postfix管理工具
4.1安装本人开发的postfix管理工具
4.2 用户登录测试
Chapter 5. 防病毒与防垃圾邮件
5.1 安装Clamav
5.2 安装MailScanner
5.3 安装配置Spamassassin
5.4修改Postfix设定档main.cf
5.5修改mailscanner.conf
5.6新增MailScanner所要用到的资料夹
5.7把病毒提示信息改为中文
5.8MailScanner监管进出邮件
5.9 邮件流量监控(mailscanner-mrtg)安装与设置
5.10.安装APF防垃圾邮件
Chapter 6. 安装webmail
Chapter 7邮件列表(mailman)
Chapter 8. 查看系统状态

Chapter 1. 系统安装

  安装之前:因用户数据都保存在/var目录下,因此安装FreeBSD时/var的空间应尽量大。FreeBSD的版本为5.3,按最小化安装,软件包只安装cvsup,安装结束后用cvsup更新ports树。在文档中假设服务器的ip地址为192.168.0.2,域名为 toping.net,主机名为mail.toping.net。

请兄弟们仔细一些,注意空格和TAB。

祝兄弟们好运。本人水平有限。如果发现文章中有什么错误和不当的地方请发邮件:scyz@toping.net。我会在第一时间给予答复。

1.1 安装MySQL

mail# cd /usr/ports/databases/mysql40-server
mail# make install clean

编辑/etc/rc.conf,加入
mysql_enable="YES"

1.2 安装Apache

mail# cd /usr/ports/www/apache2
mail# make install clean

编辑/etc/rc.conf,加入
Apache2_enable="YES"

1.3 安装PHP

mail# cd /usr/ports/www/mod_php4
mail# make install clean

我的选择:(注意别选DEBUG,否则会和ZEND有冲突)
[X] APACHE2 Use apache 2.x instead of apache 1.3.x

安装需要的PHP扩展模块
mail# cd /usr/ports/lang/php4-extensions
mail# make install clean

我选择了下面的模块:

[X] BCMATH bc style precision math functions
[X] BZ2 bzip2 library support
[X] CALENDAR calendar conversion support
[X] CRACK crack support
[X] CTYPE ctype functions
[X] CURL CURL support
[X] FTP FTP support
[X] GD GD library support
[X] GETTEXT gettext library support
[X] FILEINFO fileinfo support
[X] IMAP IMAP support
[X] MBSTRING multibyte string support
[X] MCAL Modular Calendar Access Library support
[X] MCRYPT Encryption support
[X] MCVE MCVE support
[X] MHASH Crypto-hashing support
[X] MYSQL MySQL database support
[X] PCRE Perl Compatible Regular Expression support
[X] POSIX POSIX-like functions
[X] SESSION session support
[X] TOKENIZER tokenizer support
[X] XML XML support
[X] ZLIB ZLIB support

最后在编辑/usr/local/etc/apache2/httpd.conf最后加入:
DirectoryIndex index.html index.html.var index.php

#注:在DirectoryIndex这里加入index.php,是为了让apache支持首页为index.php的首页文件

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

Group www、User www修改为: Group postfix、User postfix
注:以上这一步要在postfix安装后再操作

1.4.安装zend

mail# cd /usr/ports/devel/ZendOptimizer
mail# make install clean

因为版权的问题,他不会自动下载。这里你需要到他的官方网站去下载ZendOptimizer-2.5.10a-freebsd4.3-i386.tar.gz到/usr/ports/distfiles目录下面后再安装。

下载地址:
http://downloads.zend.com/optimizer/2.5.10/ZendOptimizer-2.5.10a-freebsd4.3-i386.tar.gz

完成后在/usr/local/etc/php.ini中加入:

[Zend]
zend_optimizer.optimization_level=15
zend_extension_manager.optimizer="/usr/local/lib/php/20020429/Optimizer"
zend_extension_manager.optimizer_ts="/usr/local/lib/php/20020429/Optimizer_TS"
zend_extension="/usr/local/lib/php/20020429/ZendExtensionManager.so"
zend_extension_ts="/usr/local/lib/php/20020429/ZendExtensionManager_TS.so"

重启apache安装完成。

1.5 安装openssl

mail# cd /usr/ports/security/openssl
mail# make install clean

1.6 安装phpMyAdmin

mail# cd /usr/ports/databases/phpmyadmin
mail# make fetch
注:(在这里建议直接下载后复制安装)

mail# cd /usr/ports/distfiles
mail# tar –zxvf PhpMyadmin-x.tar.gz
mail# mv /usr/local/www/phpMyAdmin-x /usr/local/www/data/dbadmin

修改/usr/local/www/data/dbadmin/config.inc.php
$cfg['PmaAbsoluteUri'] = 'http://192.168.0.2/dbadmin/';
$cfg['Servers'][$i]['auth_type'] = 'http'; // Authentication method (config, http or cookie based)?
注:指定phpmyadmin的认证方式为http方式。

在浏览器输入http://192.168. 0.2/dbadmin/,首次进行登入的用户名为root密码为空,登入后可以修改你的密码。

1.7 通过phpMyadmin设置数据库

建立postfix数据库(注意:数据库名称为postfix):

mail# mysql –u root –p
mysql# CREATE DATABASE `postfix` ;
mysql# use postfix;

下面为sql语句:

CREATE TABLE domaininfo (
domain_id int(5) NOT NULL auto_increment,
domain varchar(25) NOT NULL default '',
alias varchar(30) default NULL,
passwd varchar(35) NOT NULL default '',
usernum int(5) NOT NULL default '0',
quota int(11) NOT NULL default '0',
des varchar(30) default NULL,
expire date NOT NULL default '0000-00-00',
active tinyint(1) NOT NULL default '1',
create_time datetime default NULL,
PRIMARY KEY (domain_id),
UNIQUE KEY domain (domain),
KEY domain_id (domain_id)
) TYPE=MyISAM COMMENT='domain information';

INSERT INTO domaininfo VALUES (1,'admin',NULL,'$1$.j3.t12.$I7MGf7ZD2HrWwUWQF88Mg1',0,0,'Super Admin','0000-00-00',1,'0000-00-00 00:00:00');

CREATE TABLE userinfo (
id int(11) NOT NULL auto_increment,
userid varchar(20) NOT NULL default '',
domain_id int(5) NOT NULL default '0',
address varchar(50) NOT NULL default '',
alias varchar(60) default NULL,
passwd varchar(35) NOT NULL default '',
realname varchar(20) default NULL,
quota int(11) NOT NULL default '0',
active tinyint(1) NOT NULL default '0',
homedir varchar(60) NOT NULL default '',
maildir varchar(60) NOT NULL default '',
create_time datetime NOT NULL default '0000-00-00 00:00:00',
`fax` varchar(20) NOT NULL default '',
`telephone` varchar(15) NOT NULL default '',
`sex` int(1) NOT NULL default '0',
`year` int(4) NOT NULL default '0',
`MONTH` int(2) NOT NULL default '0',
`DAY` int(2) NOT NULL default '0',
`education` varchar(4) NOT NULL default '',
`marital` int(1) NOT NULL default '0',
`occupation` varchar(15) NOT NULL default '',
`companyname` varchar(30) NOT NULL default '',
`province` varchar(6) NOT NULL default '',
PRIMARY KEY (id),
UNIQUE KEY address (address)
) TYPE=InnoDB COMMENT='User Information';

注:对于初学者,建议以上操作都在phpmyadmin中操作更加的简便,如果后面要使用igenus请导入原来igenus的sql。

建立数据库用户并授以相应的权限

mail# mysql –u root –p
mysql# use mysql;
mysql# INSERT INTO user (host,user,password) VALUES('localhost','postfix','');
mysql# update user set password=password('postfix') where User='postfix';
mysql# GRANT ALL ON postfix.* TO postfix@localhost IDENTIFIED BY "postfix";
注:这里加用户名和密码都为:postfix。并授权对postfix数据库进行操作

1.8 安装Courier-imap

mail# cd /usr/ports/mail/courier-imap
mail# make install clean

我的选择:
[X] OPENSSL Build with OpenSSL support
[X] AUTH_MYSQL MySQL support

在/etc/rc.conf中加入:
courier_authdaemond_enable="YES"
courier_imap_pop3d_enable="YES"
courier_imap_imapd_enable="YES"

mail# cd /usr/local/etc/courier-imap
mail# cp imapd.cnf.dist imapd.cnf
mail# cp pop3d.cnf.dist pop3d.cnf
mail# /usr/local/etc/rc.d/courier-authdaemond.sh start

注:此时会在/var/run/authdaemond/下产生socket,如果没有下面这一步下面的认证无法通过。

mail# chmod +x /var/run/authdaemond

1.9 安装 postfix 和 cyrus-sasl

mail# cd /usr/ports/security/cyrus-sasl2
mail# make install WITH_AUTHDAEMON=yes
mail# make clean

创建/usr/local/lib/sasl2/smtpd.conf

pwcheck_method: authdaemond
log_level: 3
mech_list: PLAIN LOGIN
authdaemond_path:/var/run/authdaemond/socket

更详细的参数设置请看:
http://www.toping.net/bbs/htm_data/7/0508/330.html

至此,认证部分基本完成。

安装postfix
mail# cd /usr/ports/mail/postfix
mail# make install clean

我的选择:
[X] VDA VDA (Virtual Delivery Agent)
[X] MySQL MySQL map lookups (choose version with WITH_MYSQL_VER)
[X] TLS SSL and TLS
[X] SASL2 Cyrus SASLv2 (Simple Authentication and Security Layer)

回答下面的两问题:
You need user "postfix" added to group "mail".[是否将postfix用户加到mail用户组]
Would you like me to add it [y]? y
Would you like to activate Postfix in /etc/mail/mailer.conf [n]? n

在/etc/rc.conf中加入postfix启动所需的启动选项
在/etc/rc.conf中加入:

sendmail_enable="YES"
sendmail_flags="-bd"
sendmail_pidfile="/var/spool/postfix/pid/master.pid"
sendmail_procname="/usr/local/libexec/postfix/master"
sendmail_outbound_enable="NO"
sendmail_submit_enable="NO"
sendmail_msp_queue_enable="NO"

设置postfix启动所需
mail# ln -s /usr/local/sbin/sendmail /usr/sbin/sendmail

注:如果/usr/sbin/sendmail存在就删了再做上链接,如果升级内核和升级系统后要重新做这一步。

mail# echo ‘postfix: root’ >> /etc/aliases
mail# /usr/local/bin/newaliases
mail# chown postfix:postfix /etc/opiekeys

1.10 安装expect

用于Web客户端建立邮件用户
mail# cd /usr/ports/lang/expect
mail# make install clean

Chapter 2. 配置邮件服务器

本节主要讲述各种服务的参数配置。

2.1 配置rc.conf,编辑/etc/rc.conf

下面是前面所装软件都加入了启动选项的rc.conf配置:

mysql_enable="YES"
apache2_enable="YES"
courier_authdaemond_enable="YES"
courier_imap_pop3d_enable="YES"
courier_imap_imapd_enable="YES"
sendmail_enable="YES"
sendmail_flags="-bd"
sendmail_pidfile="/var/spool/postfix/pid/master.pid"
sendmail_procname="/usr/local/libexec/postfix/master"
sendmail_outbound_enable="NO"
sendmail_submit_enable="NO"
sendmail_msp_queue_enable="NO"

2.2 配置postfix 和 cyrus-sasl

(1)修改/usr/local/etc/postfix/main.cf,在文件最后加入以下内容

mail# ee /usr/local/etc/postfix/main.cf
smtpd_helo_required = yes
strict_rfc821_envelopes = yes
smtpd_etrn_restrictions = permit_mynetworks, reject
#=====================BASE=====================
myhostname = mail.toping.net
mydomain = toping.net
mydestination = $myhostname
local_recipient_maps =
command_directory = /usr/local/sbin
local_transport = virtual
#=====================MySQL=====================
virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:125
virtual_mailbox_base = /
virtual_mailbox_domains = mysql:/usr/local/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_limit = 51200000
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 125
virtual_transport = virtual
virtual_uid_maps = static:125
#=====================Quota=====================
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
virtual_overquota_bounce = yes
#====================SASL=====================
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_delay_reject=yes
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,permit_auth_destination,reject
smtpd_client_restrictions = permit_sasl_authenticated

更详细的参数设置请看论坛:
http://www.toping.net/bbs/htm_data/7/0601/871.html

(4)编辑/usr/local/etc/postfix/mysql_virtual_alias_maps.cf

mail# ee /usr/local/etc/postfix/mysql_virtual_alias_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT alias FROM userinfo WHERE address='%s' AND active = 1

(5)编辑/usr/local/etc/postfix/mysql_virtual_domains_maps.cf

mail# ee /usr/local/etc/postfix/mysql_virtual_domains_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT domain FROM domaininfo WHERE domain='%s'

(6)编辑/usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf

mail# ee /usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT maildir FROM userinfo WHERE address='%s' AND active = 1

(7)编辑/usr/local/etc/postfix/mysql_virtual_mailbox_limit_maps.cf

mail# ee /usr/local/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT quota FROM userinfo WHERE address='%s'

2.3 配置Courier-imap

(1)修改Courier相关设置,/usr/local/etc/courier-imap/imapd:

IMAP_CAPABILITY="IMAP4rev1 CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA"

(2)修改/usr/local/etc/courier-imap/pop3d

POP3AUTH="LOGIN CRAM-MD5 CRAM-SHA1"

(3)编辑修改/usr/local/etc/authlib/authmysqlrc

mail# mv /usr/local/etc/authlib/authmysqlrc /usr/local/etc/authlib/authmysqlrc_bak
mail# ee /usr/local/etc/authlib/authmysqlrc
MYSQL_SERVER localhost //数据库主机地址
MYSQL_USERNAME postfix //数据库用户名
MYSQL_PASSWORD postfix //数据库密码
MYSQL_PORT 0
MYSQL_OPT 0
MYSQL_DATABASE postfix //数据库名称
MYSQL_USER_TABLE userinfo
MYSQL_CRYPT_PWFIELD passwd
MYSQL_UID_FIELD '125'
MYSQL_GID_FIELD '125'
MYSQL_LOGIN_FIELD address
MYSQL_HOME_FIELD homedir
MYSQL_NAME_FIELD realname
MYSQL_MAILDIR_FIELD maildir
MYSQL_QUOTA_FIELD quota
注:这里得用tab键来跳格

(4)编辑/usr/local/etc/authlib/authdaemonrc

mail# mv /usr/local/etc/authlib/authdaemonrc /usr/local/etc/authlib/authdaemonrc_bak
mail# ee /usr/local/etc/authlib/authdaemonrc
authmodulelist="authmysql"
authmodulelistorig="authmysql"
version="authdaemond.mysql"
daemons=5
authdaemonvar=/var/run/authdaemond
subsystem=mail
DEBUG_LOGIN=0
DEFAULTOPTIONS="wbnodsn=1"

重启服务器

Chapter 3.手动设置第一个用户并测试

本章介绍如何开通用户,并且测试系统是否正常。

注:增加用户时请到这里生成加密后的密码后直接插入到数据库中就可以了。
http://www.toping.net/soft
mail# mysql
mysql> use postfix;
mysql> show tables;
+-------------------+
| Tables_in_postfix |
+-------------------+
| address |
| admin |
| card |
| domaininfo |
| lastauth |
| logs |
| message |
| personal |
| scheduler |
| stow |
| userinfo |
| vpopmail |
+-------------------+
12 rows in set (0.00 sec)

增加域名和管理员

mysql> desc domaininfo;
+-------------+-------------+------+-----+------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+------------+----------------+
| domain_id | int(5) | | PRI | NULL | auto_increment |
| domain | varchar(25) | | UNI | | |
| alias | varchar(30) | YES | | NULL | |
| passwd | varchar(35) | | | | |
| usernum | int(5) | | | 0 | |
| quota | int(11) | | | 0 | |
| des | varchar(30) | YES | | NULL | |
| expire | date | | | 0000-00-00 | |
| active | tinyint(1) | | | 1 | |
| create_time | datetime | YES | | NULL | |
+-------------+-------------+------+-----+------------+----------------+
10 rows in set (0.00 sec)

mysql> INSERT INTO `domaininfo` VALUES (7, 'toping.net', NULL, '$1$jNXThQXq$KPjm.WE2f2yX5rceY48vX. ', 50, 500, NULL, '0000-00-00', 1, '2005-04-19 23:19:11');
Query OK, 1 row affected (0.00 sec)

注:这里的toping.net的管理密码为:admin123

mysql> desc userinfo;
+-------------+-------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------------------+----------------+
| id | int(11) | | PRI | NULL | auto_increment |
| userid | varchar(20) | | | | |
| domain_id | int(5) | | | 0 | |
| address | varchar(50) | | UNI | | |
| alias | varchar(60) | YES | | NULL | |
| passwd | varchar(35) | | | | |
| realname | varchar(20) | YES | | NULL | |
| quota | int(11) | | | 0 | |
| active | tinyint(1) | | | 0 | |
| homedir | varchar(60) | | | | |
| maildir | varchar(60) | | | | |
| create_time | datetime | | | 0000-00-00 00:00:00 | |
| fax | varchar(20) | | | | |
| telephone | varchar(15) | | | | |
| sex | int(1) | | | 0 | |
| year | int(4) | | | 0 | |
| MONTH | int(2) | | | 0 | |
| DAY | int(2) | | | 0 | |
| education | varchar(4) | | | | |
| marital | int(1) | | | 0 | |
| occupation | varchar(15) | | | | |
| companyname | varchar(30) | | | | |
| province | varchar(6) | | | | |
+-------------+-------------+------+-----+---------------------+----------------+
23 rows in set (0.00 sec)

mysql> INSERT INTO `userinfo` VALUES (8, 'webmaster', 7, 'webmaster@toping.net', NULL,'$1$4DLQeNkz$QKCAQqg244XwvLl2SD11f0', 'webmaster', 209715200, 1, '/var/mail/toping.net/webmaster/', '/var/mail/toping.net/webmaster/Maildir/', '2005-04-20 23:45:17', '', '', 0, 0, 0, 0, '', 0, '', '', '');

注:这里的webmaster用户的邮箱密码为:000000

mysql>quit

设置用户的目录与权限:
Mail# mkdir -p /var/mail/toping.net/webmaster
Mail# /usr/local/bin/maildirmake /var/mail/toping.net/webmaster/Maildir
Mail# chmod -R 777 /var/mail/toping.net/
Mail# chown -R postfix:postfix /var/mail/toping.net

至此用户设置完毕,这里只使用一个域名,同理可以设置多个域名。

Chapter 4.安装postfix管理工具

本节主要介绍如何安装和使用本人开发的postfix管理工具。

4.1安装本人开发的postfix管理工具来设置第一个域名和用户

上传管理工具到网站目录
后修改include/config.inc.php中的
define(DOMAINSDIR,"/home/vmail");  为  define(DOMAINSDIR,"/var/mail");
define(MYSQL_HOST, 'localhost'); 为  您的MySQL服务器的主机名
define(MYSQL_USER, 'root');     为  您的MySQL的用户名
define(MYSQL_PASS, 'mypasswd');   为  您的MySQL的密码
define(MYSQL_DATA, 'postfix');    为  您的邮件服务器的数据库

修改完成后运行:http://mail.toping.net/webadmin/index.php

完装完成!!

4.2 用户登录测试

用户登录测试

安装p5-MIME-Base64
mail# cd /usr/ports/converters/p5-MIME-Base64/
mail# make install clean

通过p5-MIME-Base64来取得用户名和密码的base64编码
mail# perl -MMIME::Base64 -e 'print encode_base64("webmaster\@toping.net");'
d2VibWFzdGVyQHRvcGluZy5uZXQ=
mail# perl -MMIME::Base64 -e 'print encode_base64("000000");'
MDAwMDAw

测试发送邮件(端口:25):

mail# telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 0.
Escape character is '^]'.
220 mail.toping.net ESMTP Postfix
ehlo mail
250-mail.toping.net
250-PIPELINING
250-SIZE 4194304
250-VRFY
250-ETRN
250-AUTH NTLM LOGIN PLAIN OTP
250-AUTH=NTLM LOGIN PLAIN OTP
250 8BITMIME
auth login
334 VXNlcm5hbWU6
d2VibWFzdGVyQHRvcGluZy5uZXQ= //此为用户名id:webmaster@toping.net
334 UGFzc3dvcmQ6
MDAwMDAw //此为用户密码password:000000
235 Authentication successful
MAIL FROM: //告诉服务器发件人的Email地址
250 Ok
RCPT TO: //告诉服务器收件人的地址
250 OK
DATA //告诉服务器开始写信
354 End data with .
SUBJECT:test //subject后面填写的是邮件的主题
test
. //换行后输入.后按回车,表示信件内容书写完毕
250 Ok: queued as 58DC71D5
quit //发送信件,结束对话,退出SMTP服务器
221 Bye
Connection closed by foreign host

测试收取邮件(端口:110):

mail# telnet 127.0.0.1 110
Trying 127.0.0.1...
Connected to 0
Escape character is '^]'
+OK Hello there
user webmaster@toping.net
+OK Password required
pass 000000
+OK logged in
list
+OK POP3 clients that break here, they violate STD53
1 2217
retr 1 //返回第一封信的全部内容
+OK 2217 octets follow.
Return-Path:
X-Original-To: webmaster@toping.net
Delivered-To: webmaster@toping.net
Received: from mail (localhost.toping.net [127.0.0.1])
by mail.toping.net (Postfix) with ESMTP id 58DC71D5
for ; Mon, 9 Aug 2004 21:11:20 +0800 (CST)
SUBJECT:test
Message-Id: <20040809131120.58DC71D5@mail.toping.net>
Date: Mon, 9 Aug 2004 21:11:20 +0800 (CST)
From: webmaster@toping.net
To: undisclosed-recipients:;
test
.
dele 1 //删除
+OK Deleted
quit
+OK Bye-bye
Connection closed by foreign host

也可以使用任何其它的邮件客户端程序来测试,如foxmail、Outlook Express等等。

Chapter 5. 防病毒与防垃圾邮件

本章介绍病毒与垃圾邮件的防范。

5.1 安装Clamav
mail# cd /usr/ports/security/clamav
mail# make install clean

我的选择:
[X] MILTER Compile the milter interface
[X] CURL Support URL downloading
[X] LIBUNRAR Support for external Unrar library

要想clamav能自动的启动请在/etc/rc.conf中加入:
clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"

重启服务器

测试杀毒
mail# clamscan -r -i /usr/local/www/data

----------- SCAN SUMMARY -----------
Known viruses: 41293
Engine version: 0.87.1
Scanned directories: 53
Scanned files: 602
Infected files: 0
Data scanned: 41.51 MB
Time: 18.294 sec (0 m 18 s)

升级病毒库
mail# freshclam
ClamAV update process started at Sun Dec 4 01:10:02 2005
main.cvd is up to date (version: 34, sigs: 39625, f-level: 5, builder: tkojm)
daily.cvd is up to date (version: 1200, sigs: 1669, f-level: 6, builder: tomek)

5.2 安装MailScanner
mail# cd /usr/ports/mail/mailscanner
mail# make install

第一次执行安装因此需执行make initial-config以建立基本配置文件

mail# make initial-config
mail# make clean

5.3 安装SpamAssassin
mail# cd /usr/ports/mail/p5-Mail-SpamAssassin
mail# make install clean

我的选择:
[X] AS_ROOT Run spamd as root (recommended)
[X] DOMAINKEYS DomainKeys support
[X] SSL Build with SSL support for spamd/spamc
[X] MYSQL Add MySQL support
[X] RAZOR Add Vipul's Razor support
[X] SPF_QUERY Add SPF query support
[X] RELAY_COUNTRY Relay country support
[X] TOOLS Install SpamAssassin tools

5.4修改Postfix设定档main.cf
mail# ee /usr/local/etc/postfix/main.cf
#header_checks = regexp:/usr/local/etc/postfix/header_checks //默认值
header_checks = regexp:/usr/local/etc/postfix/header_checks //把注释去掉

编辑/usr/local/etc/postfix/header_checks
mail# ee /usr/local/etc/postfix/header_checks
/^Received:/ HOLD //新加入

5.5修改mailscanner.conf
mail# ee /usr/local/etc/MailScanner/MailScanner.conf
#Run As User = //默认值
Run As User = postfix //修改后
#Run As Group = //默认值
Run As Group = postfix //修改后
#Incoming Queue Dir = /var/spool/mqueue.in //默认值
Incoming Queue Dir = /var/spool/postfix/hold //修改后
#Outgoing Queue Dir = /var/spool/mqueue //默认值
Outgoing Queue Dir = /var/spool/postfix/incoming //修改后
#MTA = sendmail //默认值
MTA = postfix //修改后
#Virus Scanners = none //默认值
Virus Scanners = clamav //修改后
#Use SpamAssassin = no //默认值
Use SpamAssassin = yes //修改后

5.6新增MailScanner所要用到的资料夹
mail# mkdir /var/spool/MailScanner
mail# mkdir /var/spool/MailScanner/incoming
mail# mkdir /var/spool/MailScanner/quarantine
mail# chown postfix:postfix /var/spool/MailScanner/incoming
mail# chown postfix:postfix /var/spool/MailScanner/quarantine
mail# touch /usr/local/etc/MailScanner/rules/bounce.rules //新建一个空白文件,要不然会出错。
mail# chmod –R 777 /var/spool/postfix
mail#cp /usr/local/etc/MailScanner/mcp/10_example.cf.sample /usr/local/etc/MailScanner/mcp/10_example.cf
mail#cp /usr/local/etc/MailScanner/mcp/mcp.spam.assassin.prefs.conf.sample
/usr/local/etc/MailScanner/mcp/mcp.spam.assassin.prefs.conf
注:这里的倒数一、二行实际操作中为一行

重新启动服务器

测试病毒过滤:

mail# telnet localhost 25
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.toping.net ESMTP Postfix
mail from:webmaster@toping.net
250 Ok
rcpt to:webmaster@toping.net
250 Ok
data
354 End data with .
Subject:Virus test

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

.
250 Ok: queued as F0C221CC20 //出现F0C221CC20这行表示mailscanner运行成功了
quit
221 Bye
Connection closed by foreign host.

5.7把病毒提示信息改为中文

预设系统提示信息为英文,可以下载我修改的中文包。

http://mail.toping.net/mailscanner/cn.rar

注:把下载下来的文件解压后放到/usr/local/share/MailScanner/reports/cn下面去

mail# ee /usr/local/etc/MailScanner/MailScanner.conf
#%report-dir% = /usr/local/share/MailScanner/reports/en //默认值(加载英文)
%report-dir% = /usr/local/share/MailScanner/reports/cn //修改后为读取中文

5.8.用MailScanner来监管进出邮件
mail# ee MailScanner.conf
Archive Mail = %rules-dir%/archive.rules
mail# ee archive.rules

方法一:互相备份, 以上这样并不会造成 loop
FromOrTo: a@toping.net yes forward b@toping.net
FromOrTo: b@toping.net yes forward a@toping.net

方法二:可以 forward 到复数信箱
FromOrTo: a@toping.net yes forward b@toping.net c@toping.net d@toping.net

方法三:同时备份到一个或多个档案及一个或多个信箱
FromOrTo: a@toping.net yes forward /var/spool/MailScanner/archive/a_user_backup.mbx /var/spool/MailScanner/archive/a_user_backup.mbx b@toping.net scyz2@163.com
注:以上为一行,该档案要先建立且确定该档案拥有者与 MailScanner.conf 的 Run As User = XXXXXXX 相同

方法四:备份到数据夹及多个信箱或档案
FromOrTo: a@toping.net yes forward /var/spool/MailScanner/archive/ b@toping.net scyz2@163.com /var/spool/MailScanner/archive/a_user_backup.mbx
注:以上为一行,权限同SAMPLE3;注意事项, 他会依日期再分数据夹, 日期数据夹内的文件名称 mail queue ID, 格式为 postfix mail queue 格式

更详细的mailscanner.cf的参数请看论坛:

http://www.toping.net/bbs/htm_data/7/0509/533.html

5.9.安装MailScanner-mrtg
mail# cd /usr/ports/mail/ mailscanner-mrtg
mail# make install clean

mailscanner-mrtg相关设置
mail# cd /usr/local/etc/mailscanner-mrtg //切换至mailscanner-mrtg 目录
mail# cp mailscanner-mrtg.conf.sample mailscanner-mrtg.conf
mail# cp mailscanner-mrtg.cfg.sample mailscanner-mrtg.cfg
mail# chmod 644 mailscanner-mrtg.conf //更改权限为可修改
mail# chmod 644 mailscanner-mrtg.cfg //更改权限为可修改
mail# ee mailscanner-mrtg.conf //修改mailscanner-mrtg.conf内容如下
#MTA = sendmail //默认值
MTA = postfix //修改后
#Where the MTA puts mail before MailScanner gets it
#Incoming Queue Dir = /var/spool/postfix.in/deferred/ # Postfix
#Incoming Queue Dir = /var/spool/exim.in/input/ # Exim
Incoming Queue Dir = /var/spool/mqueue.in/ # Sendmail //默认值
Incoming Queue Dir = /var/spool/postfix/hold # Postfix //修改后
#Where MailScanner puts your mail after it is scanned
#Outgoing Queue Dir = /var/spool/postfix/incoming/ # Postfix
#Outgoing Queue Dir = /var/spool/exim/input # Exim (?)
Outgoing Queue Dir = /var/spool/mqueue/ # Sendmail //默认值
Outgoing Queue Dir = /var/spool/postfix/incoming/ # Postfix //修改后(把#拿掉)
#Which interfaces to monitor (comma separated list)
Interfaces to Monitor = fxp0 //默认值
Interfaces to Monitor = vr0 //修改后(改成您的网卡吧)

mail# ee /usr/local/etc/apache/httpd.conf //修改apache配置以便读取mailscanner-mrtg数据
内容如下:

#MailScanner Setting
Alias /mailscanner-mrtg/ "/usr/local/www/mailscanner-mrtg/"

Step5.产生MailScanner-Mrtg流量图
mail# /usr/local/bin/mrtg /usr/local/etc/mailscanner-mrtg/mailscanner-mrtg.cfg
mail# crontab -e
*/10 * * * * /usr/local/bin/mrtg /usr/local/etc/mailscanner-mrtg/mailscanner-mrtg.cfg

5.10.安装APF防垃圾邮件
http://apf.org.cn
下载地址:
http://mail.toping.net/apf/apf.rar

下载最新的APF包解压到/usr/local/etc/postfix目录。

这时/usr/local/etc/postfix目录里边有一个apf-posftix.pl的文件
修改/usr/local/etc/postfix/master.cf
mail# ee /usr/local/etc/postfix/master.cf
加入:
apf unix - n n - - spawn
user=nobody argv=/usr/bin/perl /usr/local/etc/postfix/apf-postfix.pl

增加黑白名单:

1、IP黑名单:
ip_black_list.txt

2、IP白名单
ip_white_list.txt

3、域名黑名单
dn_black_list.txt

4、域名白名单
dn_white_list.txt

Chapter 6. 安装webmail

如何使用本人修改的iGENUS for Postfix 2.01

下载地址:
http://mail.toping.net/igenus/igenus_for_postfix_2.01.rar

webmail使用igenus,版本是iGENUS for Postfix 2.01

建议下载本人修改的iGENUS for Postfix 2.01

安装方法参考论坛:

http://www.toping.net/bbs/htm_data/7/0507/174.html

mail# cd /usr/local/www/data
mail# chown -R postfix:postfix phpMyAdmin
mail# cd /usr/local/etc
mail# cp php.ini-dist php.ini
修改/usr/local/etc/php.ini

webmail上传附件设置:
register_globals = On
max_execution_time = 30 //改为60 (增加处理脚本的时间限制)
memory_limit = 8M //改为40M (这样才能发10M的附件)
post_max_size = 8M //改为10M
upload_max_filesize = 2M //改为10M

重启apache

mail# /usr/local/etc/rc.d/apache2.sh restart

Chapter 7. 安装邮件列表(MAILMAN)安装

本节主要讲述邮件列表mailman的安装和配置

设置/etc/make.conf
mail# ee /etc/make.conf
# mail/mailman
MAIL_GID="mailman"

安装mailman
mail# portinstall -m BATCH=yes mail/mailman

配置apache(新加入)
mail# ee /usr/local/etc/apache2/httpd.conf
ScriptAlias /mailman "/usr/local/mailman/cgi-bin"


AllowOverride None
Options none
Order allow,deny
Allow from all

Alias /pipermail "/usr/local/mailman/archives/public"


AllowOverride None
Options +FollowSymlinks
Order allow,deny
Allow from all

用check_perms
mail# /usr/local/mailman/bin/check_perms -f
注:加上-f参数可以修复。

修改/usr/local/mailman/Mailman/mm_cfg.py,加上:
DEFAULT_EMAIL_HOST = 'lists.toping.net'
MTA = 'Postfix'
POSTFIX_STYLE_VIRTUAL_DOMAINS = ['lists.toping.net', 'toping.net']

添加一个邮件列表:
mail# /usr/local/mailman/bin/newlist mailman

把用户添加到邮件列表里测试,建一个文本文件,比如maillists.txt,一行一个邮件地址,然后执行如下命令:
mail# /usr/local/mailman/bin/add_members -n maillists.txt mailman
mail# ee postfix/main.cf
owner_request_special = no
recipient_delimiter = +

virtual_alias_maps = hash:/usr/local/mailman/data/virtual-mailman,
mysql:/usr/local/etc/postfix/mysql/mysql_virtual_alias_maps.cf
alias_maps = hash:/usr/local/mailman/data/aliases,hash:/usr/local/etc/postfix/aliases

mail# ee Default.py
DEFAULT_EMAIL_HOST = 'lists.toping.net'
DEFAULT_URL_HOST = 'lists.toping.net'
DEFAULT_URL_PATTERN = 'http://%s/mailman/'

DEFAULT_SERVER_LANGUAGE = 'zh_CN'

设置virtual-mailman
mail# ee /usr/local/mailman/data/virtual-mailman
lists.meilai.com anything

邮件列表的配置

Default.py和mm_cfg.py的配置是针对全局的,对全局配置文件的修改不会影响到已经存在的邮件列表。mailman提供了config_list这个命令来对单个邮件列表进行配置,先导出该邮件列表的配置:

mail# /usr/local/mailman/bin/config_list -o /tmp/config mailman

然后修改/tmp/config文件,里面有很多选项,可以根据自己的要求修改,比如加上回复到邮件列表的邮件头、去掉mailman自动加的边脚等等,最后把这个配置文件导回给邮件列表就可以了:

mail# /usr/local/mailman/bin/config_list -i /tmp/config mailman

下面你可以通过web去管理你的邮件列表:
http://lists.toping.net/mailman/admin/mailman
查看邮件列表信息:
http://lists.toping.net/mailman/listinfo/mailman/
功能太强大了,这里不一一的讲解,自己去发现吧


Chapter 7. 查看系统状态

本节主要讲述phpSysInfo工具的安装和配置
安装phpSysInfo(2.2)
mail# cd /usr/ports/www/phpSysInfo
mail# make install clean
mail# cd /usr/local/www/data-dist/phpSysInfo
mail# cp config.php.new config.php
$ su - root
Password:
# sysinstall
选择Configure>Distributions,选择man项,点击OK。
点击在新窗口中浏览此图片          以前从家到过金马饭店,现在回家是它的3倍路程:
#include <list>
#include <iostream>

using namespace std;

int main(int argc, char * argv[])
{
    list<int> lst;

    for (int i = 0; i < 10; ++i)
        lst.push_back(i);  //将i推入list<int>

    list<int>::iterator it = lst.end();
    ++it;
    cout << *it << endl;
    ++it;
    cout << *it << endl; //移动指针

    return 0;
}


$ ./test
0
1

         list<string>   m_member;

  for (i=m_mllist.begin(); i!=m_mllist.end(); ++i)
  {
    outFile << *i << endl;
    fprintf(stderr,"Line=%d,File=%s",__LINE__,__FILE__);
    list<string>::const_iterator itr=i->m_member.begin();
    fprintf(stderr,"%s",itr->c_str());


  }

杭州市近年相继获得了联合国人居奖、国家环境保护模范城市、全国绿化模范城市、全国社会治安群众满意率最高城市、中国最佳商业城市三连冠等众多荣誉称号。
  特别值得注意的是,杭州市统计局对3000户杭州居民家庭的抽样调查显示,17.6%的杭州人感到幸福,比较幸福的占32.0%,幸福程度一般的占47%,感觉到不幸福和感觉不是很幸福的人只占了3.4%。
  “杭州现象”赢得无数关注的目光。这些目光同时也在探究:原因何在?
  
  发展与美丽联姻
  
  “我是在1986年第一次到杭州的,印象最深的是杭州非常美丽,但经济还未腾飞;时隔20年再次来到杭州,我惊讶于她的变化,她已是中国经济最为发达的城市之一,而她依然平静而美丽。”在中国投资环境论坛上,世界银行中国和蒙古局局长杜大伟如此感叹。“最主要的是,杭州在发展经济的同时,仍然保持了一个美丽城市应有的品质;作为一个典范,杭州一方面实现了经济的快速发展,同时又很好保护了环境,提高了生活质量。”
  从美丽天堂到投资天堂,这一进程概括了杭州20年的巨大变化,而世行官员杜大伟的个人感受正是其中的缩影。从世行4年的跟踪调查结果看,杭州是一座在和谐中创造财富的城市,各种要素的均衡发展形成了强大的吸引力。
  
  和谐创造财富
  
  杭州经济社会发展非常迅速,“经济强市、文化名城、旅游胜地、天堂硅谷”的四张“金名片”日益锃亮。杭州市还从自身特色出发,围绕打造“天堂硅谷”,加快高新技术产业发展,拉长了通讯、软件、集成电路、数字电视、动漫、网络游戏等六条产业链,形成一大批优秀高新企业,以此引领“和谐创业”,提高人民群众的经济生活品质。
  杭州的市民,讲诚信、守秩序,对外来务工者和外来投资者普遍比较友善。他们还很注意个人之间、家庭之间、部门和行业之间的平衡和协调。这些都极大地增强了投资创业者的安全感、归宿感和幸福感。
  
  有容,乃悦
  
  2006年农民工网站新农门网对十多个城市5000名外来民工所作的问卷调查显示,杭州是最能留住农民工的城市之一。
  杭州市副市长杨戌标说,农民工对一座城市的满意度,意味着这座城市的和谐程度,这其中杭州民工学校的“进城教育”功不可没。5年来,杭州市700多个建筑工地开办了免费民工学校,十万多名外来务工者在这里开始融入杭州,向新市民转变。民工学校解决的不仅仅是外来务工人员的职业教育问题,更重要的是找到了城市与城市建设者之间的对话平台,让民工真实感觉到城市给予的关爱,彼此接纳,和谐相处。
  杨戌标说,像要求一个合格市民那样要求外来民工之前,首先应该给予他们市民应享受的权利。在我们抱怨、指责外来民工给城市管理带来这样那样的问题之前,从市民到城市的管理者都应该想一想,我们有没有尽到教育、引导的责任?
  
  老吾老 幼吾幼
  
  2006年,杭州市政府正式通过《杭州市城镇老年居民大病住院基本医疗保险试行办法》和《杭州市少年儿童大病住院基本医疗保险试行办法》,两个办法将分别于2007年4月1日和9月1日施行。杭州的城镇居民,从此将人人享有基本医疗保障。
  两个新政策的共同点在于,老人、孩子参保的范围,仅包含了住院和规定病种门诊的费用,试行办法先满足“大病住院”基本需求有医疗保障,避免一个家庭因病致贫。缴费方式上,以个人、家庭缴费为主,财政适当补助。儿童医保,在杭打工者子女,也可参保。
  
  真正的公平是机会平等
  
  
  目前,杭州市已有191所中小学实施“名校集团化”战略,成立了51个教育集团,城区的义务教育阶段优质学校比例达到80%,优质高中招生比例达到86.1%。
  浙江省委常委、杭州市委书记王国平说:“优质教育公平是社会公平的基础,是和谐社会的基石。我们不是搞精英教育、贵族教育,而是要坚持平民化、普及化。目前优质教育收费过高,其根本原因是优质教育供不应求。我们要通过‘名校集团化’战略,以最低的成本增加优质教育的供给,从根本上解决教育乱收费,让困难群体也能‘上好学’。”
  杭州市实施“名校集团化”战略,有四点共识:教育公平是社会公平的基础,而优质教育公平,是解决像杭州这样的发达地区所有教育问题的关键;“名校集团化”是实现杭州教育均衡化的必由之路;教育办得好不好,应该由学生和家长说了算,应该由社会和市场说了算;教育质量上去,教育费用下来,是市委、市政府的目标和承诺,坚持把教育的社会效益放在第一位,让更多的孩子接受更好的教育,不让他们输在人生的起跑线上,是市委、市政府的责任。
  
  人与自然
  
  好房子的标准很多,小区环境、配套设施、房屋结构等都是非常重要的因素,但归根结底只有一条,就是生活舒适度——给人一种安静、愉悦的感受。“杭州的人居和居住环境,在全国都是处于比较高的水平。”作为第二届杭州市“最佳人居环境奖”和“最佳人居奖”专家评审团的主任委员,中国工程院院士、建筑大师程泰宁认为,杭州有着得天独厚的自然条件和人文底蕴,这是很好的基础。近年来政府和开发商在打造居住品质上也下了很大工夫,许多开发商都想把品质做得好一点,形成了良性竞争的氛围。有些小区把原来的山水树木都原汁原味地保留了下来,体现了自然味道,这样的环境在北京、上海等地方都是很难看到的。
  
  荣登“中国幸福城市”榜首
  
  “中国幸福城市”排行由《求是》杂志社旗下的《小康》杂志联合新浪网、央视国际、中国网等网络媒体对中国70个城市的“幸福度”进行调查。调查结果显示,杭州名列榜首。
  《小康》杂志的总结报道中形容杭州拥有“‘天堂’般的幸福”:“在这样一个风景如画的城市居住的人也都有一种心满意足的幸福感,这种幸福感也直接反映在了数次的调查中。据了解,杭州是在各项幸福指标中获得冠军最多的城市。让很多杭州人自豪的是:在杭州,富人和穷人之间的幸福指数差距并不很大,因为健康、亲情、休闲、环境等都是快乐的源泉。”
  “幸福在哪里呀,幸福在哪里,幸福在那小朋友的眼睛里,那里有红花呀,那里有绿草,还有那会唱歌的小黄鹂……”
cvs co src/entplatform-entadmin
cvs co ports/entplatform-entadmin
CVSROOT=:ext:xiangdong2@cvs.internal.sina.com.cn:/cvsroot/mailrept
环境变量:export 或者:setenv
set CVSROOT=:ext:xiangdong2@cvs.internal.sina.com.cn:/cvsroot/mailrept  //FreeBSD

当年的包搬家时候给丢了,记录一下,呵呵!
#include <string>
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
ifstream fin("MyData.txt");
string str; while(getline(fin,str))
{
//一行一行地读,直到失败为止  
cout<<str<<endl; //显示出来  
}
return 0;
}



#include   <iostream>
#include   <string>
#include   <fstream>
using   namespace   std;

int   main()
{
    ofstream   outfile;
    ifstream   infile;
    char   value;
    outfile.open("a.txt");

    outfile   <<   "abcd";
    outfile.close();
    infile.open("a.txt");
    if   (infile.is_open())
    {
        while(infile.get(value))
            cout<<value;
    }
    cout   <<   endl;
    infile.close();
    return   0;  
}


#include "iostream"
#include "str.h"
#include <fstream>
#include <sstream> //用来连接字符串的
using namespace std;

int main()
{

/*      
        char *pVar = NULL;
        cout << strinfo ;
        cin >> strinfo;
        if( strinfo == "winter" )
        cout << "you are winter!"<<endl;
        strinfo += " , Welcome to China!";
        cout << strinfo ;
        string strtmp = "How are you? " + strinfo;
        for(int i = 0 ; i < strtmp.size(); i ++)
        cout<<strtmp<<strtmp.size();    

*/    
        ifstream fin("MyData.txt");
        string str;
        ostringstream osTmp;
        while(getline(fin,str))
        {  
    
        osTmp<<"select enterpriseid from domain where enterpriseid="<<str;
        cout<<str<<endl; //显示出来  
        }  
        cout <<osTmp.str();

}
ostringstream osTmp
osTmp<<"select enterpriseid from domain where enterpriseid="<<enterpriseID<<" and name like'%"<<_defaultConf.defaultDomain<<"' limit 1";
  
sysinstall
选择网卡项目:
然后:
/etc/netstart

sh /etc/rc

/etc/rc.d/netif restart
FreeBSD6.2的SSH服务配置

1.配置SSH服务自动启动
查看文件/etc/rc.conf中有没有sshd_enable="YES" ,如果没有,将它附加到文件末尾
并使用如下命令启动SSH服务:
/etc/rc.d/sshd start

2. 配置SSH服务配置文件
#cd /etc/ssh
#ee sshd_config
将以下语句前的#去掉
Port 22                        //端口号为22
Protocol 2                      //使用SSH2.x协议
AddressFamily any                
ListenAddress 0.0.0.0           //在本地所有IPv4地址上监听

如果要允许root用户使用SSH登录,则将
#PermitRootLogin no 更改为 PermitRootLogin yes

如果要允许其它用户登录,可在文件末尾添加以下条目
AllowUsers huzhenwei@192.168.10.100               //允许huzhenwei从192.168.10.100登录
AllowUsers oaadmin sqlsa                           //允许oaadmin、sqlsa从任意IP地址
                                                  //登录,多个用户可写在同一行

配置完成后,使用如下命令重启SSH服务:
#/etc/rc.d/sshd reload

大家用linux的时候难免会要上传和下载资料, 这时候就要借助于ftp了.下面把ftp的使用总结如下:

1.配置ftp. ftp配置文件一般放在/etc/vsftpd 或者 /etc目录下. 大家如果想用root用户来登陆,可以这样做.打开ftpusers和user_list, 再root和nobody前面加上#.在实际情况不提倡这样,否则太危险了.

2启动ftp. /sbin/service vsftpd start

这时候你就可以用root用户ftp到linux上了.很简单.
#include<stdio.h>
#include<vector>
#include <iostream>

using namespace std;

void main()

{

  int i = 0;

   vector<int> v;

   for( i = 0; i < 10; i++ )

  {

            v.push_back( i );//把元素一个一个存入到vector中

  }

  for( i = 0; i < v.size(); i++ )//v.size() 表示vector存入元素的个数

  {

         cout << v[ i ] << "  "; //把每个元素显示出来

  }

  cont << endl;

}

注:你也可以用v.begin()和v.end() 来得到vector开始的和结束的元素地址的指针位置。你也可以这样做:

vector<int>::iterator iter;

for( iter = v.begin(); iter != v.end(); iter++ )

{
   cout << *iter << endl;
}

2. 对于二维vector的定义。

1)定义一个10个vector元素,并对每个vector符值1-10。

#include<stdio.h>
#include<vector>
#include <iostream>

using namespace std;

void main()
{
int i = 0, j = 0;

//定义一个二维的动态数组,有10行,每一行是一个用一个vector存储这一行的数据。

所以每一行的长度是可以变化的。之所以用到vector<int>(0)是对vector初始化,否则不能对vector存入元素。
vector< vector<int> > Array( 10, vector<int>(0) );

for( j = 0; j < 10; j++ )
{
 for ( i = 0; i < 9; i++ )
 {
  Array[ j ].push_back( i );
 }
}

for( j = 0; j < 10; j++ )
{
 for( i = 0; i < Array[ j ].size(); i++ )
 {
  cout << Array[ j ][ i ] << "  ";
 }
 cout<< endl;
}
}

2)定义一个行列都是变化的数组。

#include<stdio.h>
#include<vector>
#include <iostream>

using namespace std;

void main()
{
int i = 0, j = 0;

vector< vector<int> > Array;
vector< int > line;
for( j = 0; j < 10; j++ )
{
 Array.push_back( line );//要对每一个vector初始化,否则不能存入元素。
 for ( i = 0; i < 9; i++ )
 {
  Array[ j ].push_back( i );
 }
}

for( j = 0; j < 10; j++ )
{
 for( i = 0; i < Array[ j ].size(); i++ )
 {
  cout << Array[ j ][ i ] << "  ";
 }
 cout<< endl;
}
}

上面就是我对vector使用的总结,更深入的使用,大家查查vector的手册吧。欢迎批评指正。

用std::vector的const_iterator对元素赋值会怎样?
c++ builder 6中就是改变不了元素的值,不会编译不过,执行也不报错。这玩意儿把我害惨了,害我找了好长时间。
有空测试下vc7.1,vc8和c++ builder 2007,gcc

写了个测试程序vc7.1下居然能改变值:
参考如下代码,就知道为何要这个vector了:
#include <vector>

struct stUpdateItem
{
   bool _downloadSucceeded;

   stUpdateItem() : _downloadSucceeded(false)
   {}
};

struct stDownItem
{
   stUpdateItem* _pItem;
   bool          _bPack;

   stDownItem(stUpdateItem* item, bool bPack) : _pItem(item),_bPack(bPack)
   {}
};

typedef std::vector<stDownItem> tDownItems;

int _tmain(int argc, _TCHAR* argv[])
{
   tDownItems downList;

   stUpdateItem item1;
   stUpdateItem item2;

   stDownItem downItem1(&item1,true);
   stDownItem downItem2(&item2,false);

   downList.push_back(downItem1);
   downList.push_back(downItem2);

   for (tDownItems::const_iterator it = downList.begin(); it != downList.end(); ++it)
   {
       if(true == it->_pItem->_downloadSucceeded)
       {
           std::cout << "before change, found!" << std::endl;
       }
   }

   for (tDownItems::const_iterator it = downList.begin(); it != downList.end(); ++it)
   {
       it->_pItem->_downloadSucceeded = true;
   }

   for (tDownItems::const_iterator it = downList.begin(); it != downList.end(); ++it)
   {
       if(true == it->_pItem->_downloadSucceeded)
       {
           std::cout << "after change, found!" << std::endl;
       }
   }
   return 0;
}

参考:http://stl.winterxy.com/html/item_26.html
电视剧《甘十九妹》的主题曲,一首凄美的旋律映衬出了那令人断肠的结局。
-
如果来生还是今世的重复,纵然多情要比无情苦。
如果来生还是今世的重复,你是否还是这样不在乎?……
-
在很多时候,现实往往是令人痛苦和无助的。甘十九妹——萧逸笔下一个美丽、坚强、自信、能干、聪明、勇敢、对爱坚贞的一个女子,与他深爱着的男人尹剑平成为了上一代人仇恨的牺牲品,成为了不可逃避的宿敌。
-
与一般女子不同的是,甘十九妹她不仅风华绝代、武功高强、机敏聪明,更有着对爱情的忠贞和敢爱敢恨的性格。她向“尹心”投怀送抱,二人间有限的接触也总是她在主动,一旦确定心意后更是坚贞不移,甚至到“依剑平”将她杀死那一刻,才知道尹剑平一直在“欺骗”她——爱人“尹心”、敌人“依剑平”竟是同一个人。尽管如此,她仍对自己的师姐说她深爱此人,希望师姐不要为她报仇。
-
尹剑平望着垂死的甘十九妹,那是一个他深爱而又不敢爱的人,在得知父仇已报后,做出了他应该也必须做出的唯一决定——剖腹自杀。“这样我可以跟你一起去了!”
-
随着那一声断肠的“尹哥哥……”,“两个血人缓缓地接近着,终于紧紧地拥抱一团。当他们那样紧紧抱在一起时,这个天底下不再有也没有什么力量,能够把他们分开了。 ”
……   ……   ……
-
听这首老歌、感动了我十年的老歌。每句话,每个字,都让我泪流满面……
每次想起那对相拥死去的恋人,先是心痛,然后便觉得他们才是真的幸福。而这世上,还有没有人,能在某个时候,和我相拥着离开这个世界?
烟花美丽,是因为太绚烂,还是因为那霎那的光彩;
流星迷人,是因为太耀亮,还是因为那短暂的永恒?
如果来生还是今世的重复,你是否还是这样不在乎?
-
“不知道如何开始
难预料怎样结束
都说是多情要比无情苦
你为何还要脉脉含情
是不是你太疏忽
是不是你很糊涂
爱到尽头也回不到当初
你为何还要如此执固
如果来生还是今世的重复
纵然多情要比无情苦
如果来生还是今世的重复
你是否还是这样不在乎
如果来生还是今世的重复
纵然多情要比无情苦
如果来生还是今世的重复
你是否还是这样不在乎 !……”


  1她是你最后一个女人
  2.从背后抱着她睡觉,把她像孩子一样揽在怀里
  3.即使自己盖不到被子  也不要在她熟睡的时候惊醒她
  4.吃她喂给你吃的东西  并且也觉得好吃
  5.不打听她不想你知道的任何事情
  6.相信她的每一句话  如果实在离谱找个机会平静下来好好沟通
  7.努力适合她的生活方式  营造你们的生活圈子
  8.友好的对待她的朋友  并且也把他们当成是你的朋友
  9.在她的朋友前给足她面子  让她觉得跟你在一起她是幸福的
  10.继续做自己喜欢的她也不反对的工作
  11.按照她给你设计的style穿着打扮 或者两人一起打造自己的形象
  12.注意锻炼身体  让自己有男人味  从而让她有安全感
  13.为她注意自己的形象  尤其是一起出去的时候
  14.陪她做一切她愿意做的也许很幼稚的事情  换个角度  其实那叫可爱  或者说 像她一样有童心
  15.收起自己的坏情绪  在她的面前乐观和微笑的时候多
  16.时不时地给她惊喜  不要让生活使你们的爱情失去光泽
  17.珍惜每一个与她在一起的机会  让在一起的时光尽量充满欢乐
  18.不要羞于说你爱她  也不要觉得厌烦  无论在何种场合
  19.如果她要抽烟 你给她 然后在旁边陪着她 喝酒也是
  20.背着她在你们的房子里打转  即便只是租来的临时房子 陪她在家里捉
        迷藏 玩游戏
  21.让她躺在你的大腿上一起看电视或者看电影
  22.陪她做一切她想和你一起做的事情 比如看a片
  23.当她思考的时候 不要打扰她
  24.解答她的任何疑问 如果她是一个好奇宝宝
  25.一起干家务 一起沐浴洗澡 能两个人一起的都要陪她 前提是她希望你陪
        她 问问她 不要怕被拒绝
  26.帮她记下第二天要做的事情  并到时候提醒她
  27.把她第二天要带的东西要穿的衣服和早上要用到的东西放在你知道的地
        方 并且告诉她
  28.和她去菜市场买菜  如果她不会居家记得教会她
  29.给她做你拿手的饭菜  并且一直享用  如果没有拿手的 那么学习 总
       有一天你会做到她满意的口味
  30.记得时时夸奖她
  31.她做得有不对的地方要委婉的提出并说明你的看法一起探讨
  32.不要一个人闷葫芦让她担心  记住你们是一起的
  33.向她汇报你的行踪让她知道你在做什么 保持手机的畅通让她随时能找到你
  34.告诉你父母你们的事情  你有义务让父母知道她的存在
  35.记下你觉得她特别优秀的地方 并且在她沮丧的时候提醒她 支持她
  36.用笔记下你们一起做得你觉得幸福的事情 那是你们以后最大的财富
  37.她要出门主动接送
  38.觉得她开心是比你自己开心更让你开心的事情  她难过是比你自己难过
        更让你难受的事情
  39.把她介绍给你的亲戚朋友们  并且在他们面前夸奖她
  40.收藏好她给你的一切礼物 即使只是一张小贺卡
  41.不再见有暧昧意味的网友 如果去见了 告诉对方你的她 并且让她知道你
       们见面的情况
  42.申请一个你们的文集  写很多情书给她让她去看
  43.她生病的时候要好好照顾她  尽你所有的柔情  并告诉她你很爱她 她
        会很快好起来的
  44.在大家面前不方便用话说的 能心领神会彼此的意思
  45.尽量详细的告诉她你们可能要经受的困苦
  46.在她受不了困苦的时候离开你你不怨恨她而是给她祝福
  47.保护她不要让她受一点点伤
  48.为她努力奋斗 赚足足够求婚的资本
  49.勇敢地向她求婚 不要害怕被拒绝
  50.在她不爱你的时候安静的走开 永远不要纠缠 然后做她的好朋友
  51.担起保护她照顾她的责任  并且努力去做
  52.跟她的父母沟通 给他们留下好印象 让他们觉得把女儿交给你是安全的
        可以放心的
  53.告诉她应该怎么样和你的家人沟通
  54.带她回家并且告诉她在你家里应该注意的事情
  55.每年陪她回家去看望爸爸妈妈并和爸爸妈妈一起生活尽可能长的时间
  56.记得给她的爸爸妈妈还有其他家人买礼物
  57.不要当着别人的面和她吵架  尤其是在她的亲戚朋友面前
  58.让她能在你身上看得到未来的希望
  59.在你的问题上永远不要欺骗她  对她坦诚
  60.如果她说爱你她就是爱你的  不要猜疑
  61.让她有空间和时间陪她的朋友们一起  爱她关心她但是要让她自由
  62.支持她的突发奇想  并且帮助她去实行
  63.和她一起计划你们的未来而不是打断她  相信这是一件让你们觉得幸福的事情
  64.和她一起装扮你们的家
  65.用各种不同的方式和她****  相信这是一件很唯美的事情
  66.让她把房间弄乱而不打断她  然后把房间收拾好
  67.把她抱在怀里  替她赶走一切她害怕的小动物
  68.在你把她惹哭了的时候记得抱着她 吻她的眼睛吻她的脸颊还有咸咸的小舌头 让它们把你的愤怒融化
  69.相信你们的未来  无论你有多少顾虑  那都是可以克服的
  70.不要在她面前自卑  无论是她很漂亮你很丑 还是她家很有钱你很穷 活
       着她很突出你很一般
  71.知道这一点:不自信的男人是不值得被人家爱的
  72.改善她觉得你还不够优秀的地方 而不是厌烦的跟她说你不喜欢你走 那
       是不负责任的解决方法
  73.记得她要你少抽烟少喝酒的告诫 她是为你好 抽烟喝酒伤身
  74.时刻记得你们是一起的  包括你的快乐和烦恼  尽可能的和她分享
  75.关心她的一切 平时也别忘了嘘寒问暖
  76.和她分担她的烦恼 即便你无能为力 让她知道你站在她身后 让她觉得你可以依靠
  77.一切困难都是暂时的 你们可以度过一切难关
  78.如果你是爱她的 让她知道
  79.相信她是你的唯一match
  80.如果你要离开她  尽可能地说清楚并且给她时间去接受
  81.在她不冷静的时候 抚慰她 让她平静下来再做其他决定
  82.尽可能避免吵架
  83.不要轻易说分手
  84.吵架之后主动道歉 不管是不是你错
  85.记住:女人是用来宝贝的
  86.原谅她的无理取闹
  87.讲笑话给她听 然后和她笑成一片
  88.在她跟你讲话的时候认真听
  89.陪她逛街  但是少东张西望看其他的女人
  90.逛街的时候如果被发现你在偷看其他女人 要跟她挑她们的刺 比如身材
       不好 穿着没品位 化妆太浓等
  91.在她的人生大事上让她自己做主
  92.劝她在做决定的时候多听听别人的意见 尤其是父母 即使这样不利于你
  93.一起去旅游之前把一切准备工作做好并且第二天叫她起床
  94.在旅途中不要跟她怄气
  95.旅行中放松下来陪她尽情的玩
  96.做一切她希望你做的事情 只要不违背你的原则
  97.当你不愿意去做一件事情的时候 要跟她说明白
  98.为了她 生活需要你低头的时候 不妨低下你高贵的头颅 你要相信你在做
       一件对你来说更为重要的事情
  99.把你要为她做的事情写下来 然后一点点去实行 随时检验
  100.记住:不要轻易承诺;承诺了就要尽你所能做到
  101.跟她结婚  举行她最喜欢的结婚仪式  
版本二
1、和她说话时总爱笑  
2、和她走在一起,手总是要放在她腰上,当她小声的说“老公,大街上呀”我总是嘿嘿一笑  
3、和她吃一个碗里的饭  
4、她吃剩下的东西或者是吃不了的我总是好不留情的吃到肚里  
5、晚上出去散步喜欢拉着她的手  
6、情人节的时候送她花  
7、三八节的时候送她小狗 ,并说声,妻子你辛苦了。  
8、她的照片床头、钱包里、手机里到处都是  
9、手机里总是存着她给他发的信息  
10、有事没事总是爱老婆老婆的叫  
11、如果俩个人在一起你不小弄脏了手,只要一抻手她就是能拿出纸来让我擦手,
12、自己明明不喜欢看恐怖片还非要陪她看  
13、自己不喜欢走路,但是只要她喜欢我就会陪她走完一生的
14、晚上她抱着小狗(布的)睡觉,我会点着小狗的鼻子说这家伙比我的待遇还好咧  
15、戴着她送的信物到处炫耀  
16、每次给她发短信头两个字总是老婆  
17、如果是她的非常时期她总是这不让吃那不让吃,如果她说,她非要吃,我会说不准任性  
18、和她正发短信聊天,我突然有事了,我会给你发个短信给我说,先暂停一会老婆  
19、会对她说憨妮睡吧  
20、第一次到她家我会认认真真的把地拖好几遍  
21、新买的发夹,戴上给我看,我会说“好看跟个憨妮样”她一蹶嘴她会说“不是好看老婆”  
22、如果走到河边我说要推她下河她会把我死死的抓紧在做往河里推的动作  
23、让她抱着我抓栏杆我抱着我她活不放开  
24、我会让她拉着我的手转圈,然后把我转到我怀里  
25、对我说爱情是靠自己把握的  
26、她对我说即使我现在一无所有也会爱我一辈子  
27、喂她吃功克力  
28、她写的一手漂亮的字  
29、我脸上喜欢冒“油”,她总是两只手托着我的脸用大拇指给我擦鼻上的油  
30、我对她说一辈子不让她受委屈  
31、她有一颗善良的心  
32、听到她语气不对我会说老婆说咋了不开心吗你别吓我  
33、我对她说我离不开你了老婆  
34、如果约会我迟到了她从不会打电话催我而且也不会怪我,不管要你等多长时间  
35、嘴说她小孩子脾气,心里却偷笑  
36、她是个吃过苦的人  
37、是个有志气有骨气的人  
38、我会对老婆说想你想你我要见你  
39、我抱着她她可以把下巴放在我肩上  
40、用梳子给她梳头  
41、骑自行车带她  
42、如果她不喜欢吃的东西她可以丢到我的碗里  
43、男儿有泪不轻弹却被她气的掉眼泪  
44、我说她是我的精神支柱  
45、我自己总是买便宜衣服而她想要的东西,我从来都不说一个不字  
46、吵架时爱说她像一个小痞子  
47、我生气时一声不吭,她会说老公别这样我害怕  
48、我被她作弄后,说我“坏老公”  
49、和她签吵架公约虽然我觉的无聊  
50、我对工作很认真,虽然我是个当过兵的人,但是连个死小猫都不敢碰    
51、我走时,总是吻她的额头
52、每次她说,老公“我想吃这个”“想要那个”我只会说一个字“买”记得有一次,我骑着车带这她,她看见了香蕉说“啊!香蕉”我说“买”!其实她只是一句感叹话,并不是想吃!
53、有时她给我讲她在网上看到的好玩的故事,我会一声不吭的抱着她让她讲,等她讲完了,一点应也没,她说“怎么搞的一点也不好笑吗”我说“老婆,其实我早看过了,看你讲的那么有心,没好意思说”
54、有时她自己爱说自己“我真是太聪明了”
55、打电话说“宝贝,……”
56、吵架后说“我的爱发脾气老婆,在干什么”
57、说“老婆想死你了”
58、早上如果不吃饭,我会说去吃饭,不准任性
59、当她做错事,向我承认错误时,我只会说“爱死你了老婆”
60、她穿的衣服露了一点点,被别人盯着看,我会气的要死,还会说脏话(我是很斯文的人哦)
61、和她一起看无聊的电影
62、对她说,你对我大吵大闹,我一点也不害怕,你一本正经的给我说话让我不安,害怕你有事!
63、总是爱说“老婆我错了”
64、我会陪着她一起看夕阳落山
65、晚上睡觉前我会对她说,来用热水烫烫脚吧,能促进血液循环。
66、在我上夜班的时候,我会对她说,晚上睡觉前关好门窗
67、嘴上说“我大度的很”,当别的男生给她打电话时,我会很生气,嚷嚷个没完没了!
68、对她说现在自己很有自信,说恋爱可以给人自信
69、说幸好我先“占”住你了,要不然不知道便宜那个王巴蛋了
70、我爱说老婆这是我见过你穿的最好看的衣服(每次都这样说)
71、她说“以小人之心度君子之腹”她说是“以小人之心(duo夺)度君子之腹,记住了?”“记住了”“下回咋说”“以小人之心(duo夺)度君子之腹”“不对”“咋不对?”“你应该说这是你老公教的念(duo夺)度”
72、对她说如果她不在我耳边叽喳,我还不习惯咧
73、她生病时给她拿药,就算是她得的是妇科病
74、她有时很小孩子气,还会噘嘴
75、她生气时,就是想尽办法让她开心
76、如果她非要给我画妆,我会说别闹了,但最后会乖乖就犯
78、过马路时,如果她闯红灯,我会一把把你拉过来,说“你会不会过马路呀”然后牵着她的手过马路
79、我说她说我你是猪啊?我会不紧不慢的说我是猪,你就是母猪
80、喜欢打扫卫生(反正是比我强啦)说看到不干净,我不舒服
81、她减服瘦了,我会很心疼
82、吵不过她时,会说“你知道什么叫“得理不饶人吗?”“啊?”“这个词在你身上展现的淋漓尽致”
83、冬天时会帮她暖手
84、对我说紫睛给高带上个什么东西,我说现在你属于我了,我想到了你
85、在很忙,很累时,想到她会很开心
86、把我门俩的照片放在钱包里
87、她心里不高兴,我说把心事说出来,如果有些不能跟老公说,可以跟好朋友说说,别憋在心里
88、对她说在也不在我面前生气了
89、跟老婆说对不起
90、出门在外总是想老婆,还问她是不是很没出息呀?说不管别人怎么看我就是这样,我会依然如故的想你爱你
91、希望她每天都开心,因为她不开心,我也不开心
92、看到感人的爱情故事,会说我会想男主角那样好好对你说,我会努力的
93、我要答应她,一辈子不离开她
94、我自己胆子并不大,她害怕时,会说“别怕,有我”
95、对她说不要让猜疑分化了彼此的爱
96、告诉她不准不尊重大人
97、我对她说要赖我一辈子,缠住我,不放手
98、她生气不里我,我对她说,别这样惩罚老公,老公知道错了
99、对她说,好长时间不见咱妈了,我说想咱妈了?她说是呀!
100、我说她身上的一颗舍利子,他在我在,永不分开
101、对她说一辈子不离不弃  

分页: 293/339 第一页 上页 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 下页 最后页 [ 显示模式: 摘要 | 列表 ]