gpt4 book ai didi

ruby-on-rails-4 - Rails 4 ActionMailer-如何在使用deliver_later时捕获连接和SMTP错误

转载 作者:行者123 更新时间:2023-12-04 13:38:15 28 4
gpt4 key购买 nike

我正在使用ActionMailer delivery_later w ActiveJobs/Sidekiq使用:

config.active_job.queue_adapter = :sidekiq

当我在开发模式下使用MailCatcher进行测试时,我能捕捉到的唯一错误是Errno::ECONNREFUSED,将端口设置为1026而不是1025

当我测试liver_now时,出现Errno::ECONNREFUSED错误,这很好
begin
MessageMailer.contact_me_email(@message).deliver_now
rescue Errno::ECONNREFUSED, Net::SMTPAuthenticationError, Net::SMTPServerBusy, Net::SMTPSyntaxError, Net::SMTPFatalError, Net::SMTPUnknownError => e
flash[:error] = "Problems sending mail. Please try again later"
# delete message or resend it ?
byebug
@message.destroy
format.html { render :new }
end

但是,当我请求delivery_later时,该请求在sidekiq邮件队列中很痛,并且未捕获到错误...
       begin
MessageMailer.contact_me_email(@message).deliver_later(wait: 1.minute ) # in mailers queue
rescue Errno::ECONNREFUSED, Net::SMTPAuthenticationError, Net::SMTPServerBusy, Net::SMTPSyntaxError, Net::SMTPFatalError, Net::SMTPUnknownError => e
flash[:error] = "Problems sending mail. Please try again later"
# delete message or resend it ?
byebug
@message.destroy
format.html { render :new }
end

在这种情况下,如何捕获SMTP错误并从中恢复?我想这是Sidekiq的责任。欢迎任何提示。

最佳答案

ActiveJobs允许您挽救使用rescue_from方法执行作业时发生的错误。参见the api。您将需要在ActiveJob子类中实现此方法。

由于ActionMailer使用DeliveryJobs将消息作为作业传递,因此您需要在类中添加rescue_from方法来处理异常。

例如,您可以将其放置在config/initializers/action_mailer.rb中:

ActionMailer::DeliveryJob.rescue_from(StandardError) do |exception|
Rails.logger.error "Original record not found: #{@serialized_arguments.join(', ')}"
end

这将清除所有StandardError,并仅记录它们而不引发异常。我自己实现了此目的,以使Rollbar安静下来。

由于这是一个极端的案例,因此也要对其进行测试是一个好主意:
spec/initializers/action_mailer_spec.rb:
RSpec.describe 'ActionMailer::DeliveryJob error recovery' do

it 'should log the deserialization errors' do
@user = create(:user)
MyCustomMailer.send_something(@user).deliver_later
@user.destroy

expect(Rails.logger).to receive(:error).at_least(:once)
Delayed::Worker.new.work_off
end

end

关于ruby-on-rails-4 - Rails 4 ActionMailer-如何在使用deliver_later时捕获连接和SMTP错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32069520/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com