2016-11-01 7 views
0

私は電子メールアドレスに電子メールを送信する私のアプリケーションで "電子メールを送信"機能を持っています。Railsで日付時刻に基づいて電子メールを送信する方法は?

新しい機能が追加され、ユーザーが[後でメールを送信]ラジオボタンをオンにしたときに日付と時刻が選択され、メール送信ボタンがクリックされると特定の時刻にメールが送信されます。 このために、 "send_reports_at"列のデータベースにフィールドを追加し、コントローラと必要なアクションに追加しました。

日付時刻は、「2016-11-01 16:15」として保存されます。

私のアプリケーションの日付時刻に基づいて電子メールを送信する条件を追加するにはどうすればよいですか? 助けてください。

これが私の見解です:

<%= f.input :additional_emails, :label => false, :input_html => {:id => 'sponge_contacts', :placeholder => 'Separate emails by comma', :class => 'deliver_page_email', :type => 'text', :rows => 2, :style=> 'width:300px; border-color:#ccc; font-size:13px; padding:10px 0 0 10px; width: 295px; height: 110px; resize: none;'} %> 
<input type="radio" id="send_email_0" name="send_email" value="now" checked> Send email now<br> 
<input type="radio" id="send_email_1" name="send_email" value="later"> Send email later<br> 

    <%= f.input :send_reports_at,:label => false, :input_html => {:placeholder => 'Click here to select date and times', :class => 'deliver_page_email', :type => 'text', :rows => 2} %> 
    <% content_for :javascript do %> 
     <script type="text/javascript"> 
      $(function() { 
    $("#report_send_reports_at").datepicker(); 
    }); 

      $(document).ready(function() { 
       $("#report_send_reports_at").hide(); 

       $("#send_email_0, #send_email_1").bind('change click',function(){ 
        toggleResult(); 
       }); 

      }); 
      function toggleResult(){ 
       result = $("[name='send_email']:checked").val(); 
       if(result == "later"){ 
        $("#report_send_reports_at").show(); 
       }else{ 
        $("#report_send_reports_at").hide(); 
       } 
      } 

     </script> 
    <% end %> 
<% end %> 

<%= link_to "Send Now", '#', :class => "pink_button _round_5", :id => 'send_now_button' %> 

これは私のコントローラのメソッドです:

def send_report_email 
    send_to_agents = params.has_key?("send_to_agents") && params["send_to_agents"] == "true" 
    if @report.photos.empty? 
     Screenshot.delay.new(@user.id, @report.id, Rails.application.config.custom.indicator_screenshot_bucket) 
    else 
     Screenshot.delay.new(@user.id, @report.id, "photo_screenshots") 
    end 
    Screenshot.delay.new(@user.id, @report.id, Rails.application.config.custom.report_screenshot_bucket) 
    if @report.update_attributes(params[:report]) 
     set_photo_position(false) 
     @report.save 
     if send_to_agents 
     @report.update_attribute(:duplicable, true) 
     @good_emails, @bad_emails, @unsubscribed_emails = @user.account.users.map(&:email), [], [] 
     else 
     @good_emails, @bad_emails, @unsubscribed_emails = filter_emails(@report.additional_emails) 
     @user.delay.add_new_contacts(@good_emails) 
     end 
     @good_emails.each do |email| 
     send_to_agents == true ? ReportMailer.delay.additional_emails(email, @user, @report, "A new report is available: #{@report.title}") : ReportMailer.delay.additional_emails(email, @user, @report) 
     end 
     ReportMailer.delay.report_sent(@user, @report, @good_emails, @bad_emails, @unsubscribed_emails) 
    end 

    respond_to do |format| 
     format.json { render :json => { :success => true, :report_id => @report.id, :redirect => user_reports_url(current_user), :notice => 'Report was successfully sent!' } } 
    end 

    end 

答えて

1

あなたはその電子メールのすべてを送信機能(ReportMailerためのインスタンスのクラスメソッド)を書くことができます予定時刻が一致するか、現在時刻よりも小さい場合は、cronジョブをrails runnerに設定して、必要なだけ頻繁にその機能を実行してください。

関連する問題