我正在尝试实现一个系统,在这个系统中,发送给大量(或少量)人员的电子邮件计划由cron作业发送(而不是在循环中,当用户等待他们完成发送时)。
用户可以发送两种类型的电子邮件:向订阅者表中的每个人发送电子邮件,或仅向组中的成员发送电子邮件。我想我真的不需要包括发送给组成员的电子邮件,因为它们将是发送给小组的电子邮件,而不是大型(所有订阅者)组的电子邮件。
我正在试图弄清楚如何构建我的数据库,以便它有意义,但我甚至很难解释它应该如何工作。
你有没有这方面的经验可以分享?我应该如何组织我的数据库,以跟踪正在等待传递的电子邮件?
发布于 2009-12-20 21:50:59
您希望实现的是一个利用存储层的基本队列。
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
);您需要在MailQueue中输入具有有效unix时间戳的条目,才能将组电子邮件排入队列。您应该创建一个“All”组,您将把每个用户都分配到这个组中,这样您仍然可以正确地使用这些表。您可以像这样运行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();您需要确保在使用结果集之后将其删除,因为您没有这样做,这将导致发送重复的电子邮件条目。如果您希望保留已发送电子邮件的日志,只需添加另一个指示sent_email = 1的TINYINT(1) UNSIGNED字段,并修复您的SELECT查询,以便仅在值为0时获取结果。
发布于 2009-12-20 21:13:45
使用连接表将挂起的电子邮件链接到用户。使用另一个联接表来管理组。当电子邮件发往某个组时,可以使用存储过程用该组中所有成员的in填充EmailRecipients表。
表:
PendingEmails
ID
Subject
Body
EmailRecipients (join table)
EmailID
UserID
Users
ID
Groups (join table)
GroupID
UserIDhttps://stackoverflow.com/questions/1935761
复制相似问题