ToDoMail送信ツール(Ruby/Tk)

ToDoMailという無料のリマインダーメールサービスがある。件名に日時を記入したメールをあらかじめ送っておくと、件名で指定した日時に返信アドレスに宛てて配信してくれるというサービスである。
使い方は簡単なのだが、配信日時を10桁の数字(YYMMDDHHMMの形式)で入力するのが面倒だったので、楽をするためのツールをRuby/Tkで作ってみた。
SMTP_SERVER と DELIVERY_ADDRESS を自分の環境に書き換えれば使えるはず。ご使用は自己責任でよろしく。
とりあえずざっくり作っただけなので色々不親切な部分がある。
(例)配信日時が有効な日時かどうかのチェックをしてない

なお、ちゃんと送信されたかどうかの確認のために、ToDoMailサーバーへ送る内容を配信先アドレスにもCCで送るようにしている。つまり配信先アドレスには、送信直後と配信日時の2回メールが届く。

#!/usr/bin/env ruby

require "tk"
require 'net/smtp'
require 'kconv'

#### 設定が必要 ####
SMTP_SERVER      = 'smtp.server.ne.jp'       # メール送信に使用するSMTPサーバー
DELIVERY_ADDRESS = 'deliver@address.ne.jp'   # リマインダーメールを受けるメールアドレス
###################

DEFAULT_DELAY_MIN = 10    # このスクリプトの起動時刻から配信時刻の初期値までの分数
TODOMAIL_ADDRESS = 'todomail@aivy.co.jp'

class ToDoMail
  TITLE = "ToDoMail Sender"

  def initialize
    Tk.root.title(TITLE)

    @smtp_server = TkVariable.new(SMTP_SERVER)
    @mail_from   = TkVariable.new(DELIVERY_ADDRESS)
    @mail_to     = TkVariable.new(TODOMAIL_ADDRESS)
    
    @year        = TkVariable.new(sprintf("%02d", Time.now.year - 2000))
    @month       = TkVariable.new(sprintf("%02d", Time.now.month))
    @day         = TkVariable.new(sprintf("%02d", Time.now.day))
    @hour        = TkVariable.new(sprintf("%02d", Time.now.hour))
    @min         = TkVariable.new(sprintf("%02d", Time.now.min + DEFAULT_DELAY_MIN))

    fsmtp   = TkFrame.new.pack('side' => 'top', 'fill' => 'x')
    fdate   = TkFrame.new.pack('side' => 'top', 'fill' => 'x')
    ftext   = TkFrame.new.pack('side' => 'top')
    fbutton = TkFrame.new.pack('side' => 'bottom')

    # SMTP
    TkLabel.new(fsmtp, 'text'=>'SMTPサーバー:').pack('side' => 'left')
    TkEntry.new(fsmtp, 'textvariable'=>@smtp_server).pack('side'=>'left')

    TkLabel.new(fsmtp, 'text'=>'   To:').pack('side' => 'left')
    TkEntry.new(fsmtp, 'textvariable'=>@mail_from).pack('side'=>'left')

    # 配信時刻
    TkLabel.new(fdate, 'text'=>'配信日時:20').pack('side' => 'left')
    TkEntry.new(fdate, 'width' => 2, 'textvariable'=>@year).pack('side' => 'left')
    TkLabel.new(fdate, 'text' => '年 ').pack('side' => 'left')

    TkEntry.new(fdate, 'width' => 3, 'textvariable'=>@month).pack('side' => 'left')
    TkLabel.new(fdate, 'text' => '月 ').pack('side' => 'left')

    TkEntry.new(fdate, 'width' => 3, 'textvariable'=>@day).pack('side' => 'left')
    TkLabel.new(fdate, 'text' => '日   ').pack('side' => 'left')
    
    TkEntry.new(fdate, 'width' => 3, 'textvariable'=>@hour).pack('side' => 'left')
    TkLabel.new(fdate, 'text' => '時 ').pack('side' => 'left')

    TkEntry.new(fdate, 'width' => 3, 'textvariable'=>@min).pack('side' => 'left')
    TkLabel.new(fdate, 'text' => '分 ').pack('side' => 'left')

    # メール本文
    @text = TkText.new(ftext, 'height' => 8).pack('side' => 'left')

    # 「送信」ボタン
    @send = TkButton.new(fbutton, 'text' => '送信', 'command' => proc{send_mail}) {
      pack('side' => 'right')
    }
 
    Tk.mainloop
  end

  def send_mail
    # 配信日時のチェックをした方が良い
    subject = sprintf "%s%s%s%s%s", @year, @month, @day, @hour, @min

    msg = <