Railsでメール送信後のstatus codeを受け取る方法

1 min読了の目安(約1100字TECH技術記事

メールを送信した後のレスポンスを取得する必要があって、そのための設定を調べました。
以下二つのことをすると、メール送信後のresponseを取得することができます。

1.smtp_settingsにreturn_response: true
2.メール送信時はdeliver!を使う

smtp_settingsにreturn_response: true

まずは、config/environments/production.rbなどに書いてあるsmtp_settingsにreturn_response: trueを追記しましょう。

  config.action_mailer.smtp_settings = {
    address: 'smtp.example.com',
    domain: 'example.com',
    port: 123,
    user_name: 'user',
    password: 'password',
    authentication: :plain,
    enable_starttls_auto: true,
    return_response: true # これを追加
  }

メール送信時はdeliver!を使う

deliver!を使うと戻り値がresponseになります。やった!

response = SampleMailer.send_mail.deliver!

responseの中はこんな感じ

#<Net::SMTP::Response:0x00007fe9499f0968 @status="250", @string="250 Message accepted\n">

response.stringとかすると中身を取得してあれこれすることができます。

なぜ必要だったのか?

SendGridというメール送信サービスを使うと、送信したメールごとにmessage idを発行していて、それを手に入れると開封率の調査などをより正確にできるようになります。

このmessage_idはsmtpで送っている場合、メール送信後のレスポンスの中に入っている仕様ということでした。

送信リクエストの内容とイベントを紐付ける方法を教えてください

Web APIだと、普通にAPIのresponseの中にmessage_idが入っているようですがsmtpだと奥まったところに入っている感じになるんですね。