Perlでメールの自動返信

Perlを使って、あるユーザー宛にきたメールを自動で送り主に返信します。
procmail版はこちら
Perlを使うとDBからデータを取り出して自動返信とかも可能になります。

まず、自動返信したいメールアカウントのユーザーのホームディレクトリに、転送設定をします。
sendmail、postfixの場合、.forward
qmailの場合 .qmail
というファイルをホームディレクトリに作成します。パーミッションは600で。
中身は以下の通り

.forward .qmail


|/home/kazan/auto_res.pl
 

エイリアスなどで実際に登録されていないユーザーなどの場合はaliasesファイルを編集します。

/etc/aliases


kazan: "| /var/spool/kazan/auto_res.pl"
 

Perlの中身です。

auto_res.pl


#!/usr/bin/perl

require "jcode.pl";

#初期設定
$sendmail = '/usr/sbin/sendmail';
$mail_from = 'faq@scoutroll.net';
$subject = "FAQお問い合わせ";
$main_body = "自動返信しています。";

#送られてきたメールを解析
while(<STDIN>){

 #エラー終了、リターンメールを破棄
 exit if(/Undelivered/);
 exit if(/failure/);
 exit if(/refused/);

 #Fromヘッダ取得
 $from = $_ if(/^From /);

 #本文の区切り
 $flag = "on" if(/^\n/);

 #本文取得
 if($flag eq "on"){ $message .= $_ if(!/^\n/); }
}

@mail_to = split(/ /,$from); #送信者アドレスの取得
$message = substr($message,0,10240) if((length $message) > 10240); #10kb超えたメールは10k以下を破棄

#無効なメールを破棄
exit if($mail_to[1] eq $mail_from);
exit if($mail_to[1] eq "");
exit unless($mail_to[1] =~ /^[^@]+@[^.]+\..+/);

#jisにコンバート
&jcode'convert(*subject,'jis');
&jcode'convert(*main_body,'jis');

#メール送信
open(MAIL,"|$sendmail -t");
print MAIL "To: $mail_to[1]\n";
print MAIL "From: $mail_from\n";
print MAIL "Subject: $subject\n\n";
print MAIL $main_body;
close(MAIL);

exit;
 

Perlに渡ってきたメールは標準入力の<STDIN>で取得できます。

注意するのは、エラーメールの処理です。
あて先がなくて戻ってきたメールや、あて先が自動返信のメールアドレスとかになっていた場合、無限ループするので、そこらへんの処理をちゃんとやらないと痛い目に遭います。
上記の例ではそういうメールがきた場合はそこでプログラムを終了させています。

メール送信の際 jcode.plを使うので、指定のディレクトリに配置します。