作者 主題: Postfix + Courier-imap(imap/pop3) + MySQL 虛擬主機之帳號管理  (閱讀 10143 次)

0 會員 與 1 訪客 正在閱讀本文。

ak

  • 可愛的小學生
  • *
  • 文章數: 17
    • 檢視個人資料
Postfix + Courier-imap(imap/pop3) + MySQL 之虛擬帳號管理
參考的網站:
   http://kirb.insanegenius.net/postfix.html
   http://www.sweeney.demon.co.uk/pfix_imap_virtual.html
   http://kummefryser.dk/HOWTO/mail/postfix_mysql.html

軟體安裝的部份就不說了, 僅提供相關設定資料(因懶得打太多) ^^
以下資料是參考上述網站而來的 ^^

說在前頭:
因小弟的英文能力非常有限, 有些地方小弟看不懂就給它略過了 ^^
因此不足的地方還望 大大們 幫小弟補足 ^^

posfix 部份:
============
/usr/local/etc/postfix/main.cf
# 虛擬主機的相關設定
transport_maps=mysql:/usr/local/etc/postfix/my-conf/mysql/transport.cf # 虛擬主機名
virtual_mailbox_maps=mysql:/usr/local/etc/postfix/my-conf/mysql/mysql_virt.cf # 郵件存放地
virtual_uid_maps=mysql:/usr/local/etc/postfix/my-conf/mysql/uids.cf # uid , 這可與 gid 共用一欄位
virtual_gid_maps=mysql:/usr/local/etc/postfix/my-conf/mysql/gids.cf # gid , 這可與 uid 共用一欄位
 #virtual_uid_maps=mysql:/usr/local/etc/postfix/my-conf/mysql/ids.cf # 共用一欄位之設定
 #virtual_gid_maps=mysql:/usr/local/etc/postfix/my-conf/mysql/ids.cf # 共用一欄位之設定
virtual_mailbox_base=/
virtual_maps =mysql:/usr/local/etc/postfix/my-conf/mysql/virtual.cf
mydestination = $mydomain, $myhostname, $transport_maps
-----------------------------------------------------
/usr/local/etc/postfix/my-conf/mysql/transport.cf
# 虛擬主機名
user=mysql_username
password=mysql_passwd
dbname=maildb
table=transport
select_field=transport
where_field=domain
hosts=127.0.0.1:3306
-----------------------------------------------------
/usr/local/etc/postfix/my-conf/mysql/mysql_virt.cf
# 郵件存放地
user=mysql_username
password=mysql_passwd
dbname=maildb
table=users
select_field=maildir
where_field=address
hosts=127.0.0.1:3306
-----------------------------------------------------
/usr/local/etc/postfix/my-conf/mysql/uids.cf
# uid , 這可與 gid 共用一欄位
user=mysql_username
password=mysql_passwd
dbname=maildb
table=users
select_field=uid
where_field=address
hosts=127.0.0.1:3306
-----------------------------------------------------
/usr/local/etc/postfix/my-conf/mysql/gids.cf
# gid , 這可與 uid 共用一欄位
user=mysql_username
password=mysql_passwd
dbname=maildb
table=users
select_field=gid
where_field=address
hosts=127.0.0.1:3306
-----------------------------------------------------
/usr/local/etc/postfix/my-conf/mysql/ids.cf
# 共用一欄位之設定
user=mysql_username
password=mysql_passwd
dbname=maildb
table=users
select_field=uid
where_field=address
hosts=127.0.0.1:3306
-----------------------------------------------------
/usr/local/etc/postfix/my-conf/mysql/virtual.cf
# 轉信(aliases)
user=mysql_username
password=mysql_passwd
dbname=maildb
table=virtual
select_field=goto
where_field=address
hosts=127.0.0.1:3306
-----------------------------------------------------
courier-imap 部份:
==================
/usr/local/etc/courier-imap/authdaemonrc
authmodulelist="authmysql authpam"
version="authdaemond.mysql"
-----------------------------------------------------
/usr/local/etc/courier-imap/authmysqlrc
MYSQL_SERVER            127.0.0.1
MYSQL_PORT              3306
MYSQL_USERNAME          mysql_username
MYSQL_PASSWORD          mysql_passwd
MYSQL_SOCKET            /tmp/mysql.sock
MYSQL_DATABASE          maildb
MYSQL_USER_TABLE        users
MYSQL_UID_FIELD         uid <= 可與 gid 共用一欄位
MYSQL_GID_FIELD         gid <= 可與 uid 共用一欄位
MYSQL_LOGIN_FIELD       id <= 使用者帳唬
MYSQL_CRYPT_PWFIELD     crypt <= 密碼
MYSQL_CLEAR_PWFIELD     clear <= 也是密碼, 這好像是多的
MYSQL_HOME_FIELD        home
MYSQL_NAME_FIELD        name <= 真實姓名
MYSQL_MAILDIR_FIELD     maildir <= 郵件存放地
#MYSQL_WHERE_CLAUSE     'imapok=1 AND bool1=1 AND bool2=1' <= 不知, 請看原網站
-----------------------------------------------------
mysql 資料庫(maildb):
=====================
mysql> SHOW tables;
+------------------+
| Tables_in_maildb |
+------------------+
| transport        | <= 虛擬主機 & 本地
| users            | <= 虛擬帳號
| virtual          | <= aliases
+------------------+
#-----------------------------------------------------
mysql> show columns from transport;
+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| domain    | varchar(128) |      | PRI |         |       | <= 主機名
| transport | varchar(128) |      |     |         |       | <= 虛擬(virtual) 或 本機(local)
+-----------+--------------+------+-----+---------+-------+
mysql> select * from transport;
+---------------+-----------+
| domain        | transport |
+---------------+-----------+
| msa.ahkun.com | local:    |
| ahkun.com     | virtual:  |
+---------------+-----------+
#-----------------------------------------------------
mysql> show columns from users;
+----------+----------------------+------+-----+--------------------------+-------+
| Field    | Type                 | Null | Key | Default                  | Extra |
+----------+----------------------+------+-----+--------------------------+-------+
| id       | varchar(128)         |      | PRI |                          |       | <= 帳號
| address  | varchar(128)         |      | UNI | @ahkun.com               |       | <= 帳號@虛擬主機名
| crypt    | varchar(128)         |      |     |                          |       | <= 密碼(crypt)
| clear    | varchar(128)         |      |     |                          |       | <= 密碼(md5),這個好像是多的?
| name     | varchar(128)         |      |     |                          |       | <= 真實姓名
| uid      | smallint(5) unsigned |      |     | 5001                     |       |
| gid      | smallint(5) unsigned |      |     | 5001                     |       |
| home     | varchar(128)         |      |     | /                        |       |
| domain   | varchar(128)         |      |     | ahkun.com                |       | <= 虛擬主機名
| maildir  | varchar(255)         |      |     | /data/mailbox/ahkun.com/ |       | <= 郵件的存放地
| imapok   | tinyint(3) unsigned  |      |     | 1                        |       | 不知, 請看原網站
| bool1    | tinyint(3) unsigned  |      |     | 1                        |       | 不知, 請看原網站
| bool2    | tinyint(3) unsigned  |      |     | 1                        |       | 不知, 請看原網站
+----------+----------------------+------+-----+--------------------------+-------+
mysql> select * from users;
+-------+-----------------+---------------+----------------------------------+-------------------+------+------+------+-----------+--------------------------------+--------+-------+-------+
| id    | address         | crypt         | clear                            | name              | uid  | gid  | home | domain    | maildir                        | imapok | bool1 | bool2 |
+-------+-----------------+---------------+----------------------------------+-------------------+------+------+------+-----------+--------------------------------+--------+-------+-------+
| pck   | pck@ahkun.com   | ahOt1234568Hs | ff33a0ba1234585ada6b63e2254ca417 | pck for ahkun.com | 5001 | 5001 | /    | ahkun.com | /data/mailbox/ahkun.com/pck/   |      1 |     1 |     1 |
+-------+-----------------+---------------+----------------------------------+-------------------+------+------+------+-----------+--------------------------------+--------+-------+-------+
#-----------------------------------------------------
mysql> show columns from virtual;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| address | varchar(255) |      | PRI |         |       | <= aliases 的郵件地址
| goto    | varchar(255) |      |     |         |       | <= 要轉到的郵件地址
+---------+--------------+------+-----+---------+-------+
mysql> select * from virtual;
+----------------+--------------------------------+
| address        | goto                           |
+----------------+--------------------------------+
| test@ahkun.com | pck@ahkun.com, ahkun@ahkun.com |
+----------------+--------------------------------+
寄到 test@ahkun.com 的信, 轉到 pck@ahkun.com & ahkun@ahkun.com
#-----------------------------------------------------

