数据库结构问题......计划发送的电子邮件?

时间:2009-12-20 12:55:22

标签: database-design email cron mail-queue

我正在尝试实现一个系统,其中大型(或小型)人群的电子邮件被安排由cron作业(而不是循环,而用户正在等待他们完成发送)。< / p>

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

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

您对这类可以分享的事情有什么经验吗?我应该如何构建我的数据库以跟踪等待交付的电子邮件?

2 个答案:

答案 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