- 論壇徽章:
- 0
|
我測(cè)試一個(gè) zimbra mail server 他用的資料庫(kù)是 mysql 5.0
他有一些機(jī)制是不錯(cuò)的 只是沒(méi)有整合起來(lái) 因此突發(fā)其想 做了一個(gè) 可以知道 發(fā)件者 發(fā)給對(duì)方的 mail 之 讀取 轉(zhuǎn)寄 刪除狀態(tài)
原始構(gòu)想
原來(lái)的 zimbra schema 內(nèi)有一個(gè) mailbox table 他記錄了 user 的 id
user 的mail box 都開(kāi)另一個(gè) schema 為 mboxgroup[id] 來(lái)存放
當(dāng)有新mail發(fā)送及進(jìn)來(lái)時(shí) 皆會(huì)有一個(gè) table 來(lái)存放 該table 是 mail_item
所以 我就 以這些方式 用 trigger 來(lái)取得一些資訊 放入另一個(gè) schema mailstat 之 mailstatus內(nèi)
這樣子 就可以知道 每一封寄出的mail 在 mail server 內(nèi) 的status
不過(guò) 我一個(gè)對(duì)一個(gè)寄是 ok的 但是 一個(gè)對(duì)多個(gè)寄 只會(huì)第一個(gè)有效 其他的都不會(huì)寄進(jìn)去(因?yàn)閠rigger寫(xiě)的爛 無(wú)法 split)
想請(qǐng)問(wèn) 我在 trigger 內(nèi) 要如何 將 mboxgroup[id].mail_item.metadat 內(nèi)的 資料如
d1:f0:1:s27:kscg <test2@test.tw>1:t20:admin@test.tw1:vi10ee
分出來(lái)兩比 各自 insert 進(jìn) mailstat.mailstatus.to 內(nèi)
kscg <test2@test.tw> 一筆
admin@test.tw 一筆
因?yàn)?目前只有 一筆觸發(fā) 新增一個(gè)row 所以後面更新 只有 用 subject 來(lái)模糊判斷
我原始 trigger 如下 (每個(gè) schema 都會(huì)建立一組)
發(fā)送時(shí)間 ==> send_datetime
如收件者何時(shí)收到信件 ==> get_datetime
收件者何時(shí)開(kāi)啟閱讀 ==> read_datetime
收件者何時(shí)收件者何時(shí)刪除 ==> delete_dattetime
收件者何時(shí)轉(zhuǎn)寄 ==> forward_datetime
發(fā)送者 id send_mailbox_id
發(fā)送者 郵件編號(hào) send_id
收件者 id ==> get_mailbox_id
收件者 郵件編號(hào) ==> get_id
發(fā)送者 mail ==> sender
發(fā)送主旨 subject ==> subject
說(shuō)明:
*_datetime 有時(shí)間的表示已經(jīng)完成的
CREATE TABLE `mailstatus` (
`ID_INDEX` MEDIUMINT NOT NULL AUTO_INCREMENT,
`send_datetime` DATETIME,
`get_datetime` DATETIME,
`read_datetime` DATETIME,
`delete_datetime` DATETIME,
`forward_datetime` DATETIME,
`send_mailbox_id` INTEGER,
`send_id` INTEGER,
`get_mailbox_id` INTEGER,
`get_id` INTEGER,
`sender` VARCHAR(128),
`to` VARCHAR(128),
`subject` TEXT,
PRIMARY KEY (ID_INDEX)
);
#Release Version 1.0.0.0
DROP TRIGGER mailsend_get
DROP TRIGGER mailread_forward
DROP TRIGGER maildelete
#mail 發(fā)送及收件者收到
CREATE TRIGGER `mailsend_get` AFTER INSERT ON `mail_item`
FOR EACH ROW BEGIN
IF NEW.`flags` = 1 THEN
INSERT INTO `mailstat`.`mailstatus` SET `send_mailbox_id`=NEW.`mailbox_id`,`send_id`=NEW.`id`,`send_datetime`=date_format(now(),'%Y-%m-%d %H-%i-%S'),`sender`=NEW.`sender`,`subject`=NEW.`subject`;
END IF;
IF NEW.`flags` = 0 THEN
UPDATE `mailstat`.`mailstatus` SET `get_datetime` = date_format(now(),'%Y-%m-%d %H-%i-%S'),`get_mailbox_id`=NEW.`mailbox_id`,`get_id`=NEW.`id` WHERE `mailstatus`.`subject` like NEW.`subject` AND `mailstatus`.`sender`=NEW.`sender`;
END IF;
END;
#收件者讀取及轉(zhuǎn)寄
CREATE TRIGGER `mailread_forward` AFTER UPDATE ON `mail_item`
FOR EACH ROW
BEGIN
IF NEW.`unread` = 0 THEN
UPDATE `mailstat`.`mailstatus` SET `mailstatus`.`read_datetime` = date_format(now(),'%Y-%m-%d %H-%i-%S') WHERE `mailstatus`.`get_mailbox_id`=NEW.`mailbox_id` AND `mailstatus`.`get_id`=NEW.`id`;
ELSE
IF NEW.`flags` = 8 THEN
UPDATE `mailstat`.`mailstatus` SET `mailstatus`.`forward_datetime` = date_format(now(),'%Y-%m-%d %H-%i-%S') WHERE `mailstatus`.`get_mailbox_id`=NEW.`mailbox_id` AND `mailstatus`.`get_id`=NEW.`id`;
END IF;
END IF;
END;
#收件者刪除信件(在垃圾桶不算刪除 因?yàn)樾旁诶把e 完全刪除才是刪除因?yàn)橥耆珱](méi)有資料)
CREATE TRIGGER `maildelete` AFTER DELETE ON `mail_item`
FOR EACH ROW UPDATE `mailstat`.`mailstatus` SET `mailstatus`.`delete_datetime` = date_format(now(),'%Y-%m-%d %H-%i-%S') WHERE `mailstatus`.`get_mailbox_id`=OLD.`mailbox_id` AND `mailstatus`.`get_id`=OLD.`id`;
希望大家有興趣的一起研究
附檔是 實(shí)際運(yùn)行 後的 一對(duì)一ok的 一對(duì)多是不ok的 因?yàn)?trigger 只inser 一筆 如果能多筆的話就可以搞定了 (範(fàn)例的to因?yàn)楫?dāng)時(shí)沒(méi)有找到 如何用 所以 沒(méi)有用)
多謝各為大大了 以後 大家用postfix+mysql的 應(yīng)該很好用 因?yàn)?這是未來(lái) mail 的一種新趨勢(shì) 可以知道 mail 的status狀態(tài)(這個(gè)機(jī)制目前只有 novell groupwise有 其他mail server都沒(méi)有)
[[i] 本帖最后由 ieting 于 2007-11-20 18:22 編輯 [/i]] |
|