需建立的目錄/檔案 及其 權限&屬性:
=====================
這部份需參照 資料庫:maildb->users->maildir 欄位的內容
如有一筆如下:
+--------------------------------+
| maildir(欄位)                  |
+--------------------------------+
| /data/mailbox/ahkun.com/pck/   |
+--------------------------------+
其建立如下:
/data/mailbox/:(755 postfix:postfix)
drwxr-xr-x   3 postfix  postfix   512  8 28 07:41 mailbox/

/data/mailbox/ahkun.com/:(775 postfix:postfix)
drwxrwxr-x   5 postfix  postfix  512  9  3 11:41 ahkun.com/

/data/mailbox/ahkun.com/{users}/:(770 uid:gid)
drwxrwx---  6 5001     5001     512  8 28 07:30 pck/

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  感謝 duncanlo 大大 幫忙補充 mysql 資料庫部份 ^^
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

補充安裝軟體時, 需下的參數:
==========================
courier-imap-1.5.3
# cd /usr/ports/mail/courier-imap
# make WITH_MYSQL=YES all install clean
---------------------------------
postfix-1.1.11-20020719,1
# cd /usr/ports/mail/postfix-current
# make all install clean
選以下兩個
[x] SASL      Cyrus SASLv1 (Simple Authentication and Security Layer)
[x] MySQL     MySQL map lookups
---------------------------------
cyrus-sasl-1.5.27_7
(其實這個在安裝 postfix 時, 選 SASL 就會自動安裝, 所以這一步驟可省略)
# cd /usr/ports/security/cyrus-sasl
# make all install clean
選 [x] PWCHECK     Use pwcheck for password Authentication 即可
---------------------------------
mysql-client-3.23.52
# cd /usr/ports/databases/mysql323-client
# make all install clean
---------------------------------
mysql-server-3.23.52
# cd /usr/ports/databases/mysql323-server
# make all install clean
---------------------------------
P.S.
打了才知, 安裝步驟也不長 ^^

duncanlo

  • SA 苦力組
  • 俺是博士!
  • *****
  • 文章數: 7312
    • 檢視個人資料
套件安裝時當然是要有MySQL支援!

Postfix SQL File
代碼: [選擇]
#First Create the Database
CREATE DATABASE maildb;
use maildb;

#
# Table structure for table 'transport'
#
CREATE TABLE transport (
  domain varchar(128) NOT NULL default '',
  transport varchar(128) NOT NULL default '',
  UNIQUE KEY domain (domain)
) TYPE=MyISAM;

#
# Table structure for table 'users'
#
CREATE TABLE users (
  id varchar(128) NOT NULL default '',
  address varchar(128) NOT NULL default '',
  crypt varchar(128) NOT NULL default '',
  clear varchar(128) NOT NULL default '',
  name varchar(128) NOT NULL default '',
  uid smallint(5) unsigned NOT NULL default '1000',
  gid smallint(5) unsigned NOT NULL default '1000',
  home varchar(128) NOT NULL default '/',
  domain varchar(128) NOT NULL default '',
  maildir varchar(255) NOT NULL default '',
  imapok tinyint(3) unsigned NOT NULL default '1',
  bool1 tinyint(3) unsigned NOT NULL default '1',
  bool2 tinyint(3) unsigned NOT NULL default '1',
  PRIMARY KEY  (id),
  UNIQUE KEY id (id),
  UNIQUE KEY address (address),
  KEY id_2 (id),
  KEY address_2 (address)
) TYPE=MyISAM;

