ruby-on-rails – 在rails发送电子邮件后存储邮件程序类和方法

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 在rails发送电子邮件后存储邮件程序类和方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在创建一个支持数据库的电子邮件审核系统,以便我可以跟踪电子邮件.棘手的部分是我希望能够通过邮件程序类组织这些并且还能够存储邮件程序方法名称.

创建邮件拦截器或观察者从Mail :: Message实例收集数据并不困难,但我很好奇是否有办法捕获创建该邮件实例的类和方法名称.

如果可能的话,我宁愿不使用回调.

有任何想法吗?

解决方法

这就是我最终要做的事情……我希望能够以这种方式对这种做法的利弊进行一些反馈.感觉有点难看,但很容易.基本上,我包括在我的邮件程序中使用回调的功能,将类和方法名称元数据附加到Mail :: Message对象,以便在我的观察者中可以访问它.我通过在Mail :: Message对象上设置实例变量,然后将attr_reader发送到Mail :: Message类来附加它,允许我调用mail.mailer_klass和mail.mailer_action.

我是这样做的,因为我想在邮件发送后记录它,所以我可以得到它发送的确切日期,并知道记录的电子邮件应该已成功发送.

邮件

class MyMailer < ActionMailer::Base
  default from: "noreply@theapp.com"

  include AbstractController::Callbacks

  # Where I attach the class and method
  after_action :attach_Metadata

  def welcome_note(user)
    @user = user

    mail(subject: "Thanks for signing up!",to: @user.email)
  end

  private

    def attach_Metadata
      mailer_klass = self.class.to_s
      mailer_action = self.action_name

      self.message.instance_variable_set(:@mailer_klass,mailer_klass)
      self.message.instance_variable_set(:@mailer_action,mailer_action)

      self.message.class.send(:attr_reader,:mailer_klass)
      self.message.class.send(:attr_reader,:mailer_action)
    end
end

观察员:

class MailAuditor

  def self.delivered_email(mail)
    if mail.multipart?
      body = mail.html_part.decoded
    else
      body = mail.body.raw_source
    end

    Email.create!(
      sender: mail.from,recipient: mail.to,bcc: mail.bcc,cc: mail.cc,subject: mail.subject,body: body,mailer_klass: mail.mailer_klass,mailer_action: mail.mailer_action,sent_at: mail.date
    )
  end
end

配置/初始化/ mail.rb

ActionMailer::Base.register_observer(MailAuditor)

思考?

原文链接:https://www.f2er.com/ruby/264768.html

猜你在找的Ruby相关文章