Redmineメール通知機能

使用していたメールサーバが変更になってから、

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