#
# Table structure for table 'virtual'
#
CREATE TABLE virtual (
  address varchar(255) NOT NULL default '',
  goto varchar(255) NOT NULL default '',
  UNIQUE KEY address (address)
) TYPE=MyISAM;

吉姆

  • 懷疑的國中生
  • **
  • 文章數: 63
    • 檢視個人資料
看得很模糊,太概是功力不夠吧....還是謝謝學長...等學弟功成後,再把心得post出來..
用mysql配合web interface來管理帳號真是神奇,找到以下文章,幾乎都是對岸的文獻,我們可得加油啦,但似乎都是for linux,我仿做在breebsd上,遇到很多問題,>_<
Postfix-Cyrus-Web-cyradm-HOWTO
Postfix + Cyrus-IMAP + Cyrus-SASL + MySQL 完全指南

逸晨

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1205
  • 我是逸晨
    • 檢視個人資料
引述: "吉姆"
看得很模糊,太概是功力不夠吧....還是謝謝學長...等學弟功成後,再把心得post出來..

加油~~
加油~~
最好能夠再多加一篇以『入魔手冊』格式的心得文章
這樣偶們就又可以少寫一篇了
嘻嘻  :wink:  :wink:

olderboy

  • 憂鬱的高中生
  • ***
  • 文章數: 100
    • 檢視個人資料
請問一下大大們~~cyrpt 這個加密的密碼是如何產生的呢??
我想直接寫入到 database 內,但是卻不知道加密後的密碼為何~~
還請大大們指導一下~~

清仔

  • 活潑的大學生
  • ***
  • 文章數: 298
    • 檢視個人資料
引述: "olderboy"
請問一下大大們~~cyrpt 這個加密的密碼是如何產生的呢??
我想直接寫入到 database 內,但是卻不知道加密後的密碼為何~~
還請大大們指導一下~~

me too ar
請指教
還有的是我在其他主機send去我的mail server裏的假user, 他回信說沒有這個user, send去真user沒有問題

清仔

  • 活潑的大學生
  • ***
  • 文章數: 298
    • 檢視個人資料
password('密碼')還是不行

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
是 crypt, 不是 password
crypt 要有種子數 (salt) 你才能驗證
種子數就是 crypt 欄位的頭兩個字元
所以結果就是:
查詢 crypt(password,left(crypt_field,2))
產生 crypt(password , "any 2 chars here")

man crypt 會有寫雖然不同 ( mysql function/c function)
但都是一樣的用法與原理

清仔

  • 活潑的大學生
  • ***
  • 文章數: 298
    • 檢視個人資料
Postfix Admin Install 有何用? 一定要裝才可收信?

清仔

  • 活潑的大學生
  • ***
  • 文章數: 298
    • 檢視個人資料
INSERT INTO users (id,address,crypt,name,home,domain,maildir,imapok,bool1,bool2) VALUES ('001','001@domain.com',crypt(password,'test'),'001','domain.com','/home/aaa/mail_user/001/','1','1','1');
是這樣嗎??
不行啊

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
我並不了解這篇文章在寫什麼(我沒有仔細看)
我只是針對 passwd 一節在回的,
不過相同的環境我在 Linux 都可以用 sendmail 做出來,

crypt 在 mysql 上叫 encrypt
語法 encrypt('password','salt')
這個 salt 是兩個字元像 '12'    'az' ....
若不了解就去查 mysql 的 function ...

清仔

  • 活潑的大學生
  • ***
  • 文章數: 298
    • 檢視個人資料
引述: "abelyang"
我並不了解這篇文章在寫什麼(我沒有仔細看)
我只是針對 passwd 一節在回的,
不過相同的環境我在 Linux 都可以用 sendmail 做出來,

crypt 在 mysql 上叫 encrypt
語法 encrypt('password','salt')
這個 salt 是兩個字元像 '12'    'az' ....
若不了解就去查 mysql 的 function ...

