【问题标题】:Sending account users daily e-mails with site updates Ruby on Rails每天向帐户用户发送包含站点更新的电子邮件 Ruby on Rails
【发布时间】:2011-10-26 14:29:09
【问题描述】:

我正在尝试在我的应用程序中进行设置,每天向所有用户发送一封电子邮件,其中包含每天为其帐户创建的新闻帖子。

我已经设置了 CRON 任务,但我对 ActionMailer 的了解还不够,无法弄清楚如何向每个用户发送特定信息...

在我的应用中,用户属于账户,账户有很多用户,用户有很多想法,账户通过用户有很多想法。

如果帐户 1 有 3 个用户,我希望所有三个用户每天都通过电子邮件收到最后一天的新想法。

我知道这很复杂,但如果有人能提供一个起点,我们将不胜感激。

干杯

已编辑以包含模型中的代码:

    class Account < ActiveRecord::Base
    has_many :users
    has_many :ideas, :through => :users

    class User < ActiveRecord::Base
    belongs_to :account
    has_many :ideas, :dependent => :destroy

我基本上想通过每日电子邮件将索引页面中的这个提要发送给每个用户:

    <strong>Here are some of your colleagues recent ideas:</strong>
    <% @ideas.each do |idea| %> #@ideas = Account.ideas
    <% if idea.created_at > 4.hours.ago %>
    <table class="microposts" summary="User microposts">
    <tr>
    <td class="micropost">
<span class="ideatitle"><%= idea.title %></span><br />
<span class="ideacontent"><%= idea.content %></span>
    <span class="timestamp">
    Conceived <%= time_ago_in_words(idea.created_at) %> ago.
    </span>
    </td>
    <td>

再次感谢!

【问题讨论】:

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


    【解决方案1】:

    如下(没有代码无法具体说明):

    daily.rake - 每天通过cron 调用您的 rake 任务

     namespace :daily do
       desc "run daily tasks"
       task :daily, :needs => :environment do
         Account.each do |account|
           account.users.each do |user|
           UserMailer.deliver_daily_email(user)
         end
       end
     end
    

    user_mailer.rb - 用于发送实际电子邮件的操作邮件

     UserMailer < ActiveMailer::Base
       def daily_email(user)
         @recipients  = "#{user.email}"
         @from        = "my@email"
         headers         "Reply-to" => "my@email"
         @subject     = "Your daily message"
         @sent_on     = Time.now
    
         @body[:user] = user
       end
     end
    

    daily_email.text.html.erb - 邮件的实际内容

     <h2>Hi <%=h @user.name %></h2>
     You like:
     <ul>
       <% @user.account.ideas.each do |idea| %>
         <li><%=h idea.title %></li>
       <% end %>
     </ul>
    
     -sincerely, the mailer server
    

    希望这能让您很好地了解应该如何配置这一切。让我知道这里是否有任何令人困惑的地方。享受吧!

    [编辑]

    正如下面 Josh Pinter 所指出的,您可能只想向用户发送新想法(或者在过去 24 小时内创建,或者跟踪用户看到的想法并从电子邮件中排除这些想法)。您可以通过 idea.rb 中的范围来执行此操作

    scope :recent, -> { where("created_at < ", 1.day.ago) }
    

    # Note, you'll need to create and maintain a `viewed_at` column
    scope :unviewed, -> { where(viewed_at: nil) }
    

    然后,对于每个用户,你可以检查

    ideas = user.ideas.recent.any? 并且仅在有recentunviewed 想法时发送电子邮件。发送电子邮件后,您可以通过运行ideas.update_all(viewed_at: Time.now) 设置查看位置。

    【讨论】:

    • 这是一个很好的开始,谢谢。我想我只是对如何将帐户中的所有想法发送给每个用户感到困惑。以上不只是向每个用户发送他们自己的想法吗?
    • 我对您的具体结构感到困惑users have many ideas and accounts have many ideas through users,这是否意味着用户有想法,而不是帐户。你能发布你的activemodel记录吗,这会更明显:)
    • 非常感谢大家。你真的在这件事上救了我。已经好几天了,我有点碰壁了,因为 ActionMailer 对我来说是全新的。
    • 可能想要添加一个过滤器以仅包含在过去 24 小时内创建的想法,或其他任何内容,例如 @user.account.ideas.where( "created_at &gt;= ?", Time.now - 24.hours ).each do |idea|
    猜你喜欢
    • 2015-09-21
    • 2012-04-27
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多