我正在尝试实现一个系统,其中大型(或小型)人群的电子邮件被安排由cron作业(而不是循环,而用户正在等待他们完成发送)。< / p>
用户可以发送两种类型的电子邮件:向订阅者表中的所有人发送电子邮件,或仅向群组成员发送电子邮件。我想我真的不需要将电子邮件包含在群组成员中,因为它们将是发送给小组的电子邮件,而不是大型(所有订阅者)组。
我正在试图弄清楚如何构建我的数据库以便它有意义,但我很难解释它应该如何工作。
您对这类可以分享的事情有什么经验吗?我应该如何构建我的数据库以跟踪等待交付的电子邮件?
答案 0 :(得分: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 中的条目排入群组电子邮件。您应该创建一个“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();
您需要确保在使用结果集后删除结果集,因为您没有发送重复的电子邮件条目。如果您希望保留已发送电子邮件的日志,只需添加另一个TINYINT(1) UNSIGNED
字段,指明sent_email = 1
并修复您的SELECT
查询,只有在值为0时才能获取结果。
答案 1 :(得分:0)
使用联接表将待处理的电子邮件链接到用户。使用其他联接表来管理组。当电子邮件发往一个组时,可以使用存储过程使用该组中所有成员的ID填充EmailRecipients表。
表:
PendingEmails
ID
Subject
Body
EmailRecipients (join table)
EmailID
UserID
Users
ID
Groups (join table)
GroupID
UserID