使用站点更新Ruby on Rails向帐户用户发送每日电子邮件

时间:2011-08-13 23:20:33

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

我正在尝试在我的应用中设置一些内容,每天向所有用户发送电子邮件,每天都会为其帐户创建新闻帖。

我已经完成了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>

再次感谢!

1 个答案:

答案 0 :(得分:11)

这将是以下内容(如果没有代码,则无法获得具体内容):

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

 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)来设置查看。