- PR -

メール転送 [/var/spool/mail/ユーザ名]

1
投稿者投稿内容
magi
会議室デビュー日: 2004/09/17
投稿数: 6
投稿日時: 2005-12-27 16:56
いつもお世話になっております。

今回は、メール転送に関して質問させて頂きます。

顧客より、転送設定前のメールも転送して欲しいという
要望がありました。
※転送設定前のメールとは、/var/spool/mail/ユーザ名の
 ことです。

メール転送は、.forwardにて転送設定をし設定後転送が
開始されますが、設定前に受信したメールを転送したい
場合はどの様にすれば良いのでしょうか。

転送する術が御座いまし教えて頂けないでしょうか。
出来ない様でしたら、一言でも良いので「出来ない」と
教えて頂ける幸いです。

環境は以下の通りです。
RedHat Linux9
sendmail-8.12.8-9.90

宜しくお願い致します。
kaz
ぬし
会議室デビュー日: 2003/11/06
投稿数: 5403
投稿日時: 2005-12-27 22:31
こんばんわ.
引用:

magiさんの書き込み (2005-12-27 16:56) より:

出来ない様でしたら、一言でも良いので「出来ない」と
教えて頂ける幸いです。


.forward ではできません.

環境が sendmail -> sendmail なら,
UID/GID とともに持ち込めばそのまま利用できると思いますけど...
もう一つの方法として「取りに来る」のはドウでしょう?
new server から old server へ,
fetchmail を使えば取りに行って MTA に放り込んで,
そのまま spool に格納することができます.
magi
会議室デビュー日: 2004/09/17
投稿数: 6
投稿日時: 2005-12-28 17:58
引用:

kazさんの書き込み (2005-12-27 22:31) より:
こんばんわ.

.forward ではできません.

環境が sendmail -> sendmail なら,
UID/GID とともに持ち込めばそのまま利用できると思いますけど...
もう一つの方法として「取りに来る」のはドウでしょう?
new server から old server へ,
fetchmail を使えば取りに行って MTA に放り込んで,
そのまま spool に格納することができます.




kazさん、有難う御座います。

今回は顧客には、「多分無理だと思います。」と伝えたら、「なら良いやっ」
と言われました。

1つ目の方法は、サーバ移行の場合に使用する方法ですよね。
状況と致しましては、以下の通りです。

・出張先でノートパソコン(Windows)しか持っていない。
・この方法を行う為のサーバを所有していない。
・外からのアクセスが出来ない。

ですので、無理かと思われます。

2番目の方法ですが、fetchmailは聞いた事があります。
しかし、該当者のパスワードが必要になるかとなるかと思われますが、
パスワードなしでも可能なのでしょうか。

一時的にパスワードを変更し、fetchmailで転送。そして、該当者が戻っ
てきたら、元のパスワードを元に戻してもらうという方法でも良いので
すが、出来れば1台のサーバで処理出来れば一番良いいのですが。

とてもよい機会ですので、fetchmailに関しては個人的に試してみたいと
思います。本当に有難う御座いました。

余談ではありますが、転送方法としては、「.forward,procmail,fetchmail」
の他にもあるのでしょか。
kaz
ぬし
会議室デビュー日: 2003/11/06
投稿数: 5403
投稿日時: 2005-12-28 18:51
引用:

magiさんの書き込み (2005-12-28 17:58) より:

2番目の方法ですが、fetchmailは聞いた事があります。
しかし、該当者のパスワードが必要になるかとなるかと思われますが、
パスワードなしでも可能なのでしょうか。

一時的にパスワードを変更し、fetchmailで転送。そして、該当者が戻っ
てきたら、元のパスワードを元に戻してもらうという方法でも良いので
すが、出来れば1台のサーバで処理出来れば一番良いいのですが。


