【问题标题】:Sending automated mails发送自动邮件
【发布时间】:2012-04-10 11:35:35
【问题描述】:

我目前正在开发一个基于 ruby​​ on rails 的项目。该网站的一个特殊功能包括通过邮件及时发送通知,其中包含网站上发布的所有帖子的摘要。邮件的发送默认间隔为 30 天。因此,每个用户在不同的日子收到一封邮件,这取决于他的注册日期以及最后一封发送的新闻信件的日期,这是与用户相关的数据之一。

但现在我正在考虑向时事通讯添加设置,以便用户可以配置他想要获取时事通讯的时间间隔。因此,我不想根据最后一封新闻信的发送日期发送新闻通讯,而是想在每月的特定日期将新闻通讯发送给所有用户。

例如,如果用户希望每周收到一份时事通讯,它将在每周的每个星期日发送。每月的时事通讯将在每个月的 1 日发送,依此类推。

我想到的一种方法是创建一个用于发送时事通讯的基类,然后为每月、每周...等创建子类,以利用 ruby​​ 的面向对象特性。但我不确定这是否是解决问题的最佳方法。

我想知道是否有其他方法可以解决这个问题。我不需要 ruby​​ on rails 解决方法,任何有使用任何其他编程语言解决此问题的经验的人都可能会有所帮助。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 email


    【解决方案1】:

    这是一个设计问题,可能归结为将调度行为分解为多个类是否会变得更麻烦。您将避免使用 case 语句,这表明可以使用多态性。

    但是,如果您选择使用单独的类,那么现在是实现类型字段的 ActiveRecord 的好时机。每个订阅者都属于一个时间表。 (我建议安排一个订阅者。)

    时间表表将有一个类型字段,其中包含类的名称。您不必设置类型。相反,要存储计划,请使用订阅者对象的关联创建计划对象,ActiveRecord 将设置类型字段。

    现在,每当您从数据库中获取计划对象时,它将是类型字段中指定的类。您可以为一周中的某一天设置一个班级,为月份中的日期设置一个不同的班级,以及根据不同的日期计算行为设置许多不同的班级。

    请务必存储下一个到期电子邮件日期。这应该在 schedules 表中,但如果这样更方便,您可以将其放在subscribers 表中。

    使用一种方法来计算下一个到期日。确保该方法在所有类中具有相同的签名。因此,对于每月计划,将月份的日期存储在表中,不要将月份的日期传递给常用方法。这样,交付代码可以调用该方法来更新到期日期,而无需了解任何有关调度算法或数据的信息。

    【讨论】:

    • 不幸的是,我正在使用 mongoid,所以 activerecord 实现对我没有好处。
    • 我没有看到保存下一封电子邮件到期日的意义。因为我计划根据用户的设置在一周中的特定日期或一个月中的特定日期向每个用户发送电子邮件
    • 保存下一个交货日期的价值是用于确定是否应发送时事通讯的代码。它可能每天运行,需要轻松确定哪些订阅者今天需要获取新闻通讯,哪些不需要。
    • 让我说更多,现在我阅读了您对另一个答案的评论。如果您曾经制定过每 10 天发送一次时事通讯的政策,您将需要存储上一个时事通讯的发送时间,因此在这种情况下,存储下一个时事通讯日期而不是最后一个时事通讯的发送时间不会产生额外开销。好的,不是每个月的 10 日或每个星期三的情况,但最好表示确定是否以标准格式发送时事通讯所需的信息,而不管策略类型如何,这可以通过查询来确定数据库。
    • 是的...我昨天花了很多时间寻找解决此问题的最佳方法...我发现与其保存日期,不如保存首选项,因为我们必须这样做当用户更改他对新闻信函的偏好时,请不断更改日期。现在,时事通讯会在一周或一个月的每一天发送,具体取决于用户的偏好。
    【解决方案2】:

    我不觉得每月/每天/每周的电子邮件不同到足以值得不同的课程。就我个人而言,我处理此问题的方法是存储用户所需的邮寄频率,然后存储用户的下一个电子邮件日期。

    找出今天需要电子邮件的人只是在下一个电子邮件截止日期之前选择用户(如果您为该列编制索引,这将很快)。当您发送电子邮件时,将列更新为今天 + 适当的偏移量。如果用户在那里更改偏好,则重新计算他​​们的下一个电子邮件日期。您可以通过记录每次向用户发送时事通讯(由于其他原因可能是有趣的数据)或通过在用户表上维护上一个电子邮件日期和下一个电子邮件日期来做到这一点。

    【讨论】:

    • 问题是目前在网站上的用户数是10k+并且还在增长,所以我认为最好避免存储可以在运行时计算的数据。在这里,我正在考虑数据开销、代码维护和时间等因素。所以基本上我希望代码在没有很多条件的情况下保持可读性,而不必在数据库中存储额外的信息
    • 假设您有 100 万用户。您要做的最后一件事是加载所有这些用户并评估一些 ruby​​ 代码,以确定他们今天是否收到并发送电子邮件。另一方面,通过索引列值选择用户会很快。显然取决于你。
    • 提供的解决方案很好。但我认为保留下一个发送日期将是开销信息,因为我已经在为用户存储设置。所以我可以根据他们保存的设置加载用户。
    猜你喜欢
    • 2011-10-22
    • 2013-08-22
    • 2013-01-28
    • 2017-03-08
    • 1970-01-01
    • 2013-10-31
    • 2014-01-15
    • 2013-02-05
    相关资源
    最近更新 更多