2

私の Rails アプリケーションでは、ユーザーが再びメールを受信できることを確認するまで、特定のユーザーへのメールの送信を一時的に停止したいと考えています (たとえば、クォータが原因でバウンスが発生した場合)。

すべてのメーラー クラスに共通のスーパークラスがあります。setup_emailメールを送信する前に、常にメソッドを呼び出します。

電話するのに最適な場所はどこ@user.mail_suspended?ですか?

Rails 2.3 を使用した簡単なサンプル アプリを次に示します。

# Common super class for all Mailers
class ApplicationMailer < ActionMailer::Base

  protected
    def setup_mail(user)
      @recipients = user.email
      @from = ...
    end
end

# Specific Mailer for User model
class UserMailer < ApplicationMailer

  def message(user, message)
    setup_mail(user)
    @subject = "You got new message"
    @body[:message] = message
  end
end

# Use the UserMailer to deliver some message
def MessagesController < ApplicationController

  def create
    @message = Message.new(params[:message])
    @message.save
    UserMailer.deliver_message(@message.user, @message)
    redirect_to ...
  end
end
4

3 に答える 3

2

ActionMailer::Base.perform_deliveriesをfalseに設定してこれを解決しました:

def setup_mail(user)
  email = user.default_email
  if email.paused?
    ActionMailer::Base.perform_deliveries = false
    logger.info "INFO: suspended mail for #{user.login} to #{email.email})"
  else
    ActionMailer::Base.perform_deliveries = true
  end
  # other stuff here
end 
于 2013-04-08T14:08:38.623 に答える
1

メッセージごとにのみ、perform_deliveries を普遍的に設定しません。

after_filter :do_not_send_if_old_email

def do_not_send_if_old_email
  message.perform_deliveries = false if email.paused?
  true
end
于 2014-08-11T22:38:20.700 に答える