[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:09539] Re: mutt で書いたメールをディレクトリに溜めて送りたい



 こんにちは。岡部@東京都立大です。

Tue, Oct 27, 1998 at 09:24:01AM +0900 において
Yukinori YOSHIDA さん曰く:

> わたしは im を使ったことないので一般論になっちゃいますが、
> mutt から (sendmail ではなく) /usr/bin/foo にメールを渡す
> には、~/.muttrc に
> 
>   set sendmail="/usr/bin/foo"
> 
> とします。im だと foo が imput になるのでしょうか。
> 
> あとは imput -q でいいのではないかと。

 この方法を試してみましたが、ダメでした。
imputは、~/.im/queue/(番号)のファイルを送信しますが、
そのファイルにはimput特有のヘッダが必要みたいです。

 sendmailの設定もやってみたのですが、
だんだんめんどくさくなって
無謀にもimput用のヘッダを追加するプログラムを作ってしまいましたー。

添付してある"mutt_eater.c"というのがそれです。


使い方は
1、imput -q で送信できるようにimの設定をしておく
2、mutt_eater.cの16,18,20行を環境に合せて書き換える
3、gcc -o mutt_eater mutt_eater.c して sudo cp mutt_eater /usr/local/bin/mutt_eater
4、~/.muttrcに set sendmail="/usr/local/bin/mutt_eater" を追加

のように設定したあと、ふつーにmuttでメールを送信すると
~/.im/queue にメールが溜っているので、
PPP接続したときに imput -q で一括して送信できると思います。

以上の不親切きわまりない説明だけではあんまりなので、
近いうちにホームページに記事を載せるつもりです。


現在のmutt_eaterの制限や欠点は、
1、Bcc:ヘッダを読まない
2、メッセージIDがなんなのかを作者自身が知らない(;_;)
3、imput用のヘッダが適当すぎ
などです。

なにぶんド素人の作ったプログラムなので大量に不都合があると思われますので、
要望、文句、お叱りなどありましたら
メールいただけるとうれしいです。

-- 
-----
東京都立大学 電気工学科 電気物性工学講座     岡部 究
Mail: uxxyz@xxxxxxxxxxxxxxxxx
URL:  http://casper.eei.metro-u.ac.jp/~kiwamu/
-------------------------------------------------------------------
/*
 * mutt_eater.c
 * 
 * Version 0.1      Copyright (C) 1998  Kiwamu Okabe
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <sys/types.h>
#include <dirent.h>

#define BUFF_MAX 10000
/* メールを溜めておくディレクトリ */
#define QUEUE_DIR "/home/kiwamu/.im/queue"
/* 一時的に逃げとくファイル */
#define ESCAPE_LOG "/home/kiwamu/tmp/mutt_escape.log"
/* メールサーバ */
#define MAIL_SERV "kamome.wsc.metro-u.ac.jp"

/* line文字配列からspaceを抜いてr_lineに入れる('\n'も消される) */
char DelSpace(char *r_line,char *line)
{
   int i,j=0;
   
   for(i=0;i<strlen(line);++i)
     if(isspace(line[i])==0) {
	r_line[j]=line[i];
	++j;
     }
   r_line[j]='\0';
}

/* lineが数字のみだったら1、それ以外なら0を返す */
int AllIsdigit(char *line)
{
   int i;
   for(i=0;i<strlen(line);++i)
     if(isdigit(line[i])==0)
       return 0;
   return 1;
}

/* QUEUE_DIRに書き込むファイル名を得る */
int GetNewfile()
{
   int i,newfile=1;
   DIR *my_dir;
   struct dirent *my_dirent;
   
   my_dir=opendir(QUEUE_DIR);
   while((my_dirent=readdir(my_dir))!=NULL)
     if(AllIsdigit(my_dirent->d_name)!=0) {
	if(newfile<=atoi(my_dirent->d_name))
	  newfile=atoi(my_dirent->d_name)+1;
     }
   return newfile;
}

/* lineが空白文字しか含んでいなければ1、そうでなければ0 */
int AllIsspace(char *line)
{
   int i;
   for(i=0;i<strlen(line);++i)
     if(isspace(line[i])==0)
       return 0;
   return 1;
}

/* 最後に'\0'を追加してくれるstrncpy */
char *MyStrncpy(char *r_line,char *line,int n)
{
   strncpy(r_line,line,n);
   r_line[n]='\0';
}