password なしでもできないことは無いと思いますけど,
そのための手順を考えるのが億劫だったりしないでしょうか?
/etc/passwd や /etc/shadow をドーにかして,
※backup を採って password 欄を弄るとか.
終わったら元に戻すとか...
でも fetchmail 側は user account 毎になるので
大きな労力が必要だったりすると思います.
引用:

余談ではありますが、転送方法としては、「.forward,procmail,fetchmail」
の他にもあるのでしょか。


.forward に似た動きをするものとして aliases がありますね.

以上,ご参考までに.
magi
会議室デビュー日: 2004/09/17
投稿数: 6
投稿日時: 2006-01-04 11:33
引用:

kazさんの書き込み (2005-12-28 18:51) より:

password なしでもできないことは無いと思いますけど,
そのための手順を考えるのが億劫だったりしないでしょうか?
/etc/passwd や /etc/shadow をドーにかして,
※backup を採って password 欄を弄るとか.
終わったら元に戻すとか...
でも fetchmail 側は user account 毎になるので
大きな労力が必要だったりすると思います.



そうですか・・・
poppasswdも使用している為、shadowファイル内の該当者の部分だけ
バックアップをとってというのは危険すよね。

やはり、顧客の方には「出来ません」と言っておいて良かったです。

教えて頂き、有難う御座いました。

引用:

引用:

余談ではありますが、転送方法としては、「.forward,procmail,fetchmail」
の他にもあるのでしょか。


.forward に似た動きをするものとして aliases がありますね.



