Mailが送れなくて焦った件

「Mailが送れなくて焦った」ということがあったのですが、物語風に頭から書いていってたところ、参考にしようとして見たページのFlashのせいで IE(7)が丸ごと落ちて、はてなのバックアップも機能してなくて、ちょっと不貞腐れているので箇条書きします。

UbuntuSubversionクライアントを使う

このトラブルは「Windows環境でテストしていた Railsアプリを Ubuntuの本番環境に移してテストしようとしたところ起きた」ことなので、まず、Rails環境を移すところから始めます。
Ubuntu側には sambaも入っていることですし、ディレクトリ丸ごとコピーしたほうが1回こっきりなら楽でいいんですが、開発環境で変更があるたび、変更のあったファイルをコピーしたり、フォルダ丸ごとコピーするんじゃ、いったいなんのためのバージョン管理かと。じゃあ、Subversion使えばいいんじゃね、ということです。
すでに Subversionサーバが立ってて、sshも使えている Ubuntuという前提で「Subversionクライアントを使う」ときのトラブルのことなので、これを読んで役に立つ人というのは相当限定されると思いますが、かいつまんで言うと、

$ svn co svn+ssh://user@host/repos/hoge/trunk .

をやろうとしたときにエラーになったら、まずどこを見ればいいのということです。

$ printenv
$ export SVN_SSH="ssh -p port -l user -i /home/user/.ssh/subversion.ppk"

環境変数(SVN_SSH)をまず見ろと。これがないとたぶん sshでの接続に失敗します。標準ポート(22)を使っている場合、-pはいりませんが、セキュリティを考慮してポート番号を変更している場合、-pを指定しないとコネクトできません。-iの鍵認証の指定は(少なくともうちの環境では)なくてもいいようです。
svnをやるまえに「ssh -p port host」でリポジトリのある hostにまずつないでみるということですね。(sshでログインして、シェルにホスト名を出していなくて「あれ、いまってどっちにログインしてるんだっけ?」というときは「hostname」でホスト名が表示されます)

Rubyでのメール送信テスト

Rails動かしてのテストだとエラー箇所の特定が面倒なので、Rubyでシンプルにメールを送ってみてテストしてみたいと思います。こちら(→ 2007-06-01 )にそのものずばりのコードが載っていたので、これを動かしてみます。

require 'rubygems'
require 'action_mailer'

class TestMailer < ActionMailer::Base
  def testMessage(toAddress, mySubject, myBody)
    from      'info@555.jp'
    recipients toAddress
    subject    mySubject
    body       myBody
  end
end

ActionMailer::Base.smtp_settings = {
  :address        => 'mail.5-55.jp',
  :port           => 25,
  :domain         => 'min10.com',
  :user_name      => 'user',
  :password       => 'password',
  :authentication => :login}

  TestMailer.deliver_testMessage('test@555.jp', "Subject", "Body")

smtp_settings」を実情にあったようにきちんとセットするのは当然ですが、やってることは Rails内と変わらないので、このままではエラーを再現するだけですが、問題が切り分けられてテストが楽チンです。

エラーの特定

一番大きなエラーは DNS絡みでした。

$ ping mail.5-55.jp
  PING mail.5-55.jp (219.117.201.174) 56(84) bytes of data.

pingを送ってすぐ気がついたのですが、メールサーバがルーターのWANアドレスになっています。なぜだかわかりませんが、この Ubuntu環境では内向けの DNSを使っていなかったんですね。(単にいままで必要なかったから設定してなかっただけという気がします)
このままでは、ルーターSMTPで喋りかけることになり、エラーになるのは当然です。

auto eth0
iface eth0 inet static
  address 123.456.789.2     ← IPアドレス
  network 123.456.789.0     ← (サブ)ネットワークのアドレス
  netmask 255.255.255.0     ← ネットマスク
  broadcast 123.456.789.255 ←ブロードキャストアドレス
  gateway 123.456.789.1     ← ゲートウェイ(ルータ)のアドレス
  dns-nameservers 123.456.789.10 123.456.789.11 ←DNSアドレス
/etc/network/interfaces

実機の「/etc/network/interfaces」をみると確かに DNSサーバの設定はしていないので、ルーターの持っている DNS情報を使っているようです。
ここを変える(追加する)のも手ですが、すでにいくつかのサイトがこのサーバで稼動しているので(ネットワーク・サービスのリブートは気持ち悪いし)、今回は「ActionMailer::Base.smtp_settings」のアドレスを IPアドレス直打ちにしました。

エラーの特定(2)

メールサーバが応答するようになって、やっとちゃんとしたエラーが返ってきました。

503 Error: authentication not enabled

このメールサーバ(mail.5-55.jp)は SPAMの踏み台にされないよう SMTPリレーをイントラネット内に限っているので(外からメールは送れない設定)、認証を OFFにしてたんでした。Authを外すとちゃんとメールが送れました。

ActionMailer::Base.smtp_settings = {
  :address        => '192.168.1.xxx', #'mail.5-55.jp',
  :port           => 25,
  :domain         => 'min10.com'}

  TestMailer.deliver_testMessage('test@555.jp', "Subject", "Body")