[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 メーリングリストの案内