ゴミ出しの日の朝、メールで教えてくれるスクリプト

新しい家に引っ越して、半月が過ぎましたが、なかなか生活になじまないのがゴミ出しの日。
朝はばたばたしているため、つい忘れがち。
そんな僕のために、ゴミ出しの日だった場合、朝メールで連絡してくれるツールを作りました。
下記の設定は神戸市の僕の住むとある地域の設定です。

これをcronで毎朝起きる時間くらいに動かしてやればいいわけです。
目覚まし代わりにもなりますね。

ちなみに、必要なモジュールCarp::Clanは6.04、Date::Pcalcは6.1をCPANからダウンロードしpure perl で生成して下記スクリプトと同じディレクトリにおいています。

#!/usr/bin/perl

use strict;
use warnings;
use Carp::Clan;
use Date::Pcalc qw( Today Date_to_Days
                    Nth_Weekday_of_Month_Year
                    Day_of_Week );

#--------------------
# define
#--------------------
my $subject     = '';
my $m_moeru     = '今日は燃えるゴミの日です';
my $m_funen     = '今日は燃えないゴミの日です';
my $m_housou    = '今日は包装ゴミの日です';
my $m_sigen     = '今日は資源ゴミ(古新聞など)の日です';
my $m_sigen_kan = '今日は資源ゴミ(空き缶など)の日です';

#sendmailパス
my $name = 'account';
my $password = 'password';

my $from = 'gomi@mail.com';
my $to = 'to@mail.com';

#--------------------
# main
#--------------------

my ($year,$month,$day) = Today();
my $today = Date_to_Days($year,$month,$day);

# 燃えるゴミの日判定
my $dow1 = 1; # 1 = Monday   everyweeks
my $dow2 = 4; # 4 = Thursday everyweeks

my $dow = Day_of_Week($year,$month,$day);
if (($dow == $dow1 || $dow == $dow2)) {
    &send_mail( $from, $to, $subject, $m_moeru);
}
sleep(2);

# 燃えないゴミの日判定 第2,4金曜日
my $mn1    = 2; # 1 = second of that day of week
my $mn2    = 4; # 4 = fourth of that day of week
my $mn_dow = 5; # 5 = Friday everyweeks

if ($today == Date_to_Days(Nth_Weekday_of_Month_Year($year,$month,$mn_dow,$mn1))
    || $today == Date_to_Days(Nth_Weekday_of_Month_Year($year,$month,$mn_dow,$mn2))) {
    &send_mail( $from, $to, $subject, $m_funen)
}
sleep(2);

# 包装ゴミの日判定(2011/4から設定開始)
#my $mn1   = 2; # 1 = second of that day of week
#my $mn2   = 4; # 4 = fourth of that day of week

#if ($today == Date_to_Days(Nth_Weekday_of_Month_Year($year,$month,$dow,$n))) {
#    &send_mail( $from, $to, $subject, $m_housou)
#}
#sleep(2);

# 資源ゴミ(古新聞など)の日判定 第2,4金曜日
my $sg1    = 2; # 1 = second of that day of week
my $sg2    = 4; # 4 = fourth of that day of week
my $sg_dow = 5; # 5 = Friday everyweeks

if ($today == Date_to_Days(Nth_Weekday_of_Month_Year($year,$month,$sg_dow,$sg1))
    || $today == Date_to_Days(Nth_Weekday_of_Month_Year($year,$month,$sg_dow,$sg2))) {
    &send_mail( $from, $to, $subject, $m_sigen)
}
sleep(2);

# 資源ゴミ(空き缶など)の日判定 毎週水曜日
my $sk1 = 3; # 3 = Monday   everyweeks

my $s_dow = Day_of_Week($year,$month,$day);
if (($sk1 == $s_dow)) {
    &send_mail( $from, $to, $subject, $m_sigen_kan);
}
sleep(2);

##------------------------------------------------ メール送信関数
## send_mail( $from, $to, $subject, $body);
## ------------------------------------------------------------------------------
## From, To は、メアドのみを渡す。 "who" <who@mail.aaa> とかは駄目。
## $subject, $body, $attach_data, $filename のエンコードは関数内でやるので、
## 普通に EUC を渡せば OK 。
##------------------------------------------------------------------------------
sub send_mail ($$$$) {
  my( $from, $to, $subject, $body) = @_;
  my $boundary = "-*-*-*-*-*-*-*-*-Boundary_" . time . "_" . $$;
  # デリミタを退避し、デフォルトの \n にする。
  my $oldDelim = $/;
  undef $/;

  ### サブジェクトを jis にして、MIME エンコード
  require './jcode.pl';
  require './mimew.pl';
  $subject = MIME::mimeencode(jcode'jis($subject));

  ### 本文を jis に
  $body = jcode'jis($body);

  use MIME::Base64 qw(encode_base64);

  ### メールの送信'
  my $sendmail_path = "/usr/sbin/sendmail";
  open MAIL, "|$sendmail_path -i -t";

  ########################## メールの組み上げ'
  ### 全体のヘッダ
  print MAIL "MIME-Version: 1.0\n";
  print MAIL "Content-Type: text/plain; charset=iso-2022-jp\n";
  print MAIL "Content-Transfer-Encoding: 7bit\n";
  print MAIL "From: $from\n";
  print MAIL "To: $to\n";
  print MAIL "Subject: $subject\n";

  ### メール本文のパート
  print MAIL "\n";
  print MAIL "$body\n";

  print MAIL "\n";

  close MAIL;

  # デリミタの復元
  $/ = $oldDelim;
}

exit(0);