📅  最后修改于: 2023-12-03 15:14:40.002000             🧑  作者: Mango
ActionMailer
是 Ruby on Rails 中的邮件发送组件,它提供了一个 deliver_later
方法来异步发送邮件,并且支持不同的后台任务队列,比如 Redis,Sidekiq 等等。但是,在不使用 Rails 的情况下,如何使用 deliver_later
发送邮件呢?
Ruby 中有不少后台任务队列的实现,包括 Resque、Sidekiq、DelayedJob 等等,它们都可以用来处理耗时的任务,比如邮件发送、图片处理等等,从而不阻塞主线程。这里以 Sidekiq 为例介绍一下如何使用它来异步发送邮件。
首先需要安装 Sidekiq,可以通过下面的命令来安装:
gem install 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 来处理任务队列中的任务。可以通过下面的命令来启动:
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 来异步发送邮件。