高度なメール転送方法

複数のメールアドレスを持っている場合、ひとつひとつ受信するのは面倒なので、 どれか一つにまとめてしまいたいものです。

そんな時役に立つのが、メールの転送設定です。 一般に「 .forward 」ファイルに記述することでメールの転送は可能ですが、 出来ることが限られています。


●「 .forward 」 を用いたメール転送

メールを転送したい場合は、自分のホームディレクトリ内に「 .forward 」ファイルを置きます。

hoge@xxxxx.net
\hoge

この例では、hoge@xxxxx.netに転送すると共にhogeアカウントにもメールを保存することを意味します。

「\」は、自分自身にメールがループされないようにするためのもので、必ず記述しましょう。

なお、パーミッションは「 600 」に設定してください。

●Procmail を用いたメール転送

「 Procmail 」とは、メールの振り分けを行うソフトウェアです。

「 Procmail 」を利用可能な環境であれば簡単なレシピを記述しておくだけで、 サブジェクトや差出人ごとに振り分けや携帯端末等へ転送を行ったり、 広告や勧誘などの SPAM の削除を行うことができます。

「 .forward 」ファイルに次のように記述します。

"|IFS=' ' && exec /usr/local/bin/procmail -f- || exit 75"

あとは「 .procmailrc 」ファイルを作成し、指定の書き方で記述します。しかしここでは紹介しません。

Procmailのホームページ(英語版)

Procmailのマニュアル(日本語版)

●自作メール転送プログラム

「 Procmail 」がインストールされていない環境では、転送プログラムを 作成してしまいましょう。

メールの書式は次のような形式をとっています。

From: ...
Received: ...
Received: ...
Received: ...
Date: ...
From: ...
Message-ID: ...
To: ...
Subject: ...
Content-Length: 本文の長さ
(空行。これより以前がヘッダ。これより後は本文)
本文

これが標準入力から流れてきますので、その内容に従って処理を すればいいわけです。

まず「 .forward 」ファイルに以下のように書き込みます。

"| exec /home/ユーザ名/mail-delivery.pl -Y"

次に「 mail-delivery.pl 」と言う名前のファイルを作成し、 以下のように記述します。

ここで 緑色 の部分は各自で変更する内容です。

ファイル名:mail-delivery.pl

#!/usr/bin/perl
# perl のパスを指定

$send="hoge\@hoge.co.jp"; # デフォルト送信先

while (<STDIN>){
 $content .= $_;

  m/^Content-Length: (\d+)$/;

  # -------好きな設定に変更しましょう---------
  # 100K 以上なら転送しない
  if ( $1 > 100000 ){ exit; } 
  # 題名に「hoge」が含まれていれば転送(日本語不可)
  if ( m/^Subject:/ && ~/hoge/ ){ $send="hoge3\@hoge.co.jp"; }
  # 送信元に「hoge@hoge.com」が含まれていれば転送(日本語不可)
  if ( m/^From:/ && ~/hoge\@hoge.com/ ){ $send="hoge4\@hoge.co.jp"; }
  # ----------------------------------------

  if ( m/^$/ ){  # 本文は調べない
    while (<STDIN>){
      $content .= $_;
    }
  }
}

open(SENDMAIL,"|/usr/bin/mail $send");
print SENDMAIL $content;
close(SENDMAIL);

送信エラーの場合、送信元に「Returned mail: unknown mailer ・・・」と届きます。


  • In string, @ now must be written as \@ at ・・・・の場合
    → メールアドレスの「@」を「\@」にしていない
  • syntax error at /mail-delivery.pl ・・, near "・・\"
    → 「""」の閉じ忘れがあるなど
  • sh: /mail-delivery.pl: not found ・・・・の場合
    → Perl のパスが間違っている( #!/usr/local/bin/perl などに変更)など

「 mail-delivery.pl 」はパーミッションを「 700 」にして保存しましょう。

また、受け取ったメールをスプールするためには、以下のような記述方法にします。

ファイル名:mail-delivery.pl

#!/usr/bin/perl
# perl のパスを指定

$MAIL_SPOOL = "/var/mail/ユーザ名";
# あるいは /var/spool/mail/ユーザ名

while (<STDIN>){
 $content .= $_;

  m/^Content-Length: (\d+)$/;

  # -------好きな設定に変更しましょう---------
  # 100K 以上なら転送しない
  if ( $1 > 100000 ){ exit; } 
  # 題名に「hoge」が含まれていれば転送(日本語不可)
  if ( m/^Subject:/ && ~/hoge/ ){ $send="hoge3\@hoge.co.jp"; }
  # 送信元に「hoge@hoge.com」が含まれていれば転送(日本語不可)
  if ( m/^From:/ && ~/hoge\@hoge.com/ ){ $send="hoge4\@hoge.co.jp"; }
  # ----------------------------------------

  if ( m/^$/ ){  # 本文は調べない
    while (<STDIN>){
      $content .= $_;
    }
  }
}

if ( $send ne "" ){
  open(SENDMAIL,"|/usr/bin/mail $send");
  print SENDMAIL $content;
  close(SENDMAIL);
} else {
  print $content >> $MAIL_SPOOL;
}

これらは、失敗すると無限ループや多数配信なども考えられます。各自の責任でお使い下さい。

また、信頼性に関して考えるのであれば「 Procmail 」の利用をお奨めします。


戻   る