encrypt('mypassword','aa')
是這樣嗎
salt有何用

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
salt 就是編/解碼時的 Key
除了密碼要對外,  salt 也要一樣才可以

清仔

  • 活潑的大學生
  • ***
  • 文章數: 298
    • 檢視個人資料
引述: "abelyang"
salt 就是編/解碼時的 Key
除了密碼要對外,  salt 也要一樣才可以

那麼要如何解碼?

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
引用
salt 就是編/解碼時的 Key
除了密碼要對外, salt 也要一樣才可以


嗯~~我的這句話有語病  :oops:
應該說是編碼而以
原來的密碼 crypt 的值(Zxjkfjdifl)  和 現在輸的的密碼 (aaaa),
取 Zx 當 salt , crypt("aaaa","Zx")=="Zxjkfjdifl" ?
如果一樣就通過passwd 檢查了
所以 crypt 具有不可還原的特性...[/quote]

清仔

  • 活潑的大學生
  • ***
  • 文章數: 298
    • 檢視個人資料
引述: "abelyang"
引用
salt 就是編/解碼時的 Key
除了密碼要對外, salt 也要一樣才可以


嗯~~我的這句話有語病  :oops:
應該說是編碼而以
原來的密碼 crypt 的值(Zxjkfjdifl)  和 現在輸的的密碼 (aaaa),
取 Zx 當 salt , crypt("aaaa","Zx")=="Zxjkfjdifl" ?
如果一樣就通過passwd 檢查了
所以 crypt 具有不可還原的特性...
[/quote]
希望大大不要嚴我笨
是否aaaa是密碼, 現在希望加密至Zx字頭的編碼, crypt("aaaa","Zx"), 編碼後得出Zxjkfjdifl, 意思是這樣嗎?

清仔

  • 活潑的大學生
  • ***
  • 文章數: 298
    • 檢視個人資料
引述: "abelyang"
引用
salt 就是編/解碼時的 Key
除了密碼要對外, salt 也要一樣才可以


嗯~~我的這句話有語病  :oops:
應該說是編碼而以
原來的密碼 crypt 的值(Zxjkfjdifl)  和 現在輸的的密碼 (aaaa),
取 Zx 當 salt , crypt("aaaa","Zx")=="Zxjkfjdifl" ?
如果一樣就通過passwd 檢查了
所以 crypt 具有不可還原的特性...

encrypt
但是在outlook express裏輸入aaaa還是說密碼錯誤

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
引用
是否aaaa是密碼, 現在希望加密至Zx字頭的編碼, crypt("aaaa","Zx"), 編碼後得出Zxjkfjdifl, 意思是這樣嗎?

是的,意思是這樣沒有錯
但是 Zx....那一段我是隨便打的不是 aaaa 真正的 crypt 值
我僅是舉例而以

引用
但是在outlook express裏輸入aaaa還是說密碼錯誤

這個問題我不了解你的操作過程無法解釋...
也不知道 Outlook 如何處理 ...(對 MS 較不懂)

清仔

  • 活潑的大學生
  • ***
  • 文章數: 298
    • 檢視個人資料
引述: "abelyang"
引用
是否aaaa是密碼, 現在希望加密至Zx字頭的編碼, crypt("aaaa","Zx"), 編碼後得出Zxjkfjdifl, 意思是這樣嗎?

是的,意思是這樣沒有錯
但是 Zx....那一段我是隨便打的不是 aaaa 真正的 crypt 值
我僅是舉例而以

引用
但是在outlook express裏輸入aaaa還是說密碼錯誤

這個問題我不了解你的操作過程無法解釋...
也不知道 Outlook 如何處理 ...(對 MS 較不懂)

thank you

清仔

  • 活潑的大學生
  • ***
  • 文章數: 298
    • 檢視個人資料
請大家指教, 為何會密碼錯誤

清仔

  • 活潑的大學生
  • ***
  • 文章數: 298
    • 檢視個人資料
請問如何restart courier-imap