使用していたメールサーバが変更になってから、
Redmineの便利な機能であるメール通知機能が使えなくなってました。
メールサーバがSMTP over SSLになったことが直接的な原因なのは明らかだったんですが、
かなり苦戦。
rubyのバージョンは1.8.7
Redmineのバージョンは0.8.1
初めは、environment.rbやemail.ymlなどを弄ってたけど上手くいかず。
タイムアウトしてるっぽい。
ネットに書いてあった、
$ gem install tlsmail
とか色々してみるも結果は同じ。
接続か認証で失敗してるのかな?
ってことで、
opensslコマンドでメールサーバと接続してメール送信・受信できることを確認。
いちいちMIME Base64でユーザ名・パスワードをエンコードするのが面倒だったが、
無事、送信・受信は出来た。
つまり、サーバの問題では無さそう。
次に、
(Redmineも使用している)Net::SMTPライブラリを使ったrubyスクリプトを書いてメール送信テスト。
しかし失敗。
先程と同様にタイムアウトしてる模様。
書いたのはこんな感じのスクリプト。
(引数とかは読み換えてください)
require 'rubygems' require 'tlsmail' Net::SMTP.enable_tls( OpenSSL::SSL::VERIFY_NONE ) Net::SMTP.start( 'hoge.smtp.server', 465, 'hoge.helo.domain', 'user', 'password', :login ) do |smtp| smtp.send_mail mail_string, 'from@mail.address', 'dest@mail.address' end
しかし、またしてもタイムアウト。
やはり接続の段階で上手くいってないっぽい。
試しに先頭2行を、
require 'net/smtp'
に戻してみる。
すると、enable_tlsメソッドなんか無いって怒られる。
次に、net/smtp.rbのソースを読んでみる。
・・・
ん?enable_tlsあるやん?
そこで、色々間違いに気付く。
あるにはあるけど、そこにあったenable_tlsはクラスメソッドではなくインスタンスメソッド。
ネットに転がってたGmailのコード例は結構古い情報だったのか・・・
そこで先ほどのコードを、
require 'net/smtp' smtp = Net::SMTP.new( 'hoge.smtp.server', 465 ) smtp.enable_ssl smtp.start( 'hoge.helo.domain', 'user', 'password', :login ) do |smtp| smtp.send_mail mail_string, 'from@mail.address', 'dest@mail.address' end
と書き換え無事送受信できました。
そして本題。
Redmineのbase.rbの中のコードも同じように書き換えて無事メール通知できるようになりましたとさ。
#Net::SMTP.start(smtp_settings[:address], smtp_settings[:port], smtp_settings[:domain], # smtp_settings[:user_name], smtp_settings[:password], smtp_settings[:authentication]) do |smtp| # smtp.sendmail(mail.encoded, sender, destinations) #end smtp = Net::SMTP.new(smtp_settings[:address], smtp_settings[:port]) smtp.enable_ssl smtp.start(smtp_settings[:domain], smtp_settings[:user_name], smtp_settings[:password], smtp_settings[:authentication]) do |smtp| smtp.sendmail(mail.encoded, sender, destinations) end