確かにaliasesでも転送は可能ですね。
忘れておりました。有難う御座います。
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2006-03-04 19:42
8年ぐらい前に「作れ」と言われて造ったもんです。
今、動くんでしょうかね? (プ

ddelv.sh
コード:
#!/bin/sh
#
TADDR="target-to-transfer@mail.account.ne.jp" #転送先メアド
ACCT="local-mail-account-name"                #転送元アカウント名
#ACCT=*
#
OS="Sun"
#
if [ $OS = "linux" ]; then
    PDIR="/var/spool/mail/"
elif [ $OS = "Sun" ]; then
    PDIR="/var/mail/"
    IDIR="/var/spool/imap/"
fi
#
FPATH=$PDIR$ACCT
SPATH=$IDIR$ACCT
#
cf="pop"
#
for PPATH in $FPATH
do

    USER=`echo $PPATH | sed 's/^.*\///'`
    FILE=$PPATH
#
    ./sm8.pl $TADDR $FILE
#

    cnt=`expr 0`
    while :
    do
        if [ -f $USER.$cf.$cnt ]; then
            mail $TADDR < $USER.$cf.$cnt
#
            if [ $? -eq 0 ]; then
                rm $USER.$cf.$cnt
            fi
        else
            break
        fi
        cnt=`expr $cnt + 1`
    done
#
done
#
PPATH=""
#
cf="imap"
#
for PPATH in $SPATH
do

    USER=`echo $PPATH | sed 's/^.*\///'`
    FILE=$PPATH/mbox
#
    ./sm8.pl $TADDR $FILE
#
    cnt=`expr 0`
    while :
    do
        if [ -f $USER.$cf.$cnt ]; then
            mail $TADDR < $USER.$cf.$cnt
#
            if [ $? -eq 0 ]; then
                rm $USER.$cf.$cnt
            fi
        else
            break
        fi
        cnt=`expr $cnt + 1`
    done
#
done
#
echo "処理完了"
exit 0



sm8.pl
コード:
#!/usr/bin/perl
#
$argc = @ARGV;
#
if($argc != 2){
    die "Usage:[1code]#!/usr/bin/perl
#
$argc = @ARGV;
#
if($argc != 2){
    die "Usage:$0 宛先メールアドレス 対象メールボックス\n";
}
#
$file = $ARGV[1];
$file =~ s/^.*\///;
#
if($file eq "mbox"){
    $user = $ARGV[1];
    $user =~ s/\/mbox//;
    $user =~ s/^.*imap\///;
    $middle="imap";
}
else {
    $user = $file;
    $middle="pop"
}
#
$passwd = "/etc/passwd";
open(PIN, "<$passwd");
$acf = "0";
#
while(<PIN>){
    @pw_nam = split(/:/, $_);
    if($user eq $pw_nam[0]){
        $acf = "1";
    }
}
#
close(PIN);
#
if($acf eq "0"){
    die "アカウント: $user が見つかりません。\n";
}
#
@new = ();
@argv = splice(@ARGV, 1, $argc, @new);
#
foreach $arg (@argv){

    open(IN, "<$arg") || die "入力ファイル [$arg] が開けません。\n";

    $fflg = "0";
    $tflg = "0";
    $sflg = "0";
    $mflg = "0";
    $cflg = "0";
    $dflg = "0";
    $elen = 0;

    $cnt  = 0;
    $cond = "0";

    @f = ();
    $to = "";
    @s = ();
    @m = ();
    @c = ();

    while(<IN>){
        if(/^From /){
            if($dflg eq "1"){
                close(OUT);
            }

            @f = ();
            $to = "";
            @s = ();
            @m = ();
            @c = ();
#
            $fflg = "0";
            $tflg = "0";
            $sflg = "0";
            $mflg = "0";
            $cflg = "0";
            $dflg = "0";
#
            $elen = 0;
            $cond = "0";
        }
#
        if(/^From: /){
            $elen = @f;
            if($fflg eq "0" && $elen != 0){
                print "ファイル [$out] の \"From: \"行[$.] が曖昧。\n";
                @f = ();
                $fflg = "0";
            }
            else {
                $fflg = "1";
                $tflg = "0";
                $sflg = "0";
                $mflg = "0";
                $cflg = "0";
            }
        }
        elsif(/^To: /){
            if($tflg eq "1"){
                print "ファイル [$out] の \"To: \"行[$.] が曖昧。\n";
                $to = "";
                $tflg = "0";
            }
            else {
                if($to eq ""){
                    $to = "To: $ARGV[0]";
                    $tflg = "1";
                    $fflg = "0";
                    $sflg = "0";
                    $mflg = "0";
                    $cflg = "0";
                }
            }
        }
        elsif(/^Subject: /){
            $elen = @s;
            if($sflg eq "0" && $elen != 0){
                print "ファイル [$out] の \"Subject: \"行[$.] が曖昧。\n";
                @s = ();
                $sflg = "0";
            }
            else {
                $sflg = "1";
                $fflg = "0";
                $tflg = "0";
                $mflg = "0";
                $cflg = "0";
            }
        }
        elsif(/^MIME-Version: /){
            $elen = @m;
            if($mflg eq "0" && $elen != 0){
                print "ファイル [$out] の \"MIME\"行[$.] が曖昧。\n";
                @m = ();
                $mflg = "0";
            }
            else {
                $mflg = "1";
                $fflg = "0";
                $tflg = "0";
                $sflg = "0";
                $cflg = "0";
            }
        }
        elsif(/^Content-/){
            $elen = @c;
            if($elen != 0){
#                print "ファイル [$out] の \"Content\"行[$.] が曖昧。\n";
            }
            $cflg = "1";
            $fflg = "0";
            $tflg = "0";
            $sflg = "0";
            $mflg = "0";
        }
        elsif(/^$/){
            if($dflg eq "0"){
                $fel = @f;
                $sel = @s;
                if($fel != 0 && $to ne "" && $sel != 0){
                    $putd = "/home/cobra/Mail/";
                    $out = $putd."$user.$middle.$cnt";
                    open(OUT, ">$out") || die "出力ファイル [$out] が開けません。\n";
#
                    $cnt++;
#
                    foreach $buf (@f){
                        print OUT $buf;
                    }

                    print OUT "$to\n";

                    foreach $buf (@s){
                        print OUT $buf;
                    }
                    foreach $buf (@m){
                        print OUT $buf;
                    }
                    foreach $buf (@c){
                        print OUT $buf;
                    }
                    $cond = "1";
                }
                else {
                    if($fel == 0){
                        print "ファイル [$user.$middle.$cnt] の \"From: \" 行が見つかりません。\n";
                    }
                    if($to eq ""){
                        print "ファイル [$user.$middle.$cnt] の \"To: \" 行が見つかりません。\n";
                    }
                    if($sel == 0){
                        print "ファイル [$user.$middle.$cnt] の \"Subject: \" 行が見つかりません。\n";
                    }
                }
#
                @f = ();
                $t = "";
                @s = ();
                @m = ();
                @c = ();
#
                $fflg = "1";
                $tflg = "0";
                $sflg = "1";
                $mflg = "1";
                $cflg = "1";
                $dflg = "1";
            }
        }
        else {
            if($dflg eq "0"){
                if(/^[A-Z].*:/){
                    if($fflg eq "1"){
                        $fflg = "0";
                    }
                    if($sflg eq "1"){
                        $sflg = "0";
                    }
                    if($mflg eq "1"){
                        $mflg = "0";
                    }
                    if($cflg eq "1"){
                        $cflg = "0";
                    }
                }
            }
        }
#
        if($dflg eq "0"){
            if($fflg eq "1"){
                push(@f, $_);
            }
            elsif($sflg eq "1"){
                push(@s, $_);
            }
            elsif($mflg eq "1"){
                push(@m, $_);
            }
            elsif($cflg eq "1"){
                push(@c, $_);
            }
        }
        else {
            if($cond eq "1"){
                print OUT;
            }
        }
#
    }
    close(IN);
    close(OUT);
}
#
print "処理終了\n";
#
exit 0;[/code1] 宛先メールアドレス 対象メールボックス\n";
}
#
$file = $ARGV[1];
$file =~ s/^.*\///;
#
if($file eq "mbox"){
    $user = $ARGV[1];
    $user =~ s/\/mbox//;
    $user =~ s/^.*imap\///;
    $middle="imap";
}
else {
    $user = $file;
    $middle="pop"
}
#
$passwd = "/etc/passwd";
open(PIN, "<$passwd");
$acf = "0";
#
while(<PIN>){
    @pw_nam = split(/:/, $_);
    if($user eq $pw_nam[0]){
        $acf = "1";
    }
}
#
close(PIN);
#
if($acf eq "0"){
    die "アカウント: $user が見つかりません。\n";
}
#
@new = ();
@argv = splice(@ARGV, 1, $argc, @new);
#
foreach $arg (@argv){

    open(IN, "<$arg") || die "入力ファイル [$arg] が開けません。\n";

    $fflg = "0";
    $tflg = "0";
    $sflg = "0";
    $mflg = "0";
    $cflg = "0";
    $dflg = "0";
    $elen = 0;

    $cnt  = 0;
    $cond = "0";

    @f = ();
    $to = "";
    @s = ();
    @m = ();
    @c = ();

    while(<IN>){
        if(/^From /){
            if($dflg eq "1"){
                close(OUT);
            }

            @f = ();
            $to = "";
            @s = ();
            @m = ();
            @c = ();
#
            $fflg = "0";
            $tflg = "0";
            $sflg = "0";
            $mflg = "0";
            $cflg = "0";
            $dflg = "0";
#
            $elen = 0;
            $cond = "0";
        }
#
        if(/^From: /){
            $elen = @f;
            if($fflg eq "0" && $elen != 0){
                print "ファイル [$out] の \"From: \"行[$.] が曖昧。\n";
                @f = ();
                $fflg = "0";
            }
            else {
                $fflg = "1";
                $tflg = "0";
                $sflg = "0";
                $mflg = "0";
                $cflg = "0";
            }
        }
        elsif(/^To: /){
            if($tflg eq "1"){
                print "ファイル [$out] の \"To: \"行[$.] が曖昧。\n";
                $to = "";
                $tflg = "0";
            }
            else {
                if($to eq ""){
                    $to = "To: $ARGV[0]";
                    $tflg = "1";
                    $fflg = "0";
                    $sflg = "0";
                    $mflg = "0";
                    $cflg = "0";
                }
            }
        }
        elsif(/^Subject: /){
            $elen = @s;
            if($sflg eq "0" && $elen != 0){
                print "ファイル [$out] の \"Subject: \"行[$.] が曖昧。\n";
                @s = ();
                $sflg = "0";
            }
            else {
                $sflg = "1";
                $fflg = "0";
                $tflg = "0";
                $mflg = "0";
                $cflg = "0";
            }
        }
        elsif(/^MIME-Version: /){
            $elen = @m;
            if($mflg eq "0" && $elen != 0){
                print "ファイル [$out] の \"MIME\"行[$.] が曖昧。\n";
                @m = ();
                $mflg = "0";
            }
            else {
                $mflg = "1";
                $fflg = "0";
                $tflg = "0";
                $sflg = "0";
                $cflg = "0";
            }
        }
        elsif(/^Content-/){
            $elen = @c;
            if($elen != 0){
#                print "ファイル [$out] の \"Content\"行[$.] が曖昧。\n";
            }
            $cflg = "1";
            $fflg = "0";
            $tflg = "0";
            $sflg = "0";
            $mflg = "0";
        }
        elsif(/^$/){
            if($dflg eq "0"){
                $fel = @f;
                $sel = @s;
                if($fel != 0 && $to ne "" && $sel != 0){
                    $putd = "/home/cobra/Mail/";
                    $out = $putd."$user.$middle.$cnt";
                    open(OUT, ">$out") || die "出力ファイル [$out] が開けません。\n";
#
                    $cnt++;
#
                    foreach $buf (@f){
                        print OUT $buf;
                    }

                    print OUT "$to\n";

                    foreach $buf (@s){
                        print OUT $buf;
                    }
                    foreach $buf (@m){
                        print OUT $buf;
                    }
                    foreach $buf (@c){
                        print OUT $buf;
                    }
                    $cond = "1";
                }
                else {
                    if($fel == 0){
                        print "ファイル [$user.$middle.$cnt] の \"From: \" 行が見つかりません。\n";
                    }
                    if($to eq ""){
                        print "ファイル [$user.$middle.$cnt] の \"To: \" 行が見つかりません。\n";
                    }
                    if($sel == 0){
                        print "ファイル [$user.$middle.$cnt] の \"Subject: \" 行が見つかりません。\n";
                    }
                }
#
                @f = ();
                $t = "";
                @s = ();
                @m = ();
                @c = ();
#
                $fflg = "1";
                $tflg = "0";
                $sflg = "1";
                $mflg = "1";
                $cflg = "1";
                $dflg = "1";
            }
        }
        else {
            if($dflg eq "0"){
                if(/^[A-Z].*:/){
                    if($fflg eq "1"){
                        $fflg = "0";
                    }
                    if($sflg eq "1"){
                        $sflg = "0";
                    }
                    if($mflg eq "1"){
                        $mflg = "0";
                    }
                    if($cflg eq "1"){
                        $cflg = "0";
                    }
                }
            }
        }
#
        if($dflg eq "0"){
            if($fflg eq "1"){
                push(@f, $_);
            }
            elsif($sflg eq "1"){
                push(@s, $_);
            }
            elsif($mflg eq "1"){
                push(@m, $_);
            }
            elsif($cflg eq "1"){
                push(@c, $_);
            }
        }
        else {
            if($cond eq "1"){
                print OUT;
            }
        }
#
    }
    close(IN);
    close(OUT);
}
#
print "処理終了\n";
#
exit 0;


1

スキルアップ/キャリアアップ(JOB@IT)