2012年8月3日 星期五

MYSQL 重覆資料怎麼刪除

這次又遇到一樣的問題了,key沒處理好,造成會有重複的資料

搜尋了一下,有看到幾種做法
1.直接刪掉在talbe裡重複的資料
例:ALTER IGNORE TABLE `資料表名稱` ADD UNIQUE INDEX(`欄位1`,`欄位2`...);

2.分二次,將 重複的資料 以及 未重複的資料 分別匯入另一個表,然後直接取代舊表

 我採用了以下的方式(較安全,雖然慢了一點) 
1.先將"未重複"的資料寫到另一個表 INSERT INTO `table_copy` SELECT * FROM `table` GROUP BY `field name` HAVING count(*)=1 
2.再將"重複"的資料寫到另一個表 INSERT INTO `table_copy` SELECT * FROM `table` GROUP BY `field name` HAVING count(*)>1 
3.直接用新表取代舊的表 

參考資料來源 
1、從MYSQL資料庫中找出重複的資料並刪除
2、[MYSQL]利用 SQL 找出欄位值重覆的記錄
這次又遇到一樣的問題了,key沒處理好,造成會有重複的資料

搜尋了一下,有看到幾種做法
1.直接刪掉在talbe裡重複的資料
例:ALTER IGNORE TABLE `資料表名稱` ADD UNIQUE INDEX(`欄位1`,`欄位2`...);

2.分二次,將 重複的資料 以及 未重複的資料 分別匯入另一個表,然後直接取代舊表

 我採用了以下的方式(較安全,雖然慢了一點) 
1.先將"未重複"的資料寫到另一個表 INSERT INTO `table_copy` SELECT * FROM `table` GROUP BY `field name` HAVING count(*)=1 
2.再將"重複"的資料寫到另一個表 INSERT INTO `table_copy` SELECT * FROM `table` GROUP BY `field name` HAVING count(*)>1 
3.直接用新表取代舊的表 

參考資料來源 
1、從MYSQL資料庫中找出重複的資料並刪除
2、[MYSQL]利用 SQL 找出欄位值重覆的記錄

2011年5月6日 星期五

如何使用windows xp設定vpn server

原來xp可以直接架vpn server啊
(雖然還是有限制要XP PRO版的,但己經很方便了)


相關的作法在「WindowsXP VPN Server」裡有說明的非常詳細了,不過有幾個地方還是要注意一下

1.分配的IP要跟vpn所在的ip區段一樣,不然會無法透過該網路再連到外部
2.若是vpn server在AP的後面,則要開啟1723這個port跟protocol 47給對應的vpn server
由於只有用到pptp,所以只要開這二個,若是用其他vpn server,則需開啟其他相對應的port或protocol
(可參考VPN 伺服器與防火牆設定的說明)

設定步驟
一、 選擇網路連線
二、 建立新的連線
三、 進入新增連線精靈,進行下一步
四、 選擇設定一個進階的連線
五、 擇接受連入連線
六、 入連線接收裝置,直接跳到下一步,不需作任何設定
七、 擇允許私人連線
八、 選「內容」設定tcp/ip
九、 派tcp/ip的位址範圍(也可不設,由dhcp自己指派也行)
十、 後就是按下「完成」結束設定
十一、防火牆的部份,必須開啟port 1723、protocol 47給予對應vpn server所用的ip


原來xp可以直接架vpn server啊
(雖然還是有限制要XP PRO版的,但己經很方便了)


相關的作法在「WindowsXP VPN Server」裡有說明的非常詳細了,不過有幾個地方還是要注意一下

1.分配的IP要跟vpn所在的ip區段一樣,不然會無法透過該網路再連到外部
2.若是vpn server在AP的後面,則要開啟1723這個port跟protocol 47給對應的vpn server
由於只有用到pptp,所以只要開這二個,若是用其他vpn server,則需開啟其他相對應的port或protocol
(可參考VPN 伺服器與防火牆設定的說明)

設定步驟
一、 選擇網路連線
二、 建立新的連線
三、 進入新增連線精靈,進行下一步
四、 選擇設定一個進階的連線
五、 擇接受連入連線
六、 入連線接收裝置,直接跳到下一步,不需作任何設定
七、 擇允許私人連線
八、 選「內容」設定tcp/ip
九、 派tcp/ip的位址範圍(也可不設,由dhcp自己指派也行)
十、 後就是按下「完成」結束設定
十一、防火牆的部份,必須開啟port 1723、protocol 47給予對應vpn server所用的ip


2010年11月11日 星期四

利用netstat找出怪怪的連線

起因:
主機上偶爾有一個httpd的線程佔用大量記憶體,但一直不確定是那個網頁造成的
它會造成網路,暫時沒反應...>.<
努力找了很久都沒找到...(是我太笨嗎??)


