YY-BOARDをMail::Sendmailを使ってメール送信機能を使う

 blogが動かないときのためや、blogに関係ない記事や話題のために細々と掲示板を公開しています。たまに投稿記事があるのと、最近広告がやけに投稿されるのですぐに削除するために掲示板に投稿された内容をメールで通知して欲しいのですが、このblogは自宅サーバをWindows 2000 Serverで運営しているのでsendamail機能が使用できないのです。

 掲示板で使用しているKENT-WEBYY-BOARDはsendmailにしか対応していないので、どうにかして良い方法がないのかと調べていたところ、PerlのパッケージにMail::Sendmailというものがあるようです。自宅サーバにはメールサーバがたっているので、改造が必要ですが、Mail::Sendamailを使って改造してみることにしました。

まず、ActivePerlのPPMから「search mail-sendmail」で「Mail::Sendmail」パッケージを探しインストールします。
次にYY-BOARDの716行目から730行目の

open(MAIL,"| $sendmail -t") || &error("メール送信失敗");
print MAIL "To: $mailto\n";
print MAIL "From: $email\n";
print MAIL "Subject: $msub\n";
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 "X-Mailer: $ver\n\n";
print MAIL "--------------------------------------------------------\n";
foreach ( split(/\n/, $mbody) ) {
&jcode'convert(*_, 'jis', 'sjis');
print MAIL $_, "\n";
}
print MAIL "--------------------------------------------------------\n";
close(MAIL);

をコメントするなりごっそり削除するなりしちゃいましょう。

その部分に以下のソースを挿入します。

use Mail::Sendmail;
&jcode'convert(*mbody, 'jis', 'sjis');

$mail{Smtp} = '127.0.0.1';
$mail{Date} = Mail::Sendmail::time_to_date( time() + 32400 );

%mail = ( To => $mailto,
From => $email,
Subject => $msub,
'Content-Type' => 'text/plain; charset=ISO-2022-JP',
'Content-Transfer-Encoding' => '7bit',
'X-Mailer' => "Mail::Sendmail version $Mail::Sendmail::VERSION",
Message => $mbody,
);

sendmail(%mail) || &error("メール送信失敗");

$mail{Smtp} = '127.0.0.1';の部分には自分が使用可能なSMTPサーバのアドレスに変更しましょう。今回は自宅サーバのSMTPが使えるので127.0.0.1を使用しています。
$mail{Date} = Mail::Sendmail::time_to_date( time() + 32400 ); の部分の32400は世界標準時より9時間早い日本標準時のために設定しています。理由があってメールの送信日時をずらしたい場合は60*60*hの計算式で秒数を変更してみてください。

あとは、「yyini.cgi」の180行目「$mailing」と、183行目「$mailto」の設定を変えれば動くようになると思います。

※行番号はバージョンやテキストエディタによってずれる場合があるので参照程度に使って下さい。
※このソースの行番号は2005年11月22日現在のYY-BOARD最新版で確認しました。