📜  Deliver_later 不在 Rails 的 sidekiq 中发送邮件 - Ruby (1)

📅  最后修改于: 2023-12-03 15:14:40.002000             🧑  作者: Mango

Deliver_later 不在 Rails 的 sidekiq 中发送邮件 - Ruby

ActionMailer 是 Ruby on Rails 中的邮件发送组件,它提供了一个 deliver_later 方法来异步发送邮件,并且支持不同的后台任务队列,比如 Redis,Sidekiq 等等。但是,在不使用 Rails 的情况下,如何使用 deliver_later 发送邮件呢?

Ruby 的异步任务和后台队列

Ruby 中有不少后台任务队列的实现,包括 Resque、Sidekiq、DelayedJob 等等,它们都可以用来处理耗时的任务,比如邮件发送、图片处理等等,从而不阻塞主线程。这里以 Sidekiq 为例介绍一下如何使用它来异步发送邮件。

安装 Sidekiq

首先需要安装 Sidekiq,可以通过下面的命令来安装:

gem install sidekiq
Sidekiq 的配置

配置文件通常存放在 config/sidekiq.yml 中。示例配置如下:

:concurrency: 5
:verbose: false

:queues:        
  - mailers

:redis:
  :host: localhost
  :port: 6379
  :namespace: myapp

其中 :queues 定义了任务队列的名称,这里只有一个 mailers,表示用来处理邮件发送的任务。

编写异步任务类

在 Rails 中,邮件发送任务通常由 ActionMailer 处理。而在不使用 Rails 的情况下,可以通过 Sidekiq::Worker 来定义异步任务类。首先需要安装 actionmailer,可以通过下面的命令来安装:

gem install actionmailer

异步任务类通常存放在 app/workers 目录下,这里创建一个 app/workers/mail_worker.rb 文件,代码如下:

require 'sidekiq'
require 'action_mailer'

Sidekiq.configure_server do |config|
  config.redis = { url: 'redis://localhost:6379/0', namespace: 'myapp' }
end

class MailWorker
  include Sidekiq::Worker

  def perform(recipient, subject, body)
    ActionMailer::Base.mail(to: recipient, subject: subject, body: body).deliver_now
  end
end

这里使用了 Sidekiq.configure_server 来配置 Sidekiq 的 Redis 连接。class MailWorker 定义了 perform 方法,它接受邮件的收件人、主题、正文内容作为参数,在方法内部调用 ActionMailer::Base.mail 方法来发送邮件,并调用 deliver_now 方法来立即发送邮件。

发送邮件任务

现在可以在应用中发起异步邮件发送任务了。这里创建一个 test.rb 文件,代码如下:

require 'action_mailer'
require_relative 'app/workers/mail_worker'

ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
  address:              'smtp.gmail.com',
  port:                 587,
  user_name:            'username@gmail.com',
  password:             'password',
  authentication:       'plain',
  enable_starttls_auto: true
}

MailWorker.perform_async('recipient@example.com', 'Test subject', 'Test body')

这里配置了 Gmail 的 SMTP 设置,并在最后一行调用 MailWorker.perform_async 方法来发起异步邮件发送任务。perform_async 方法会将任务放入 mailers 队列中,等待后台任务队列来处理。

启动 Sidekiq

最后,需要启动 Sidekiq 来处理任务队列中的任务。可以通过下面的命令来启动:

bundle exec sidekiq -C config/sidekiq.yml -r ./test.rb

其中 -C 参数指定 Sidekiq 的配置文件,-r 参数指定启动文件,这里指定为 test.rb

现在就可以在应用中异步发送邮件了。当调用 MailWorker.perform_async 方法时,会将任务放入 mailers 队列中,等待 Sidekiq 来处理,这样就不会阻塞主线程。而 Sidekiq 会从 mailers 队列中取出任务并执行 MailWorker.perform 方法,从而异步发送邮件。

此外,还可以通过 Sidekiq 的 Web 界面来监控任务队列的状态,以及查看任务的执行情况。

这就是如何在不使用 Rails 的情况下,使用 Sidekiq 来异步发送邮件。