То, что вы хотите реализовать, - это базовая очередь, использующая ваш уровень хранения.
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.