Rails 3.2.13 にあわせて mail を 2.5.3 にアップデートしたら、メールが送信できなくなってしまった (OpenSSL のエラーが出てサーバへの接続に失敗する)。
詳しく調べると、
- SMTPS に対応してないが TLS 必須の SMTP サーバを使用している
- openssl_verify_mode を指定している
- mail 2.5.0..2.5.3 を使用している
場合にメールが送信できなくなるようです。
原因
下記のコミットで、それまで enable_starttls_auto だったところが enable_tls になっています (ちょうどノートついてますね)。
これにより openssl_verify_mode を指定していると、enable_starttls_auto が true でも STARTTLS を使わず SMTPS で接続しようとします。
ここで SMTP サーバが SMTPS に対応してないが TLS 必須だと、どう設定しても接続できず、詰みます。
現状
現時点 (2013-03-26) で mail のリポジトリをみると、下記のコミットで、リファクタリングと同時にこの箇所は修正されています。
ただこの修正を含む gem はまだリリースされていないようです。
actionmailer
問題が mail だけなら、関係しそうなプロジェクトでは mail 2.4.4 を使いつつ、新しいバージョンを待つ、でいいんだけど、actionmailer 3.2.13 は mail ~> 2.5.3 を要求するので Rails 3.2.13 も使えなくなってしまう。
ちなみに actionmailer 3.2.12 までは mail ~> 2.4.4 だったんだけどね。
解決方法
いくつか考えられる。
A. SMTP サーバで SMTPS 対応する、TLS 必須じゃなくする
B. openssl_verify_mode を指定しない
C. 新しい mail gem が出るまで待つ
D. mail の未リリースのコード使う
E. mail 2.5.3 にパッチあてる
E は fork するか、クラス再オープンしてメソッド上書き。
下記の様に書き換えれば良いと思う。
diff --git a/lib/mail/network/delivery_methods/smtp.rb b/lib/mail/network/delive
index 53c1330..79ceab0 100644
--- a/lib/mail/network/delivery_methods/smtp.rb
+++ b/lib/mail/network/delivery_methods/smtp.rb
@@ -124,9 +124,9 @@ module Mail
if RUBY_VERSION >= '1.9.0'
context = Net::SMTP.default_ssl_context
context.verify_mode = openssl_verify_mode
- smtp.enable_tls(context)
+ smtp.enable_starttls_auto(context)
else
- smtp.enable_tls(openssl_verify_mode)
+ smtp.enable_starttls_auto(openssl_verify_mode)
end
end
end