2

我想要使​​用 Deliver_later(sidekiq) 的邮件的 SMTP message_id。

我能够在deliver_now但不能deliver_later的返回obj中获取id。

在 my_action_mailer 中的 mail() 函数的返回值中也缺少 Message_id

  • 当我使用 -

sent_mail = some_mail().deliver_later

响应是一个 sidekiq 作业对象,看起来像这样-

#<ActionMailer::DeliveryJob:0x007fefa1454780 @arguments=["xxxxxxx", "xxxxxxx", "deliver_now", xxxxxxx], @job_id="69b13253-55f9-4db9-a10a-0e8e4b998584", @queue_name="mailers", @priority=nil, @executions=0, @provider_job_id="6f75131d0c485534322cd728">
  • 当我使用 -

sent_mail = some_mail().deliver_now

响应是一个看起来像这样的对象对象-

<Mail::Message:xx, Multipart: true, Headers: <Date: xx>, <From: "xx" <xx@xx.com>>, <Reply-To: "xx" <xx@xx.com>>, <To: ["xx@xx.com"]>, <Message-ID: <5a7863381167a_ba183fdfebc3f928907cb@xx-xx-xx.xx.mail>>, <Subject: xx>, <Mime-Version: 1.0>, <Content-Type: multipart/mixed; boundary="--==_mimepart_xx"; charset=UTF-8>, <Content-Transfer-Encoding: 7bit>>

如果您仔细查看上面的输出,返回类是Mail::Message并且它包含“ Message-ID ”,这正是我所需要的。

  • 此外,当我们在我的邮件程序类中调用 mail() 函数时,它还返回 Mail::Message对象,但此 obj 不包含从 SMTP 服务器返回的 Message-ID。

有什么方法可以通过使用Deliver_later获得消息 ID

4

2 回答 2

0

这是处理这种情况的标准方法:

覆盖ActionMailer::DeliveryJob,像这样:

class EmailDeliveryJob < ActionMailer::DeliveryJob
  def perform(mailer, mail_method, delivery_method, *args)
    response = mailer.constantize.public_send(mail_method, *args).send(delivery_method)

    # Use response.message_id as you want
  end
end

在您的邮件中,

class UserMailer < ApplicationMailer
  self.delivery_job = EmailDeliveryJob

  def welcome_email(user)
    mail to: user.email, subject: "Welcome!"
  end
end
于 2022-01-12T12:22:58.110 回答
0

我遇到了同样的问题,但我决定改用 Mailgun HTTPS API,但在 Sidekiq 作业中。

所以我打电话给工作MailgunJob.perform_later(stuff_to_send)

并且在工作中

response = RestClient.post "https://mailgun_path", data
result = JSON.parse(response.body)
message_id = result['id']

您可以使用工作,并工作中使用deliver_now吗?

如果你找到了更好的解决方案,你能写在这里吗?

于 2019-01-30T09:39:48.697 回答