加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 23:24:39 所属栏目:百科 来源:网络整理
导读:我正在创建一个支持数据库的电子邮件审核系统,以便我可以跟踪电子邮件.棘手的部分是我希望能够通过邮件程序类组织这些并且还能够存储邮件程序方法的名称. 创建邮件拦截器或观察者从Mail :: Message实例收集数据并不困难,但我很好奇是否有办法捕获创建该邮件
我正在创建一个支持数据库的电子邮件审核系统,以便我可以跟踪电子邮件.棘手的部分是我希望能够通过邮件程序类组织这些并且还能够存储邮件程序方法的名称.

创建邮件拦截器或观察者从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)

思考?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读