後來先利用top來看出是那個httpd及其PID,
再利用netstat -ntup | grep ESTAB 來比對查詢是來自那一個ip
這樣就可以到httpd的log去查是那一個網頁

不過,查出來後竟然是因為mysql搜尋出來的資料量太大
它一直在收資料,整個頻寬都被它佔去了

所幸主機上還有另一張對內的網卡,於是把mysql的連線都轉而走那張對內的卡
這樣就解決這問題了
(這好像是早就應該要這麼做的事了....>.<)


以下是一些實用的 netstat 語法,可以檢查主機的連線數量:

netstat -na
顯示主機上所有已建立的連線。
netstat -an | grep :80 | sort
顯示所有 port 80 的連線,並把結果排序。
netstat -n -p|grep SYN_REC | wc -l
列出主機上有多少個 SYNC_REC,一般上這個數字應該相當低。
netstat -n -p | grep SYN_REC | sort -u
同樣是列出 SYNC_REC,但不只列出數字,而是將每個 SYNC_REC 的連線列出。
netstat -n -p | grep SYN_REC | awk '{print $5}' | awk -F: '{print $1}'
列出發送 SYNC_REC 的所有 ip 地址。
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
計算每一個 ip 在主機上建立的連線數量。
netstat -anp |grep 'tcp\|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
列出從 TCP 或 UDP 連線到主機的 ip 的數量。
netstat -ntu | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
列出每個 ip 建立的 ESTABLISHED 連線數量。
netstat -plan|grep :80|awk {'print $5'}|cut -d: -f 1|sort|uniq -c|sort -nk 1
列出每個 ip 建立的 port 80 連線數量。



參考資料:使用 netstat 找出不正常的連線
起因:
主機上偶爾有一個httpd的線程佔用大量記憶體,但一直不確定是那個網頁造成的
它會造成網路,暫時沒反應...>.<
努力找了很久都沒找到...(是我太笨嗎??)


後來先利用top來看出是那個httpd及其PID,
再利用netstat -ntup | grep ESTAB 來比對查詢是來自那一個ip
這樣就可以到httpd的log去查是那一個網頁

不過,查出來後竟然是因為mysql搜尋出來的資料量太大
它一直在收資料,整個頻寬都被它佔去了

所幸主機上還有另一張對內的網卡,於是把mysql的連線都轉而走那張對內的卡
這樣就解決這問題了
(這好像是早就應該要這麼做的事了....>.<)


以下是一些實用的 netstat 語法,可以檢查主機的連線數量:

netstat -na
顯示主機上所有已建立的連線。
netstat -an | grep :80 | sort
顯示所有 port 80 的連線,並把結果排序。
netstat -n -p|grep SYN_REC | wc -l
列出主機上有多少個 SYNC_REC,一般上這個數字應該相當低。
netstat -n -p | grep SYN_REC | sort -u
同樣是列出 SYNC_REC,但不只列出數字,而是將每個 SYNC_REC 的連線列出。
netstat -n -p | grep SYN_REC | awk '{print $5}' | awk -F: '{print $1}'
列出發送 SYNC_REC 的所有 ip 地址。
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
計算每一個 ip 在主機上建立的連線數量。
netstat -anp |grep 'tcp\|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
列出從 TCP 或 UDP 連線到主機的 ip 的數量。
netstat -ntu | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
列出每個 ip 建立的 ESTABLISHED 連線數量。
netstat -plan|grep :80|awk {'print $5'}|cut -d: -f 1|sort|uniq -c|sort -nk 1
列出每個 ip 建立的 port 80 連線數量。



參考資料:使用 netstat 找出不正常的連線

2010年9月14日 星期二

lsattr以及chattr的用法

前一陣子幫手上管理的網站換到別台主機
要去修改sshd登入時要用的key時..竟然不能修改..
我己經是root了耶...它竟然跟我說沒有權限修改這個檔案...>.<
差點沒瘋掉....研究好一陣子後...才知道原因
原來是該台主機安全性做得比較嚴謹,就是利用chattr來把部份檔案加上隱藏屬性

謎之音:你還有得學呢...


底下是chattr及lsattr的用法


[root@www ~]# chattr [+-=][ASacdistu] 檔案或目錄名稱
選項與參數:
+ :增加某一個特殊參數,其他原本存在參數則不動。
- :移除某一個特殊參數,其他原本存在參數則不動。
= :設定一定,且僅有後面接的參數

A :當設定了 A 這個屬性時,若你有存取此檔案(或目錄)時,他的存取時間 atime將不會被修改,可避免I/O較慢的機器過度的存取磁碟。這對速度較慢的電腦有幫助
S :一般檔案是非同步寫入磁碟的(原理請參考第五章sync的說明),如果加上 S 這個屬性時,當你進行任何檔案的修改,該更動會『同步』寫入磁碟中。
a :當設定 a 之後,這個檔案將只能增加資料,而不能刪除也不能修改資料,只有root才能設定這個屬性。
c :這個屬性設定之後,將會自動的將此檔案『壓縮』,在讀取的時候將會自動解壓縮,但是在儲存的時候,將會先進行壓縮後再儲存(看來對於大檔案似乎蠻有用的!)
d :當 dump 程序被執行的時候,設定 d 屬性將可使該檔案(或目錄)不會被 dump 備份
i :這個 i 可就很厲害了!他可以讓一個檔案『不能被刪除、改名、設定連結也無法寫入或新增資料!』對於系統安全性有相當大的助益!只有 root 能設定此屬性
s :當檔案設定了 s 屬性時,如果這個檔案被刪除,他將會被完全的移除出這個硬碟空間,所以如果誤刪了,完全無法救回來了喔!
u :與 s 相反的,當使用 u 來設定檔案時,如果該檔案被刪除了,則資料內容其實還存在磁碟中,可以使用來救援該檔案喔!
注意:屬性設定常見的是 a 與 i 的設定值,而且很多設定值必須要身為 root 才能設定




[root@www ~]# lsattr [-adR] 檔案或目錄
選項與參數:
-a :將隱藏檔的屬性也秀出來;
-d :如果接的是目錄,僅列出目錄本身的屬性而非目錄內的檔名;
-R :連同子目錄的資料也一併列出來!


參考資料來源:鳥哥的Linux私房菜
前一陣子幫手上管理的網站換到別台主機
要去修改sshd登入時要用的key時..竟然不能修改..
我己經是root了耶...它竟然跟我說沒有權限修改這個檔案...>.<
差點沒瘋掉....研究好一陣子後...才知道原因
原來是該台主機安全性做得比較嚴謹,就是利用chattr來把部份檔案加上隱藏屬性

謎之音:你還有得學呢...


底下是chattr及lsattr的用法


[root@www ~]# chattr [+-=][ASacdistu] 檔案或目錄名稱
選項與參數:
+ :增加某一個特殊參數,其他原本存在參數則不動。
- :移除某一個特殊參數,其他原本存在參數則不動。
= :設定一定,且僅有後面接的參數

A :當設定了 A 這個屬性時,若你有存取此檔案(或目錄)時,他的存取時間 atime將不會被修改,可避免I/O較慢的機器過度的存取磁碟。這對速度較慢的電腦有幫助
S :一般檔案是非同步寫入磁碟的(原理請參考第五章sync的說明),如果加上 S 這個屬性時,當你進行任何檔案的修改,該更動會『同步』寫入磁碟中。
a :當設定 a 之後,這個檔案將只能增加資料,而不能刪除也不能修改資料,只有root才能設定這個屬性。
c :這個屬性設定之後,將會自動的將此檔案『壓縮』,在讀取的時候將會自動解壓縮,但是在儲存的時候,將會先進行壓縮後再儲存(看來對於大檔案似乎蠻有用的!)
d :當 dump 程序被執行的時候,設定 d 屬性將可使該檔案(或目錄)不會被 dump 備份
i :這個 i 可就很厲害了!他可以讓一個檔案『不能被刪除、改名、設定連結也無法寫入或新增資料!』對於系統安全性有相當大的助益!只有 root 能設定此屬性
s :當檔案設定了 s 屬性時,如果這個檔案被刪除,他將會被完全的移除出這個硬碟空間,所以如果誤刪了,完全無法救回來了喔!
u :與 s 相反的,當使用 u 來設定檔案時,如果該檔案被刪除了,則資料內容其實還存在磁碟中,可以使用來救援該檔案喔!
注意:屬性設定常見的是 a 與 i 的設定值,而且很多設定值必須要身為 root 才能設定




[root@www ~]# lsattr [-adR] 檔案或目錄
選項與參數:
-a :將隱藏檔的屬性也秀出來;
-d :如果接的是目錄,僅列出目錄本身的屬性而非目錄內的檔名;
-R :連同子目錄的資料也一併列出來!


參考資料來源:鳥哥的Linux私房菜

2010年8月27日 星期五

linux 單一目錄檔案太多時該怎麼刪?

今天為了要清出硬碟空間...
硬是要刪掉一些東西
但老是遇到幾個目錄出現
bash: /bin/rm: Argument list too long
這樣的訊息....找了一下文章

發現原來是 rm 有最大一次刪除的數量,所以當一個目錄裡有太多的檔案或目錄時,就會出現錯誤,估計應該是在二萬以下,可以使用 find ./ | xargs rm -rf 來刪除,在這邊的目的是先使用 find 列出檔案,再導向到 xargs,xargs 再餵給 rm,在這裡,xargs 會分批依照 rm 的最大數量餵給 rm,然後就可以順利刪除檔案了

