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