Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 数据库结构问题…计划发送的电子邮件?_Database Design_Email_Cron_Mail Queue - Fatal编程技术网

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

Database design 数据库结构问题…计划发送的电子邮件?,database-design,email,cron,mail-queue,Database Design,Email,Cron,Mail Queue,我正在尝试实现一个系统,在该系统中,发送给大(或小)人群的电子邮件将通过cron作业(而不是在用户等待他们完成发送的过程中以循环方式)进行发送 用户可以发送两种类型的电子邮件:发送给订阅者表中的所有人的电子邮件,或仅发送给组成员的电子邮件。我想我真的不需要包括发送给小组成员的电子邮件,因为它们是发送给小团体的电子邮件,而不是发送给大(所有订户)团体的电子邮件 我试图弄清楚如何构造数据库,使其有意义,但我甚至很难解释它应该如何工作 你对这类事情有什么经验可以分享吗?我应该如何构建数据库以跟踪等待发

我正在尝试实现一个系统,在该系统中,发送给大(或小)人群的电子邮件将通过cron作业(而不是在用户等待他们完成发送的过程中以循环方式)进行发送

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

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


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

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

表:

PendingEmails
  ID
  Subject
  Body

EmailRecipients (join table)
  EmailID
  UserID

Users
  ID

Groups  (join table)
  GroupID
  UserID

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

表:

PendingEmails
  ID
  Subject
  Body

EmailRecipients (join table)
  EmailID
  UserID

Users
  ID

Groups  (join table)
  GroupID
  UserID

您希望实现的是利用存储层的基本队列

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时间戳在邮件队列中输入条目,将组电子邮件排队。您应该创建一个组“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();
选择User.email
从邮件队列
上的内部加入用户组(MailQueue.Group\u id=User\u Group.id)
上的内部联接用户(User\u Group.User\u id=User.id)
WHERE MailQueue.time_to_send

您需要确保在使用结果集后将其删除,因为您不需要发送重复的电子邮件条目。如果您希望保留已发送电子邮件的日志,只需添加另一个
TINYINT(1)UNSIGNED
字段,指示
sent\u email=1
,并修复
SELECT
查询,仅在值为0时获取结果。

您希望实现的是利用存储层的基本队列

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时间戳在邮件队列中输入条目,将组电子邮件排队。您应该创建一个组“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();
选择User.email
从邮件队列
上的内部加入用户组(MailQueue.Group\u id=User\u Group.id)
上的内部联接用户(User\u Group.User\u id=User.id)
WHERE MailQueue.time_to_send
您需要确保在使用结果集后将其删除,因为您不需要发送重复的电子邮件条目。如果您希望保留已发送电子邮件的日志,只需添加另一个
TINYINT(1)UNSIGNED
字段,指示
sent\u email=1
,并修复
SELECT
查询,仅在值为0时获取结果。

标题上写着“计划”,但我读到的是关于支持1+个收件人的内容。请记住,电子邮件服务器可以对电子邮件进行排队,并且只能按指定的时间间隔发送。标题上写着“计划”,但我读到的只是关于支持1+个收件人的内容。请记住,电子邮件服务器可以对电子邮件进行排队,并且只能按指定的时间间隔发送电子邮件。