[Mew-dist 07794] imget option
Ayako Yui
a-yui at example.com
1999年 3月 1日 (月) 01:11:25 JST
はじめまして、ゆいと申します。いつも mew を便利に使わせてもらっていま
す(使いはじめてまもないですが、、、)。これからもよろしくお願いします。
私は mew-1.93 + im-100 を使っています。最近メイル専用のサーバーを有効
活用しようかなと思い、POP または IMAP を使うことを考えています。それで
困ったのが biff です。現状はローカルマシンにメイルを転送していて
xpbiff というソフトを使用しているのですが、メイル専用サーバでは使えま
せん。一般的にどのようにするのがいいのか知らないのですが、いろいろ考え
て imget --mode=from を xpbiff の -scan_command オプションに指定するこ
とにしました(最初は imls が pop でも出来ると勘違いしていました(^_^;))。
で、現状の --mode=from は差出人しか出なくて淋しかったので、以下のよう
な改造をやってみました。何せ perl は書いたことがなく良くわかっていない
のですが、、、(といっても全部コピーして消しているだけ(^_^;))。それでお
聞きしたいのが、このような変更は最新ソースに反映してもらえるのでしょう
か?あまり使う人はいないでしょうけど。。。。また他にもっといい方法があ
るとか、私はこうやっているなどありましたら教えて下さい。よろしくお願い
します。
・修正内容
--mode=scan というオプションを追加しました。imget 用の Form と Width
の指定が Config ファイルで出来たらいいなと思ったのですが、まずはハー
ドコーディングしてしまいました。ちなみにどのような修正をすればいいの
か御教授していただければ幸いです。それと今考えている使い方として
local と pop で取って来た情報を biff で表示させることを考えているの
で、imap, nntp 等では動かないです(手抜き。。。)。
-------------- next part --------------
diff -r -c im-100/IM/LocalMbox.pm im-100-patch/IM/LocalMbox.pm
*** im-100/IM/LocalMbox.pm Fri Sep 4 23:04:21 1998
--- im-100-patch/IM/LocalMbox.pm Mon Mar 1 00:50:43 1999
***************
*** 17,23 ****
use Fcntl;
use IM::Config;
use IM::Util;
! use IM::MsgStore qw(store_message exec_getsbrfile);
use integer;
use strict;
use vars qw(@ISA @EXPORT);
--- 17,23 ----
use Fcntl;
use IM::Config;
use IM::Util;
! use IM::MsgStore qw(scan_message store_message exec_getsbrfile);
use integer;
use strict;
use vars qw(@ISA @EXPORT);
***************
*** 164,170 ****
im_msg("no message in local maildir.\n");
} elsif ($how eq 'from') {
im_info("no message in local maildir.\n");
! } else {
im_info("no messages in local maildir.\n");
}
return 0;
--- 164,170 ----
im_msg("no message in local maildir.\n");
} elsif ($how eq 'from') {
im_info("no message in local maildir.\n");
! } elsif ($how eq 'get') {
im_info("no messages in local maildir.\n");
}
return 0;
***************
*** 200,206 ****
im_msg("no message in local mailbox.\n");
} elsif ($how eq 'from') {
im_info("no message in local mailbox.\n");
! } else {
im_info("no messages in local mailbox.\n");
}
return 0;
--- 200,206 ----
im_msg("no message in local mailbox.\n");
} elsif ($how eq 'from') {
im_info("no message in local mailbox.\n");
! } elsif ($how eq 'get') {
im_info("no messages in local mailbox.\n");
}
return 0;
***************
*** 324,330 ****
if ($Message[$#Message] eq "\n") {
pop (@Message);
}
! if ($how eq 'get') {
if (&store_message(\@Message, $dst) < 0) {
close(MBOX);
return -1;
--- 324,335 ----
if ($Message[$#Message] eq "\n") {
pop (@Message);
}
! if ($how eq 'scan') {
! if (&scan_message(\@Message, $msgs) < 0) {
! close(MBOX);
! return -1;
! }
! } elsif ($how eq 'get') {
if (&store_message(\@Message, $dst) < 0) {
close(MBOX);
return -1;
***************
*** 336,341 ****
--- 341,348 ----
im_msg("$msgs message(s) in local mailbox.\n");
} elsif ($how eq 'from') {
im_info("$msgs message(s) in local mailbox.\n");
+ } elsif ($how eq 'scan') {
+ flush('STDOUT');
} elsif ($how eq 'get') {
flush('STDOUT');
im_info("$msgs message(s).\n");
diff -r -c im-100/IM/MsgStore.pm im-100-patch/IM/MsgStore.pm
*** im-100/IM/MsgStore.pm Fri Sep 4 23:04:25 1998
--- im-100-patch/IM/MsgStore.pm Sun Feb 28 01:46:35 1999
***************
*** 24,30 ****
use vars qw(@ISA @EXPORT);
@ISA = qw(Exporter);
! @EXPORT = qw(store_message exec_getsbrfile open_fcc excl_create fsync);
=head1 NAME
--- 24,30 ----
use vars qw(@ISA @EXPORT);
@ISA = qw(Exporter);
! @EXPORT = qw(scan_message store_message exec_getsbrfile open_fcc excl_create fsync);
=head1 NAME
***************
*** 87,92 ****
--- 87,124 ----
im_warn("excl_create failed.\n");
# message creation failed
return ('', '');
+ }
+
+ sub scan_message ($$) {
+ my ($Msg, $count) = @_;
+ require IM::Scan && import IM::Scan qw(store_header parse_header
+ parse_body disp_msg);
+
+ my $size = 0;
+ my $line;
+ my $hcount = 0;
+ my $inheader = 1;
+ foreach $line (@$Msg) {
+ $size += length($line);
+ if ($line eq "\n") {
+ $inheader = 0;
+ }
+ $hcount++ if ($inheader);
+ }
+
+ my @Hdr = @$Msg[0..$hcount];
+ my %Head;
+ store_header(\%Head, join('', @Hdr));
+
+ splice(@$Msg, 0, $hcount);
+ $Head{'body:'} = &parse_body($Msg, 1);
+
+ # $Head{'bytes:'} = $size;
+ $Head{'kbytes:'} = int(($size + 1023) / 1024);
+ $Head{'number:'} = $count;
+ &parse_header(\%Head);
+ &disp_msg(\%Head);
+ return 0;
}
sub store_message ($$) {
diff -r -c im-100/IM/Pop.pm im-100-patch/IM/Pop.pm
*** im-100/IM/Pop.pm Fri Sep 4 23:04:28 1998
--- im-100-patch/IM/Pop.pm Mon Mar 1 01:01:17 1999
***************
*** 137,142 ****
--- 137,175 ----
return $field[1];
}
+ sub pop_list ($$) {
+ my ($num, $count) = @_;
+ local ($_);
+ my (@Message);
+ im_notice("getting message $num.\n");
+ my $resp = &send_command(\*POPd, "RETR $num", '');
+ if ($resp !~ /^\+/) {
+ im_warn("RETR command failed.\n");
+ return -1;
+ }
+ alarm(pop_timeout()) unless win95p();
+ $! = 0;
+ while (<POPd>) {
+ unless (win95p()) {
+ alarm(0);
+ if ($!) { # may be channel truoble
+ im_warn("lost connection for RETR.\n");
+ return -1;
+ }
+ }
+ s/\r\n$/\n/;
+ last if ($_ =~ /^\.\n$/);
+ s/^\.//;
+ im_debug($_) if (&debug('pop'));
+ push (@Message, $_);
+ }
+ alarm(0) unless win95p();
+
+ return -1 if (&scan_message(\@Message, $count) < 0);
+
+ return 0;
+ }
+
sub pop_retr ($$) {
my ($num, $dst) = @_;
local ($_);
***************
*** 394,399 ****
--- 427,435 ----
} else {
im_info("no message at $host.\n");
}
+ } elsif ($how eq 'scan') {
+ $new = &pop_scan($msgs, $host, $dst, $last,
+ $keep_proto, \%history, \@uidl);
} elsif ($how eq 'get') {
$new = &pop_inc($msgs, $host, $dst, $last,
$keep_proto, \%history, \@uidl);
***************
*** 419,424 ****
--- 455,536 ----
}
}
return $new;
+ }
+
+ sub pop_scan ($$$$$$$) {
+ my ($msgs, $host, $dst, $last, $keep_proto, $histp, $uidlp) = @_;
+ my ($accesstime, $i, $h, $head);
+ my $count = 1;
+ my $got = 0;
+ my $ttl = 0;
+
+ if ($msgs <= 0) {
+ return 0;
+ }
+
+ if ($main::opt_keep >= 0) {
+ $ttl = $main::opt_keep * 60*60*24;
+ } else {
+ $ttl = -1;
+ }
+ $accesstime = time;
+
+ for ($i = $last; $i <= $msgs; $i++) {
+ if ($main::opt_ignorepostpet) {
+ $head = &pop_head($i);
+ if ($head->{'x-mailer'} =~ /PostPet/i
+ && $head->{'content-type'} =~ /multipart.+kiritorisen/i) {
+ next;
+ }
+ }
+ if ($main::opt_keep != 0) {
+ if ($keep_proto eq 'UIDL') {
+ if ($$uidlp[$i] eq '') {
+ im_notice("no UIDL info. from the server.\n");
+ next;
+ }
+ if ($$histp{$$uidlp[$i]} ne '') {
+ im_notice("found UIDL info. in the history.\n");
+ if ($ttl >= 0
+ && $$histp{$$uidlp[$i]} + $ttl < $accesstime) {
+ im_notice("too old message; deleted.\n");
+ if (&pop_dele($i) >= 0) {
+ $$histp{$$uidlp[$i]} = 0;
+ }
+ }
+ next;
+ }
+ $$histp{$$uidlp[$i]} = $accesstime;
+ } elsif ($keep_proto eq 'STATUS' || $keep_proto eq 'MSGID') {
+ $head = &pop_head($i) unless ($main::opt_ignorepostpet);
+ my $mid = $head->{'message-id'};
+ next if ($mid eq '');
+ $mid =~ s/.*<(.*)>.*/$1/;
+ if ($head->{'status'} =~ /RO/) {
+ if ($$histp{$mid} ne '') {
+ im_notice("found Message-Id info. in the history.\n");
+ if ($ttl >= 0 && $$histp{$mid} + $ttl < $accesstime) {
+ im_notice("too old message; deleted.\n");
+ next if (&pop_dele($i) >= 0);
+ }
+ $newhistory{$mid} = $$histp{$mid};
+ next;
+ } elsif ($keep_proto eq 'STATUS') {
+ $newhistory{$mid} = $accesstime;
+ next;
+ }
+ }
+ $newhistory{$mid} = $accesstime;
+ # } elsif ($keep_proto eq 'LAST') {
+ # # XXX everything will be kept
+ }
+ }
+ return -1 if (&pop_list($i, $count) < 0);
+ $count++;
+ $got++;
+ }
+ flush('STDOUT');
+ return $got;
}
sub pop_inc ($$$$$$$) {
diff -r -c im-100/imget.in im-100-patch/imget.in
*** im-100/imget.in Fri Sep 4 23:03:51 1998
--- im-100-patch/imget.in Sun Feb 28 18:57:07 1999
***************
*** 81,87 ****
'usecl;b;;Obey_CL' => "Use value of Content-Length header for delimitation".
".\n\t\t(effective only if source of messages is local).\n" ,
'count;i;;' => 'Number of messages to be gotten in a process (NNTP)',
! 'mode;s;get;' => 'Processing mode: "get", "from" or "check".',
'assoc;s;;' => "Association list: dst1=src1;dst2=src2;...\n" .
"\t\tThis overrides --dst and --src options.",
'quiet;b;;' => 'Suppress informational messages.',
--- 81,87 ----
'usecl;b;;Obey_CL' => "Use value of Content-Length header for delimitation".
".\n\t\t(effective only if source of messages is local).\n" ,
'count;i;;' => 'Number of messages to be gotten in a process (NNTP)',
! 'mode;s;get;' => 'Processing mode: "get", "from", "scan" or "check".',
'assoc;s;;' => "Association list: dst1=src1;dst2=src2;...\n" .
"\t\tThis overrides --dst and --src options.",
'quiet;b;;' => 'Suppress informational messages.',
***************
*** 149,155 ****
my $petnamefile = &petname_file();
read_petnames($petnamefile) if $petnamefile;
! &set_scan_form($opt_form, $opt_width, $opt_jissafe);
my ($assoc, $msgs);
if ($opt_assoc ne '') {
--- 149,158 ----
my $petnamefile = &petname_file();
read_petnames($petnamefile) if $petnamefile;
! my $opt_form2 = "%5n %m%d %-10A %-34S";
! my $opt_width2 = 60;
! &set_scan_form($opt_form2, $opt_width2, $opt_jissafe);
! #&set_scan_form($opt_form, $opt_width, $opt_jissafe);
my ($assoc, $msgs);
if ($opt_assoc ne '') {
***************
*** 182,188 ****
my ($src, $dst, $mode) = @_;
my ($msgs);
! if ($mode ne "get" && $mode ne "check" && $mode ne "from"
&& $mode ne "skip") {
im_die("unknown mode: $mode\n");
}
--- 185,191 ----
my ($src, $dst, $mode) = @_;
my ($msgs);
! if ($mode ne "get" && $mode ne "check" && $mode ne "from" && $mode ne "scan"
&& $mode ne "skip") {
im_die("unknown mode: $mode\n");
}
Mew-dist メーリングリストの案内