/* line中のc1とc2で囲まれた最初の部分を抜き出す */
char *PickUp(char *r_line,char *line,int c1,int c2)
{
   char *pointer1,*pointer2;
   
   if((pointer1=strchr(line,c1))==NULL
      || (pointer2=strchr(line,c2))==NULL
      || pointer1>pointer2)
     return NULL;

   MyStrncpy(r_line,pointer1+1,pointer2-pointer1-1);
}

/* line中の','で区切りを分解してPickUpにかける */
char *SplitIt(char *r_line,char *line)
{
   int i;
   char *pointer1,*pointer2,buff1[BUFF_MAX],buff2[BUFF_MAX];
   
   r_line[0]='\0';
   /* ちょい危険かも */
   DelSpace(line,line);
   
   if((pointer1=strchr(line,':'))!=NULL)
     line=pointer1+1;
   if((pointer1=strchr(line,'\t'))!=NULL)
     line=pointer1+1;

   while((pointer1=strchr(line,','))!=NULL) {
      if(strchr(line,',')>strchr(line,'<') && strchr(line,',')>strchr(line,'>')) {
	 if(PickUp(buff1,line,'<','>')==NULL)
	   MyStrncpy(buff1,line,pointer1-line);
      } else {
	 MyStrncpy(buff1,line,pointer1-line);
      }
      
      sprintf(buff2,"<%s>,",buff1);
      strcat(r_line,buff2);
      line=pointer1+1;
   }
   
   if(AllIsspace(line)==0) {
      if(PickUp(buff1,line,'<','>')==NULL) {
	 pointer2=strchr(line,'\0');
	 MyStrncpy(buff1,line,pointer2-line);
      }
      
      sprintf(buff2,"<%s>,",buff1);
      strcat(r_line,buff2);
   }

   *strrchr(r_line,',')='\0';
}

/* main関数 */
int main(int argc,char *argv[])
{
   int i,c,flag;
   char buff1[BUFF_MAX],buff2[BUFF_MAX],*pointer,queuefile[BUFF_MAX];
   FILE *fp1,*fp2;
   
   sprintf(queuefile,"%s/%d",QUEUE_DIR,GetNewfile());
   
   /* とりあえずstdinをESCAPE_LOGに退避 */
   if((fp1 = fopen(ESCAPE_LOG,"w")) == NULL) {
      printf ("\n Cannot open file : %s\n\n",ESCAPE_LOG);
      exit(1);
   }
   while((c=getc(stdin))!=EOF)
     putc(c,fp1);
   fclose(fp1);
   
   /* queuefileにimput用のテキストを書く */
   if((fp1 = fopen(queuefile,"w")) == NULL) {
      printf ("\n Cannot open file : %s\n\n",queuefile);
      exit(1);
   }
 
   fprintf(fp1,"AF:\nNF:0\nPS:10\nSRH:1\nSFN:\nDSR:\nMID:\nCFG:\nPT:0\nS:\nRQ:\n");
   fprintf(fp1,"SSV:%s\nNSV:\nR:",MAIL_SERV);
   
   if((fp2 = fopen(ESCAPE_LOG,"r")) == NULL) {
      printf ("\n Cannot open file : %s\n\n",ESCAPE_LOG);
      exit(1);
   }
   while(fgets(buff1,BUFF_MAX,fp2)!=NULL && strncmp(buff1,"X-Mailer:",9)!=0) {
      if(strncmp(buff1,"To:",3)==0) {
	 SplitIt(buff2,buff1);
	 fprintf(fp1,"%s",buff2);
	 flag=1;
      } else { 
	 if(strncmp(buff1,"Cc:",3)==0) {
	    SplitIt(buff2,buff1);
	    fprintf(fp1,",%s",buff2);
	    flag=1;
	 } else {
	    if(flag==1 && strncmp(buff1,"\t",1)==0) {
	       SplitIt(buff2,buff1);
	       fprintf(fp1,",%s",buff2);
	       flag=1;
	    } else {
	       flag=0;
	    }
	 }
      }
   }
   fprintf(fp1,"\n\n");
   fclose(fp2);
   
   if((fp2 = fopen(ESCAPE_LOG,"r")) == NULL) {
      printf ("\n Cannot open file : %s\n\n",ESCAPE_LOG);
      exit(1);
   }
   while((c=getc(fp2))!=EOF)
     putc(c,fp1);
   fclose(fp1);
   fclose(fp2);
   
   /* うわー逃げだ */
   sprintf(buff1,"rm %s",ESCAPE_LOG);
   system(buff1);
}