0

我正在尝试实现一个系统,在该系统中,发送给大(或小)群体的电子邮件被安排通过 cron 作业(而不是循环发送,而用户正在等待他们完成发送)。

用户可以发送两种类型的电子邮件:发送给订阅者表中的每个人的电子邮件,或者只发送给组成员的电子邮件。我想我真的不需要包含发送给组成员的电子邮件,因为它们将是发送给小组而不是大型(所有订阅者)组的电子邮件。

我试图弄清楚如何构建我的数据库以使其有意义,但我什至很难解释它应该如何工作。

你有这种事情的经验可以分享吗?我应该如何构建我的数据库来跟踪等待发送的电子邮件?

4

2 回答 2

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
);

您将排队组电子邮件在MailQueue中输入具有有效 unix 时间戳的条目。您应该创建一个组“所有”,您将分配给每个用户,以便您仍然可以正确使用这些表。你会像这样运行你的 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 时获取结果。

于 2009-12-20T13:50:59.413 回答
0

使用连接表将待处理的电子邮件链接到用户。使用另一个联接表来管理组。当电子邮件发往某个组时,可以使用存储过程将组中所有成员的 ID 填充到 EmailRecipients 表中。

表:

PendingEmails
  ID
  Subject
  Body

EmailRecipients (join table)
  EmailID
  UserID

Users
  ID

Groups  (join table)
  GroupID
  UserID
于 2009-12-20T13:13:44.730 回答