SMTPテスト

一定時間ごとに指定SMTPサーバを使ってメールを送信、もしエラーになったら手近なSMTPサーバを使い通報という簡単な仕掛け。まさに雑品だ :D

簡単にすますためRubyで書いてみる。net/smtpと例外処理におんぶでだっこだが、それでもまぁ間に合うだろう。uconvを使っているのは単に私の環境で基本UTF-8だからだ。

#!/usr/bin/ruby

require "net/smtp"
require "uconv"
require "kconv"

def sendmail(s,p,from,to,subject,script)
  Net::SMTP.start(s,p) {|smtp|
    smtp.send_mail <<EndOfMail, from,to
From: #{from}
To: #{to}
Content-Type: text/plain; charset=ISO-2022-JP
MIME-Version: 1.0
Subject: #{subject}

#{script}

EndOfMail
  }
end

################

smtpserver = '試験対象サーバ名'
from = '発信元メールアドレス'
to = '着信先メールアドレス'
errorto = 'エラー通報先メールアドレス'

begin
  sendmail(smtpserver,25,from,to,
        'TEST OK','TEST OK')
rescue
  smtpserver2 = 'localhost'
  subject = "EMERGENCY SMTPSERVER"
  script = Uconv.u8toeuc("通信異常検出。#{smtpserver}")
  script = Kconv.tojis(script)
  sendmail(smtpserver2,25,from,errorto,
        subject,script)
end

指定SMTPサーバを使い、動作報告用アドレスにメール送信を試みる。送り先は指定条件を満たしてさえいればダミーで構わない。またこの例ではSMTP認証用ではないのだが、認証つきでも手間はほとんど変わらない。

上の例だと、なんらかの理由で送信失敗すると速攻でエラーが飛んでしまう。リトライする等のルーズな仕様も本当は必要だと思うが、今回は必要なかったのでこうしてある。