Postfix を使ってメール送信を行っている Rails アプリで、OpenSSL::SSL::SSLError が発生してメールが送れなくなったときの対応についてメモ。

  • バージョン
    • Rails 6.0.6
    • ruby 2.7.8
    • Postfix 3.7.2

同じ EC2 上で Rails アプリケーションとメールサーバー (Postfix) が動いている状態で、メールを送信しようとしたところ、以下のようなエラーが発生した。

$ RAILS_ENV=staging bundle exec rails c --sandbox
Loading staging environment in sandbox (Rails 6.0.6)
Any modifications you make will be rolled back on exit

irb(main):001:0> ActionMailer::Base.smtp_settings
=> {:address=>"localhost"}

irb(main):002:0> ActionMailer::Base.mail(from: 'user1@example.com', to: 'user2@example.com',subject: 'test', body: "Hello, mail!").deliver
Delivered mail 654c6ef59d76a_3524a9cf861618@hoge.mail (41.8ms)
Date: Thu, 09 Nov 2023 14:32:37 +0900
From: user1@example.com
To: user2@example.com
Message-ID: <654c6ef59d76a_3524a9cf861618@hoge.mail>
Subject: test
Mime-Version: 1.0
Content-Type: text/plain;
 charset=UTF-8
Content-Transfer-Encoding: 7bit

Hello, mail!
Traceback (most recent call last):
        1: from (irb):3
OpenSSL::SSL::SSLError (SSL_connect returned=1 errno=0 state=error: certificate verify failed (self signed certificate))

Why isn&rsquo;t a self signed SMTP Certificate ignored by Rails ActionMailer 6.1 / Ruby 3.0? - Stack Overflow によると、開始すべきでない TLS ハンドシェイクがデフォルトで有効になっているらしい。

今回は Rails - Postfix 間の TLS は (同じ EC2 で動いているため) 不要と判断。openssl_verify_mode: OpenSSL::SSL::VERIFY_NONE で証明書の検証のみ無効にすることでメールを送信することができた。

$ RAILS_ENV=staging bundle exec rails c --sandbox
Loading staging environment in sandbox (Rails 6.0.6)
Any modifications you make will be rolled back on exit

irb(main):001:0> ActionMailer::Base.smtp_settings[:openssl_verify_mode] = OpenSSL::SSL::VERIFY_NONE
=> 0

irb(main):002:0> ActionMailer::Base.smtp_settings
=> {:address=>"localhost", :openssl_verify_mode=>0}

irb(main):003:0> ActionMailer::Base.mail(from: 'user1@example.com', to: 'user2@example.com',subject: 'test', body: "Hello, mail!").deliver
ActionMailer::Base#mail: processed outbound mail in 1.0ms
Delivered mail 654c74ce19d11_352c0ecf8825e8@hoge.mail (65.8ms)
Date: Thu, 09 Nov 2023 14:57:34 +0900
From: user1@example.com
To: user2@example.com
Message-ID: <654c74ce19d11_352c0ecf8825e8@hoge.mail>
Subject: test
Mime-Version: 1.0
Content-Type: text/plain;
 charset=UTF-8
Content-Transfer-Encoding: 7bit

Hello, mail!
=> #<Mail::Message:42500, Multipart: false, Headers: <Date: Thu, 09 Nov 2023 14:57:34 +0900>, <From: user1@example.com>, <To: user2@example.com>, <Message-ID: <654c74ce19d11_352c0ecf8825e8@hoge.mail>>, <Subject: test>, <Mime-Version: 1.0>, <Content-Type: text/plain>, <Content-Transfer-Encoding: 7bit>>