2009-12-20 51 views
0

我試圖實現一個系統,通過cron作業(而不是在循環中,而用戶正在等待它們完成發送時)計劃將大量(或小)人羣發送到電子郵件。數據庫結構問題...計劃發送的電子郵件?

用戶可以發送兩種類型的電子郵件:向訂戶表中的每個人發送電子郵件,或者僅向組中的成員發送電子郵件。我想我並不需要將這封電子郵件包含給小組成員,因爲他們會將電子郵件發送給小組而不是大(全部用戶)小組。

我想弄清楚如何構建我的數據庫,所以它是有道理的,但我很難解釋它應該如何工作。

你有什麼經驗可以分享這種東西嗎?我應該如何構建數據庫以跟蹤等待交付的電子郵件?

+0

標題寫着「調度」,但我讀的是關於支持1+收件人。請記住,電子郵件服務器可以對電子郵件進行排隊,並且只能以指定的時間間隔發送。 – 2009-12-20 17:39:41

回答

0

使用聯接表將未決電子郵件鏈接到用戶。使用另一個連接表來管理組。當電子郵件發往某個組時,可以使用存儲過程來使用組中所有成員的ID填充EmailRecipients表。

表:

PendingEmails 
    ID 
    Subject 
    Body 

EmailRecipients (join table) 
    EmailID 
    UserID 

Users 
    ID 

Groups (join table) 
    GroupID 
    UserID 
3

你想實現什麼是您使用的存儲層上的基本隊列。

User (
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    email VARCHAR(125) NOT NULL 
); 

User_Group (
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    user_id INTEGER UNSIGNED NOT NULL, 
    group_id INTEGER UNSIGNED NOT NULL 
); 

Group (
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(75) NOT NULL, 
    description VARCHAR(255) 
) 

MailingList (
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    user_id INTEGER UNSIGNED NOT NULL, 

); 

# mails to be sent out to groups/all 
MailQueue (
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    group_id INTEGER UNSIGNED, 
    time_to_send DATETIME DEFAULT CURRENT_TIMESTAMP 
); 

你會排隊組電子郵件與有效的UNIX時間戳進入在MailQueue條目。您應該創建一個「全部」組,您將分配每個用戶,以便您仍然可以正確使用這些表。你會執行您的Cron查詢像這樣:

SELECT User.email 
FROM MailQueue 
INNER JOIN User_Group ON (MailQueue.group_id = User_Group.id) 
INNER JOIN User ON (User_Group.user_id = User.id) 
WHERE MailQueue.time_to_send < NOW(); 

你需要確保你刪除的結果集你作爲你不向其發送重複的電子郵件條目之後他們。如果你想保留日誌發送的電子郵件,只需添加另一個TINYINT(1) UNSIGNED字段,表示sent_email = 1並解決您SELECT查詢只搶的結果,如果值是0