相關文章內容請詳閱文章出处:飞诺网(www.firnow.com) 今天為了要清出硬碟空間...
硬是要刪掉一些東西
但老是遇到幾個目錄出現
bash: /bin/rm: Argument list too long
這樣的訊息....找了一下文章

發現原來是 rm 有最大一次刪除的數量,所以當一個目錄裡有太多的檔案或目錄時,就會出現錯誤,估計應該是在二萬以下,可以使用 find ./ | xargs rm -rf 來刪除,在這邊的目的是先使用 find 列出檔案,再導向到 xargs,xargs 再餵給 rm,在這裡,xargs 會分批依照 rm 的最大數量餵給 rm,然後就可以順利刪除檔案了

相關文章內容請詳閱文章出处:飞诺网(www.firnow.com)

2010年6月3日 星期四

postfix+mysql(auth)+postfixadmin at centos

之前一直找到在其他linux套件上的做法,一直做不成功
(要嘛是debian的,要嘛是ubuntu的,不然就是fedora的)

主要是postfix+dovecot來完成的
(還有一個是搭配courier-imap,但這個我一直做不起來..>.<)
此篇文章主要是參考這一篇
(http://www.campworld.net/thewiki/pmwiki.php/LinuxServersCentOS/Cent5VirtMailServer)

下面的內容僅從中摘錄部份重點

首先要準備的幾個軟件
1.postfix with mysql(這個可以參考http://www.pigo.idv.tw/archives/323)
(centos預設的postfix是不支援mysql的,務必參考上述文章重新安裝)
2.Dovecot
3.mysql
4.httpd
5.postfixadmin
(這個是網頁的程序,麻煩自己去抓回來放在你的web目錄下,之後透過web就可以管理郵件帳號)
6.cyrus-sasl,cyrus-sasl-lib,cyrus-sasl-devel,cyrus-sasl-sql,cyrus-sasl-plain
上面除了1,5之外,其他都可以用centos5.4內建的套件就好(yum install xxxx)

首先把postfixadmin設定好
新版的postfixadmin在安裝上做了一些改良,使用者只要先把資料庫及使用者建立起來
以及修改config.inc.php這個檔案,剩下的就全都可以在網頁上完成了(不必再自己手動建立資料表)
(config.inc.php裡面也都有針對各項參數做說明)
如同下面的步驟
Now we need to setup the mysql database for mysqladmin. We only need to create the database and user. The setup file will create the rest.
> mysql -u root -p -e "CREATE DATABASE postfix;"
> mysql -u root -p -e "CREATE USER postfix@localhost IDENTIFIED BY 'choose_a_password';"
> mysql -u root -p -e "GRANT ALL PRIVILEGES ON postfix . * TO postfix@localhost;"

Now its time to setup the config file. Don't forget to set your password. Find the following items and change them.
> cd /usr/share/postfixadmin
> nano -w config.inc.php


# 這一行要改成true,否則無法安裝
$CONF['configured'] = true;

// Postfix Admin Path
// Set the location to your Postfix Admin installation here.
$CONF['postfix_admin_url'] = '/mailadmin/';

// Database Config
// mysql = MySQL 3.23 and 4.0
// mysqli = MySQL 4.1
// pgsql = PostgreSQL
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = 'postfixadmin';
$CONF['database_name'] = 'postfix';
$CONF['database_prefix'] = '';


$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'NO';
$CONF['encrypt'] = 'cleartext';


接下來,換設定一下postfix的main.cf(/etc/postfix/main.cf)
關於postfix原本的一些設定我就不多談了
(如下這些)
# network settings
inet_interfaces = all
mydomain = yourdomain.com
myhostname = host.yourdomain.com
mynetworks = 192.168.0.0/16, 127.0.0.0/24,
mydestination = $myhostname, localhost.$mydomain, localhost
relay_domains = $mydestination
# mail delivery
recipient_delimiter = +
========================
上面這些設定用預設也行,要針對自己的情況修改也行
參考鳥哥的文章可以瞭解詳細內容(簡易 Mail Server 架設 -- Postfix 設定)
或是連到
HOWTO Virtual Mail Hosting on CentOS 5.x - Postfix MySQL Dovecot Postfix Admin
這篇原本的文章中,參考它文中所附上的完整main.cf及master.cf設定檔內容

本文只針對要利用mysql來管理所需增設的一些設定
在/etc/postfix/main.cf新增下述設定

# virtual setup
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_alias_maps.cf,
regexp:/etc/postfix/virtual_regexp
virtual_gid_maps = static:89 #your postfix gid
virtual_mailbox_base = /home/vmail
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailbox_maps.cf
virtual_minimum_uid = 89
virtual_transport = virtual
virtual_uid_maps = static:89 #your postfix uid

# authentication
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes

# tls config
smtp_use_tls = yes
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /etc/postfix/ssl/smtpd.pem
smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.pem
smtpd_tls_CAfile = /etc/postfix/ssl/smtpd.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

# rules restrictions
# smtpd_client_restrictions = reject_rbl_client zen.spamhaus.org
smtpd_helo_restrictions = permit_sasl_authenticated,
permit_mynetworks,
reject_non_fqdn_hostname
smtpd_sender_restrictions = reject_non_fqdn_sender,
reject_unknown_sender_domain
smtpd_recipient_restrictions = permit_sasl_authenticated,
permit_mynetworks,
reject_unauth_destination,
reject_non_fqdn_recipient,
reject_unknown_recipient_domain
smtpd_helo_required = yes
unknown_local_recipient_reject_code = 550
disable_vrfy_command = yes
smtpd_data_restrictions = reject_unauth_pipelining


然後新增下面幾個個檔案
The postfix / mysql config files.

/etc/postfix/mysql-virtual_alias_maps.cf

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


/etc/postfix/mysql-virtual_domains_maps.cf

hosts = localhost
user = postfix
password = postfix
dbname = postfix
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'
這裡要注意一下,我在postfixadmin新增網域時,把"備份網域"勾起來了,造成我信件一直被主機退回
上面這一行sql語法,就是會造成找不到允許接收信件網域的原因
看是要把備份網域取消,或是修改這一行,把backupmx = '0' 拿掉都行


/etc/postfix/mysql-virtual_mailbox_maps.cf

hosts = localhost
user = postfix
password = postfix
dbname = postfix
table = mailbox
select_field = maildir
where_field = username


接下來,修改這個檔案(讓smtp在寄信要求驗證時使用的設定檔)
/usr/lib/sasl2/smtpd.conf


pwcheck_method: auxprop
mech_list: PLAIN LOGIN
auxprop_plugin: sql
sql_verbose: yes
sql_engine: mysql
sql_hostnames: localhost
sql_user: postfix
sql_passwd: postfix
sql_database: postfix
sql_select: select password from mailbox where username = '%u@%r'


接下來,產生ssl的key讓postfix可以支援TLS

Now generate an SSL certificate for postfix to have TLS support.
> mkdir /etc/postfix/ssl
> cd /etc/postfix/ssl
> openssl req -new -x509 -nodes -out smtpd.pem -keyout smtpd.pem -days 3650

We need to touch a file. So type the follwoing.
> touch /etc/postfix/virtual_regexp
上面這個動作,就是在main.cf中
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_alias_maps.cf,
regexp:/etc/postfix/virtual_regexp
這一行要用到的檔案,讓你也可以手動編輯允許收信的電子郵件及網域
可以參考http://www.sympa.org/faq/postfix這篇文章
內文主要就是在講這檔案的用途

接下來是設定一下信件存放的目錄
Finally we'll configure the mail store directory. We put it in the /home directory to make backups and other item easy. So type the following.
> mkdir /home/vmail
> chmod 770 /home/vmail
> chown postfix:postfix /home/vmail

最後,修改dovecot的設定檔(/etc/dovecot.conf)

# Dovecot config file
auth default {
userdb sql {
args = /etc/dovecot-mysql.conf
}
passdb sql {
args = /etc/dovecot-mysql.conf
}
}
first_valid_uid = 89
default_mail_env = maildir:/home/vmail/%d/%n
protocols = imaps imap pop3s pop3
ssl_cert_file = /etc/postfix/ssl/smtpd.pem
ssl_key_file = /etc/postfix/ssl/smtpd.pem


新增/etc/dovecot-mysql.conf ,內容如下

driver = mysql
connect = host=localhost dbname=postfix user=postfix password=yourpassword
default_pass_scheme = PLAIN
password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir, 89 AS uid, 89 AS gid FROM mailbox WHERE username = '%u'


到這裡,整個作業就完成了,把postfix,dovecot都重新啟動後
這樣postfix就可以用postfixadmin來做管理了

文章只針對postfix,dovecot(pop3,imap)的部份做重點摘錄

之前一直找到在其他linux套件上的做法,一直做不成功
(要嘛是debian的,要嘛是ubuntu的,不然就是fedora的)

主要是postfix+dovecot來完成的
(還有一個是搭配courier-imap,但這個我一直做不起來..>.<)
此篇文章主要是參考這一篇
(http://www.campworld.net/thewiki/pmwiki.php/LinuxServersCentOS/Cent5VirtMailServer)

下面的內容僅從中摘錄部份重點

首先要準備的幾個軟件
1.postfix with mysql(這個可以參考http://www.pigo.idv.tw/archives/323)
(centos預設的postfix是不支援mysql的,務必參考上述文章重新安裝)
2.Dovecot
3.mysql
4.httpd
5.postfixadmin
(這個是網頁的程序,麻煩自己去抓回來放在你的web目錄下,之後透過web就可以管理郵件帳號)
6.cyrus-sasl,cyrus-sasl-lib,cyrus-sasl-devel,cyrus-sasl-sql,cyrus-sasl-plain
上面除了1,5之外,其他都可以用centos5.4內建的套件就好(yum install xxxx)

首先把postfixadmin設定好
新版的postfixadmin在安裝上做了一些改良,使用者只要先把資料庫及使用者建立起來
以及修改config.inc.php這個檔案,剩下的就全都可以在網頁上完成了(不必再自己手動建立資料表)
(config.inc.php裡面也都有針對各項參數做說明)
如同下面的步驟
Now we need to setup the mysql database for mysqladmin. We only need to create the database and user. The setup file will create the rest.
> mysql -u root -p -e "CREATE DATABASE postfix;"
> mysql -u root -p -e "CREATE USER postfix@localhost IDENTIFIED BY 'choose_a_password';"
> mysql -u root -p -e "GRANT ALL PRIVILEGES ON postfix . * TO postfix@localhost;"

Now its time to setup the config file. Don't forget to set your password. Find the following items and change them.
> cd /usr/share/postfixadmin
> nano -w config.inc.php


# 這一行要改成true,否則無法安裝
$CONF['configured'] = true;

// Postfix Admin Path
// Set the location to your Postfix Admin installation here.
$CONF['postfix_admin_url'] = '/mailadmin/';

// Database Config
// mysql = MySQL 3.23 and 4.0
// mysqli = MySQL 4.1
// pgsql = PostgreSQL
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = 'postfixadmin';
$CONF['database_name'] = 'postfix';
$CONF['database_prefix'] = '';


$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'NO';
$CONF['encrypt'] = 'cleartext';


接下來,換設定一下postfix的main.cf(/etc/postfix/main.cf)
關於postfix原本的一些設定我就不多談了
(如下這些)
# network settings
inet_interfaces = all
mydomain = yourdomain.com
myhostname = host.yourdomain.com
mynetworks = 192.168.0.0/16, 127.0.0.0/24,
mydestination = $myhostname, localhost.$mydomain, localhost
relay_domains = $mydestination
# mail delivery
recipient_delimiter = +
========================
上面這些設定用預設也行,要針對自己的情況修改也行
參考鳥哥的文章可以瞭解詳細內容(簡易 Mail Server 架設 -- Postfix 設定)
或是連到
HOWTO Virtual Mail Hosting on CentOS 5.x - Postfix MySQL Dovecot Postfix Admin
這篇原本的文章中,參考它文中所附上的完整main.cf及master.cf設定檔內容

本文只針對要利用mysql來管理所需增設的一些設定
在/etc/postfix/main.cf新增下述設定

# virtual setup
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_alias_maps.cf,
regexp:/etc/postfix/virtual_regexp
virtual_gid_maps = static:89 #your postfix gid
virtual_mailbox_base = /home/vmail
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailbox_maps.cf
virtual_minimum_uid = 89
virtual_transport = virtual
virtual_uid_maps = static:89 #your postfix uid

# authentication
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes

# tls config
smtp_use_tls = yes
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /etc/postfix/ssl/smtpd.pem
smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.pem
smtpd_tls_CAfile = /etc/postfix/ssl/smtpd.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

# rules restrictions
# smtpd_client_restrictions = reject_rbl_client zen.spamhaus.org
smtpd_helo_restrictions = permit_sasl_authenticated,
permit_mynetworks,
reject_non_fqdn_hostname
smtpd_sender_restrictions = reject_non_fqdn_sender,
reject_unknown_sender_domain
smtpd_recipient_restrictions = permit_sasl_authenticated,
permit_mynetworks,
reject_unauth_destination,
reject_non_fqdn_recipient,
reject_unknown_recipient_domain
smtpd_helo_required = yes
unknown_local_recipient_reject_code = 550
disable_vrfy_command = yes
smtpd_data_restrictions = reject_unauth_pipelining


然後新增下面幾個個檔案
The postfix / mysql config files.

/etc/postfix/mysql-virtual_alias_maps.cf

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


/etc/postfix/mysql-virtual_domains_maps.cf

hosts = localhost
user = postfix
password = postfix
dbname = postfix
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'
這裡要注意一下,我在postfixadmin新增網域時,把"備份網域"勾起來了,造成我信件一直被主機退回
上面這一行sql語法,就是會造成找不到允許接收信件網域的原因
看是要把備份網域取消,或是修改這一行,把backupmx = '0' 拿掉都行


/etc/postfix/mysql-virtual_mailbox_maps.cf

hosts = localhost
user = postfix
password = postfix
dbname = postfix
table = mailbox
select_field = maildir
where_field = username


接下來,修改這個檔案(讓smtp在寄信要求驗證時使用的設定檔)
/usr/lib/sasl2/smtpd.conf


pwcheck_method: auxprop
mech_list: PLAIN LOGIN
auxprop_plugin: sql
sql_verbose: yes
sql_engine: mysql
sql_hostnames: localhost
sql_user: postfix
sql_passwd: postfix
sql_database: postfix
sql_select: select password from mailbox where username = '%u@%r'


接下來,產生ssl的key讓postfix可以支援TLS

Now generate an SSL certificate for postfix to have TLS support.
> mkdir /etc/postfix/ssl
> cd /etc/postfix/ssl
> openssl req -new -x509 -nodes -out smtpd.pem -keyout smtpd.pem -days 3650

We need to touch a file. So type the follwoing.
> touch /etc/postfix/virtual_regexp
上面這個動作,就是在main.cf中
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_alias_maps.cf,
regexp:/etc/postfix/virtual_regexp
這一行要用到的檔案,讓你也可以手動編輯允許收信的電子郵件及網域
可以參考http://www.sympa.org/faq/postfix這篇文章
內文主要就是在講這檔案的用途

接下來是設定一下信件存放的目錄
Finally we'll configure the mail store directory. We put it in the /home directory to make backups and other item easy. So type the following.
> mkdir /home/vmail
> chmod 770 /home/vmail
> chown postfix:postfix /home/vmail

最後,修改dovecot的設定檔(/etc/dovecot.conf)

# Dovecot config file
auth default {
userdb sql {
args = /etc/dovecot-mysql.conf
}
passdb sql {
args = /etc/dovecot-mysql.conf
}
}
first_valid_uid = 89
default_mail_env = maildir:/home/vmail/%d/%n
protocols = imaps imap pop3s pop3
ssl_cert_file = /etc/postfix/ssl/smtpd.pem
ssl_key_file = /etc/postfix/ssl/smtpd.pem


新增/etc/dovecot-mysql.conf ,內容如下

driver = mysql
connect = host=localhost dbname=postfix user=postfix password=yourpassword
default_pass_scheme = PLAIN
password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir, 89 AS uid, 89 AS gid FROM mailbox WHERE username = '%u'


到這裡,整個作業就完成了,把postfix,dovecot都重新啟動後
這樣postfix就可以用postfixadmin來做管理了

文章只針對postfix,dovecot(pop3,imap)的部份做重點摘錄

2010年6月2日 星期三

別輕估自己在朋友心中的重要性

這是一篇轉載的文章,看完後深有同感
但我的情況倒不像文章中有那麼大的改變

而是一些讓我一輩子都忘不掉的一句話
或是造成我日後做事的一些準則之類的

朋友,感謝有你們,才會有今天的我


我唸高一時,有一天看到一位同班同學吉米‧凱從學校走回家;他看來是把所有在學校用的書要都帶回家。我想著:為什麼有人要在禮拜五把所有的書都帶回家呢?他一定是個很無趣的人。這個週末我已經計畫好參加一個宴會加上明天下午與朋友們來一場足球賽;所以我聳了聳肩,繼續走在回家的路。

不一會兒,我看到一群小孩跑向他,撞了過去,把他的書全撞飛了,並且絆倒他,讓他跌到泥中。他的眼鏡也掉在離他有十尺遠的草地上,>當他抬頭起來時,我看到他流露出很悲傷的眼神;那時我心軟了,我趕緊跑到他的身邊幫他找到眼鏡,同時看到了他眼角的淚光。

當我把眼鏡遞還給他時,「那些小孩真是混蛋,他們真的是欠扁!」他臉上浮出一個大笑容,說:「謝了!」。那不是普通的一笑,而是由心裡發出對他人真誠的謝意。

我幫他撿起散落的書,並問他住在那裡,原來他住在我家附近,但我卻不曾看過他。

他說,因為之前他是上私立學校。我和他一直聊天到家,我也幫他揹著他的書,我又發現,他是一個蠻酷的小子。分手前,我問他要不要在禮拜日一起去踢足球。他說好。我們就整個週末都玩在一起,而且我又發現越認識吉米,我越喜歡他;我的朋友們也有同感。

禮拜一早上,我又碰到吉米和他那一大堆的書。我問他:「你真是不簡單喔,每天這樣下去,你的臂力將會不得了喔!」他只是笑笑,並把一半的書丟給我。在後來的四年,我跟吉米成了最好的朋友。當我們唸到高四時(這是美國的學制),經過一番考慮,吉米決定要到喬治城大學讀醫學,而我要到伯爵大學唸書;但我知道我們會永遠都是朋友。

畢業那一年是由吉米代表畢業班致詞,我一直以這是很無趣的事來開他的玩笑。畢業典禮的那一天,我見到吉米,他真是帥呆了!他胖了一點,帶眼鏡也比較好看些;而且他很受女孩們的喜歡,比我有更多的約會?天啊!有時候我真的會嫉妒耶!這時我看出他很緊張要上台致詞,所以就拍拍他的背,又說:「嘿!你一定沒問題的!」他很感激的看著我,並笑著說「謝謝!」

他上台後,先清了清喉嚨開始他的致詞,「畢業是要來感謝一些曾經幫你度過難關的人,

比如是你的父母、老師、兄弟姊妹,或是你的教練...和你的朋友們。在這裡我要告訴大家,

「做一個人的朋友」是你可以給對方的最好禮物。我要來說一個故事.......」我以不可思議的眼神看著他,當他講著我們第一次相遇的故事。他說,那時正計畫要在週末時自殺,於是把學校置物箱裡的東西都清光了,希望死後媽媽不必再為他收拾殘局。然後,他很認真的看著我,並對我微笑,「很幸運的,我被救了,我被我的朋友從要做的錯事中救了出來。」當全場的聽眾聽到這位帥哥說出這件事時,歎息聲四起;我看到他的雙親看著我,並且對我報以感激的微笑。直到那時我才發現到,千萬不要低估自己的行動可能帶來的後果,也許一個小小的動作可以改變一個人的一生。不管世界變的怎樣,上帝讓我們和別人的生活交錯在一起時,

要我們要儘量找出對方的優點來!

--摘自耕心週刊

這是一篇轉載的文章,看完後深有同感
但我的情況倒不像文章中有那麼大的改變

而是一些讓我一輩子都忘不掉的一句話
或是造成我日後做事的一些準則之類的

朋友,感謝有你們,才會有今天的我


我唸高一時,有一天看到一位同班同學吉米‧凱從學校走回家;他看來是把所有在學校用的書要都帶回家。我想著:為什麼有人要在禮拜五把所有的書都帶回家呢?他一定是個很無趣的人。這個週末我已經計畫好參加一個宴會加上明天下午與朋友們來一場足球賽;所以我聳了聳肩,繼續走在回家的路。

不一會兒,我看到一群小孩跑向他,撞了過去,把他的書全撞飛了,並且絆倒他,讓他跌到泥中。他的眼鏡也掉在離他有十尺遠的草地上,>當他抬頭起來時,我看到他流露出很悲傷的眼神;那時我心軟了,我趕緊跑到他的身邊幫他找到眼鏡,同時看到了他眼角的淚光。

當我把眼鏡遞還給他時,「那些小孩真是混蛋,他們真的是欠扁!」他臉上浮出一個大笑容,說:「謝了!」。那不是普通的一笑,而是由心裡發出對他人真誠的謝意。

我幫他撿起散落的書,並問他住在那裡,原來他住在我家附近,但我卻不曾看過他。

他說,因為之前他是上私立學校。我和他一直聊天到家,我也幫他揹著他的書,我又發現,他是一個蠻酷的小子。分手前,我問他要不要在禮拜日一起去踢足球。他說好。我們就整個週末都玩在一起,而且我又發現越認識吉米,我越喜歡他;我的朋友們也有同感。

禮拜一早上,我又碰到吉米和他那一大堆的書。我問他:「你真是不簡單喔,每天這樣下去,你的臂力將會不得了喔!」他只是笑笑,並把一半的書丟給我。在後來的四年,我跟吉米成了最好的朋友。當我們唸到高四時(這是美國的學制),經過一番考慮,吉米決定要到喬治城大學讀醫學,而我要到伯爵大學唸書;但我知道我們會永遠都是朋友。

畢業那一年是由吉米代表畢業班致詞,我一直以這是很無趣的事來開他的玩笑。畢業典禮的那一天,我見到吉米,他真是帥呆了!他胖了一點,帶眼鏡也比較好看些;而且他很受女孩們的喜歡,比我有更多的約會?天啊!有時候我真的會嫉妒耶!這時我看出他很緊張要上台致詞,所以就拍拍他的背,又說:「嘿!你一定沒問題的!」他很感激的看著我,並笑著說「謝謝!」

他上台後,先清了清喉嚨開始他的致詞,「畢業是要來感謝一些曾經幫你度過難關的人,

比如是你的父母、老師、兄弟姊妹,或是你的教練...和你的朋友們。在這裡我要告訴大家,

「做一個人的朋友」是你可以給對方的最好禮物。我要來說一個故事.......」我以不可思議的眼神看著他,當他講著我們第一次相遇的故事。他說,那時正計畫要在週末時自殺,於是把學校置物箱裡的東西都清光了,希望死後媽媽不必再為他收拾殘局。然後,他很認真的看著我,並對我微笑,「很幸運的,我被救了,我被我的朋友從要做的錯事中救了出來。」當全場的聽眾聽到這位帥哥說出這件事時,歎息聲四起;我看到他的雙親看著我,並且對我報以感激的微笑。直到那時我才發現到,千萬不要低估自己的行動可能帶來的後果,也許一個小小的動作可以改變一個人的一生。不管世界變的怎樣,上帝讓我們和別人的生活交錯在一起時,

要我們要儘量找出對方的優點來!

--摘自耕心週刊