您希望实现的是使用存储层的基本队列。
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 时获取结果。