簡體   English   中英

在 ActionMailer 中暫停發送電子郵件

[英]Suspend sending emails in ActionMailer

在我的 Rails 應用程序中,我想暫時停止為特定用戶發送電子郵件(例如,當我因配額而被退回時),直到用戶確認他能夠再次接收電子郵件。

我有一個適用於所有郵件程序類的通用超類。 在那里,我總是在發送郵件之前調用方法setup_email

呼叫@user.mail_suspended?的最佳地點在@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

我通過將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 

我嘗試了很多方法,但沒有人能幫助我,除了這個。

class ApplicationMailer < ActionMailer::Base
  class AbortDeliveryError < StandardError; end

  before_action :ensure_notifications_enabled
  rescue_from AbortDeliveryError, with: -> {}

  def ensure_notifications_enabled
    raise AbortDeliveryError.new unless <your_condition>
  end

  ...

end
  1. 使用standardError繼承一個類以引發異常。
  2. 檢查條件,如果為假則引發異常。
  3. 使用空的 lambda 處理該異常。

空的 lambda 會導致 Rails 6 只返回一個 ActionMailer::Base::NullMail 實例,該實例不會被傳遞(就像您的郵件程序方法沒有調用郵件或過早返回一樣)。

我不會普遍地設置 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM