[Mew-dist 03439] [im] imget by IMAP

Yuuichi Teranishi 寺西裕一 teranisi at example.com
1998年 1月 19日 (月) 10:55:26 JST


寺西@にわか IMAP ユーザ です。

IMAP で imget する機能をほんのすこし向上させるパッチを作ってみました。
変更点は、

 * imget で --count で指定された数のメールだけ取って来るようにする。
 * imget でも ImapAccount をみるようにする。
 * imget で存在しない IMAP フォルダを src に指定するとハングするのを直す。
 * IMAP 関連のメッセージで src となったフォルダ名を表示するようにする。
 * IMAP 関連のエラーメッセージを少し親切にする。

です。
以下、im-82 に対するパッチになっています。

--
Yuuichi Teranishi (寺西裕一) <teranisi at example.com>
NTT Information and Communication Systems Laboratories
The love you take is equal to the love you make...

-------------- next part --------------
--- imget.in~	Wed Jan 14 14:43:11 1998
+++ imget.in	Mon Jan 19 09:59:38 1998
@@ -194,7 +194,7 @@
 	$msgs = &pop_get_msg($src, $dst, $mode);
     } elsif ($src =~ /^imap/i) {
 	require IM::Imap && import IM::Imap;
-	$msgs = &imap_get_msg($src, $dst, $mode);
+	$msgs = &imap_get_msg($src, $dst, $mode, $opt_count);
     } elsif ($src =~ /^nntp/i || $src =~ /^news/i) {
 	require IM::Nntp && import IM::Nntp;
 	$msgs = &nntp_get_msg($src, $dst, $mode, $opt_count);
-------------- next part --------------
--- Imap.pm.in~	Mon Jan 19 10:29:02 1998
+++ Imap.pm.in	Mon Jan 19 10:18:40 1998
@@ -522,16 +522,20 @@
     return 0;
 }
 
-# imap_process(handle, how, host, src, dst)
-sub imap_process ($$$$$) {
-    my ($HANDLE, $how, $host, $src, $dst) = @_;
-    my ($msgs);
-    return -1 if (($msgs = &imap_select($HANDLE, $src, 1)) < 0);
+# imap_process(handle, how, host, src, dst, limit)
+sub imap_process ($$$$$$) {
+    my ($HANDLE, $how, $host, $src, $dst, $limit) = @_;
+    my ($msgs, $count) = (0, 0);
+     if (($msgs = &imap_select($HANDLE, $src, 1)) < 0) {
+         im_warn("selecting folder $src failed.\n"); 
+         return -1;
+     }
+    $limit = $msgs if ($limit == 0);
     if ($how eq 'check') {
 	if ($msgs > 0) {
-	    im_msg("$msgs message(s) at $host.\n");
+	    im_msg("$msgs message(s) in $src at $host.\n");
 	} else {
-	    im_msg("no message at $host.\n");
+	    im_msg("no message in $src at $host.\n");
 	}
     } elsif ($how eq 'from') {
 	if ($msgs > 0) {
@@ -541,9 +545,9 @@
 	    foreach $i (@alluids) {
 		return -1 if (&imap_from($HANDLE, $i) < 0);
 	    }
-	    im_info("$msgs message(s) at $host.\n");
+	    im_info("$msgs message(s) in $src at $host.\n");
 	} else {
-	    im_info("no message at $host.\n");
+	    im_info("no message in $src at $host.\n");
 	}
     } elsif ($how eq 'get') {
 	if ($msgs > 0) {
@@ -552,24 +556,32 @@
 	    return -1 if ($alluids[0] < 0);
 	    my $i;
 	    foreach $i (@alluids) {
+	        if ($count >= $limit) {
+		    im_info("$count message(s).\n");
+		    return $count;
+		}  
 		my ($rc, $message) = &imap_get($HANDLE, $i);
 		return -1 if ($rc < 0);
 		return -1 if (&store_message($message, $dst) < 0);
 		&exec_getsbrfile($dst);
 		unless ($main::opt_keep) {
-		    return -1 if (&imap_delete($HANDLE, $i) < 0);
+ 		    if (&imap_delete($HANDLE, $i) < 0) {
+ 		        im_warn("deleting message $i failed.");
+ 		        return -1;
+ 		    }  		  
 		}
+		$count++;
 	    }
 	    im_info("$msgs message(s).\n");
 	} else {
-	    im_info("no messages at $host.\n");
+	    im_info("no message in $src at $host.\n");
 	}
     }
     return $msgs;
 }
 
-sub imap_get_msg ($$$) {
-    my ($src, $dst, $how) = @_;
+sub imap_get_msg ($$$$) {
+    my ($src, $dst, $how, $limit) = @_;
 
     $src =~ s/^imap//i;
 
@@ -596,10 +608,8 @@
     if ($rc == 0) {
 	&savepass('imap', $auth, $host, $user, $pass)
 	    if ($pass ne '' && $interact && &usepwagent());
-	my $msgs = &imap_process($HANDLE, $how, $host, $folder, $dst);
-	if ($msgs < 0) {
-	    im_warn("IMAP processing error.\n");
-	}
+	my $msgs = &imap_process($HANDLE, $how, $host, $folder, $dst, $limit);
+	return -1 if ($msgs < 0);
 	&imap_close($HANDLE);
 	return $msgs;
     } else {
@@ -614,20 +624,7 @@
 sub imap_spec ($) {
     my $spec = shift;
 
-    if ($spec eq '') {
-	my $s = imapaccount();
-	if ($s !~ /^[\/\@:]/) {
-	    if ($s =~ /\@/) {
-		$s = ":$s";
-	    } else {
-		$s = "\@$s";
-	    }
-	}
-	$spec = $s if ($s ne '');
-    }
-
-    my ($folder, $auth, $host) = ('INBOX', 'auth', 'localhost');
-    my $user = $ENV{'USER'} || $ENV{'LOGNAME'} || im_getlogin();
+    my ($folder, $auth, $host, $user) = ('INBOX', 'auth', '', '');
 
     while ($spec ne '') {
 	if ($spec =~ /^%([^%:\@]+)(.*)/) {	# XXX
@@ -645,6 +642,20 @@
 	$spec = $2;
     }
 
+    if (($user eq '') || ($host eq '')) {
+ 	my $s = imapaccount();
+ 	if ($s =~ /(.+)\@(.+)/) {
+ 	    $user = $1;
+ 	    $host = $2;
+ 	} elsif ($s =~ /\@(.+)/){
+ 	    $user = $ENV{'USER'} || $ENV{'LOGNAME'} || im_getlogin();
+ 	    $host = $1;
+ 	} else {
+ 	    $user = $s;
+	    $host = "localhost";
+	}
+    }    
+
     if ($auth =~ /^auth$/i) {
 	$auth = 'AUTH';
     } elsif ($auth =~ /^login$/i) {
@@ -653,7 +664,7 @@
 	im_warn("unknown authentication protocol: $auth\n");
 	return ('', '', '', '');
     }
-
+    im_notice("folder=$folder auth=$auth user=$user host=$host\n");
     return ($folder, $auth, $user, $host);
 }
 


Mew-dist メーリングリストの案内