1#!%PERL_PATH% 2#��� perl version 5 �Τ���ǥ��쥯�ȥ�ˤ��Ʋ������� 3## mail2nikki.pl (Project SHIMONODA) 4## Version 0.75 (8/11/2001) 5 6# Copyright (C) 1998-2001 Ken-ichi HASHIMOTO, HyperNikkiSystem Project 7 8# Special Thanks: 9# Mori Kouji <moriko@hh.iij4u.or.jp> 10# Seiji Hamaguchi <makoto@zob.ne.jp> 11# Masato Kawakami <masato@orange.co.jp> 12# TOKUMITSU Satoshi <tokumitsu@three-a.co.jp> 13 14# This program is free software; you can redistribute it and/or 15# modify it under the terms of the GNU General Public License 16# as published by the Free Software Foundation; either version 2 17# of the License, or (at your option) any later version. 18 19# This program is distributed in the hope that it will be useful, 20# but WITHOUT ANY WARRANTY; without even the implied warranty of 21# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 22# GNU General Public License for more details. 23 24# You should have received a copy of the GNU General Public License 25# along with this program; if not, write to the Free Software 26# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 27 28# $Id: mail2nikki.pl.in,v 1.21 2002/12/28 13:27:02 bonaim Exp $ 29 30require '%HTMLDIR%/lib/jcode.pl'; 31 32# $diaryDir �����Τ���ǥ��쥯�ȥ� 33$diaryDir = "%DIARYDIR%"; 34 35# ���������륢�ɥ쥹�� 36$mailAddress = '%FROMADDR%'; 37# ��Ƥ�������ɥ쥹(Fromǧ��) -ʣ���Υ��ɥ쥹����Ͽ��ǽ�Ǥ�- 38@certiy_mailAddress = ('%FROMADDR%', 'second_address'); 39# ������ From: ���ɥ쥹 40$recvMailAddress = '%FROMADDR%'; 41# GET �λ������륢�ɥ쥹 42$cmdGetAddress = ''; ## ��hnf:GET�פ����ä���륢�ɥ쥹������ޤ� 43 44# �ѥ���ɤǤ��� 45$MASTERPASSWD = "%PASSWORD%"; 46 47# LOGMODE ��ʸ������������ 0 ���顼���Τ�, 1 ���, 2 ���Ф��ʤ� 48$LOGMODE = 0; 49# status reporting mail 50$MAILMODE = 0; # 1 ̵����ư������� 51# use nkf? 52$NKF_USE = 1; # 1 -> Use (default), 0 -> No Use 53# auto signature cut 54$SIG_CUT = 0; # 1 Signature�������� 55$SIG_PATTERN = '^-- $'; # Signature�γ��ϹԤ�����ɽ�� 56 57# Update Namazu index? 58$NamazuExecFlag = 0; # 0 -> no (default), 1 -> yes 59# where is hns-index? 60$MkNamazuPath = "$ENV{'HOME'}/diary/bin/hns-index"; 61 62# sendmail �ξ�� �ƥ����Фˤ�äư㤦�Ǥ��礦 63$sendmail = "%SENDMAIL_PATH%"; 64# nkf �ξ�� �Τ���Ƥ� 65$nkf = "%NKF_PATH%"; 66 67## install ��ˡ 68## 1. $HOME/diary/bin/mail2nikki.pl �� ����� copy 69## 2. chmod 700 mail2nikki.pl 70## 3. mail2nikki.pl �� ���� 71## 4. $HOME/diary/mail ����� ( mkdir ��Ȥä� ) 72## 5. .forward ������ 73#��: 74# inseki:~$ cat .forward 75#\ken,"|/home/ken/diary/bin/mail2nikki.pl " 76 77## ��������Ͽ��ˡ 78## Subject: hnf:ADD 79## ��ʸ�� 80## PASSWORD: <password> 81## [DATE: 19981109] (��ά��ǽ,��ά�� mail �������������) 82## (����1��) 83## ������ʸ 84## END ʸƬ�ޤ� hnf ����Ͽ 85 86 87############################ 88### You DON'T have to change 89### 90 91# qmail ���� 600 �� permission ������ 92# Thanks. masakazu@yamada.gr.jp 93umask(022); 94 95# ����Хå����åפ���Τ� ���Υե����롣 96$backupFile = "$diaryDir/mail/backup"; 97 98# �����Τ���˽����������� LOG ����¸ 99$logFile = "$diaryDir/mail/mail.log"; 100# �ʰץ� 101$SimpleLogFile = "$diaryDir/mail/simple.log"; 102# ��ȥե����� 103$mailTempFile = "$diaryDir/mail/file.$$"; 104 105 106@hnfCommandHash = ('NO','DEL&ADD','ADD','DEL','GET'); 107@hnfObjectHash = ('NO','DIARY','PLAN','TODO','REPEAT'); 108 109 110# ������� 111# ��: Sendmail( "/usr/sbin/sendmail" , "aite@hoge.jp" , 112# "jibun@geho.jp" , "title" , \@body ); 113sub Sendmail { 114 my ( $sendmail , $to , $from , $subject , $body ) = @_; 115 116 open(MAIL,"|$sendmail -t"); 117 118 print MAIL "To: $to\n"; 119 print MAIL "From: <$from>\n"; 120 print MAIL "Subject: $subject\n\n"; 121 122 for( @$body ) 123 { 124 print MAIL "$_\n"; 125 } 126 127 close (MAIL); 128} 129 130sub OkMail { 131 @mbody = ( 'This messege was written by mail2nikki.pl.' , 132 'System transact your mail.'); 133 push( @mbody , $_[0] ); 134 if ($loopcheck == 0) { 135 Sendmail( $sendmail , $mailAddress 136 , "$recvMailAddress" , "[mail2nikki] transact complete" 137 , \@mbody ); 138 } 139} 140sub NgMail { 141 @mbody = ( 'This messege was written by mail2nikki.pl.' , 142 'System DOESN\'T transact your mail.'); 143 push( @mbody , $_[0] ); 144 if ($loopcheck == 0) { 145 Sendmail( $sendmail , $mailAddress 146 , "$recvMailAddress" , "[mail2nikki] transact faled" 147 , \@mbody ); 148 } 149} 150# ɽ����ʬ 151sub HnsPrint { 152 for( @body ) 153 { 154 print OUT "$_"; 155 } 156} 157 158 159# log ����¸ 160sub savelog { 161 open( OUT , ">>$logFile" ); 162 print OUT "---- START ----\n"; 163 print OUT "---- HEAD -----\n"; 164 for( @headers ) 165 { 166 print OUT "$_"; 167 } 168 print OUT "\n"; 169 print OUT "---- HNF HEAD -----\n"; 170 for( @hnfheaders ) 171 { 172 if( /^(PASSWORD|PASSWD): /i ) 173 { 174 print OUT "PASSWD: ****************\n"; 175 } 176 else 177 { 178 print OUT "$_"; 179 } 180 } 181 print OUT "---- HNF BODY -----\n"; 182 for( @body ) 183 { 184 print OUT "$_"; 185 } 186 print OUT "---- HNF FOOT -----\n"; 187 for( @foot ) 188 { 189 print OUT "$_"; 190 } 191 print OUT "---- STATE -----\n"; 192 print OUT "PASSWORD : $PASSWORD \n"; 193 print OUT "HNF MODE : $HnsMode \n"; 194 print OUT "HNF OBJ : $HnsObj \n"; 195 print OUT "---- END ----\n"; 196 close(OUT); 197} 198 199 200sub copy { 201 my ($from, $to) = @_; 202 my @tmp; 203 204 open (TEMP, $from) || die "can't open: $!"; 205 while (<TEMP>) { 206 &jcode::convert(\$_, 'euc'); 207 push (@tmp, $_); 208 } 209 close(TEMP); 210 open (FILE, ">$to") || die "can't open: $!"; 211 foreach (@tmp) { 212 print FILE $_; 213 } 214 close(FILE); 215} 216 217 218sub copy_jis { 219 my ($from, $to) = @_; 220 my @tmp; 221 222 open (TEMP, $from) || die "can't open: $!"; 223 while (<TEMP>) { 224 &jcode::convert(\$_, 'jis'); 225 push (@tmp, $_); 226 } 227 close(TEMP); 228 open (FILE, ">$to") || die "can't open: $!"; 229 foreach (@tmp) { 230 print FILE $_; 231 } 232 close(FILE); 233} 234 235 236sub append { 237 my ($from, $to) = @_; 238 my @tmp; 239 240 open (TEMP, $from) || die "can't open: $!"; 241 while (<TEMP>) { 242 &jcode::convert(\$_, 'euc'); 243 push (@tmp, $_); 244 } 245 close(TEMP); 246 open (FILE, ">>$to") || die "can't open: $!"; 247 foreach (@tmp) { 248 print FILE $_; 249 } 250 close(FILE); 251} 252 253 254sub cvs_add_commit { 255 my ($file) = @_; 256 my ($filedir, $base); 257 $base = (split('/', $file))[-1]; 258 $filedir = $file; 259 $filedir =~ s!/[^\/]+$!!; 260# system("cd $filedir; cvs add $base; cvs commit -m 'Update by mail'"); 261} 262 263$loopcheck = 0; 264 265# sendmail �����Ϥ��줿�إå�����Ͽ 266while($_=<STDIN>) 267{ 268 if (/^Subject: \[mail2nikki\]/) { 269 $loopcheck = 1; 270 } 271 last if /^\r?\n$/; 272 s/\r?\n$/\n/; 273 if (/^\s/) { 274 $_ = pop( @headers ) . $_; 275 } 276 push( @headers,$_ ); 277} 278 279# hnf �ѤΥإå� 280$hnfheadflag = 0; 281while($_=<STDIN>) 282{ 283 if (/^Subject: \[mail2nikki\]/) { 284 $loopcheck = 1; 285 } 286 last if (/^\r?\n$/)&&($hnfheadflag == 1); 287 next if (/^\r?\n$/); 288 $hnfheadflag = 1; 289 s/\r?\n$/\n/; 290 push( @hnfheaders,$_ ); 291} 292 293# �������� 294while($_=<STDIN>) 295 { 296 if (/^Subject: \[mail2nikki\]/) { 297 $loopcheck = 1; 298 } 299 last if /^END/; 300 last if /^!#EOF/; 301 last if /$SIG_PATTERN/o && $SIG_CUT; 302 s/\r?\n$/\n/; 303 push( @body,$_ ); 304 } 305 306# �Ǹ� 307while($_=<STDIN>) 308 { 309 push( @foot,$_ ); 310 } 311 312# �������ּ��� 313($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time); 314$year = $year + 1900; 315$mon = $mon + 1; 316$mday = "0$mday" if $mday < 10; 317$mon = "0$mon" if $mon < 10; 318$sec = "0$sec" if $sec < 10; 319$min = "0$min" if $min < 10; 320$hour = "0$hour" if $hour < 10; 321 322if ( !( -d $diaryDir . "/" . $year ) ) 323{ 324 system("mkdir $diaryDir/$year;chmod 755 $diaryDir/$year"); 325} 326$file = "$diaryDir/$year/d$year$mon$mday.hnf"; 327$pfile = "$diaryDir/$year/y$year$mon"; 328 329$HnsFlag = 0; 330$Correct = "No"; 331$i = 0; 332$imax = @certiy_mailAddress - 1; 333for( @headers ) 334{ 335 336# /* ǧ�� ��륢�ɥ쥹 �����������Ƥʤ����ɤ�(^^;) */ 337 if( /^From: / ) 338 { 339# $HnsFlag = 1 if( /$mailAddress/ ); 340 341 while( $Correct eq "No" ){ 342 if( /@certiy_mailAddress[$i]/ ){ 343 $HnsFlag = 1; 344 $Correct = "Yes"; 345 $cmdGetAddress = @certiy_mailAddress[$i]; ## 346 } elsif ($i < $imax){ 347 $i = $i + 1; 348 } else { 349 $HnsFlag = 0; 350 $Correct = "Yes"; 351 } 352 } 353 } 354# /* �إå��ߤ� ���줾��� ���� (��������������֤���� ��������) */ 355 if(/^Subject: (hnf|hns):(ADD|DEL|DEL&ADD|GET) *(PLAN|TODO|REPEAT)?/) 356 { 357 $HnsMode = 2 if( /ADD/ ); 358 $HnsMode = 3 if( /DEL/ ); 359 $HnsMode = 1 if( /DEL&ADD/ ); 360 $HnsMode = 4 if( /GET/ ); 361 $HnsObj = 1; 362 if( /PLAN/ ) 363 { 364 $HnsObj = 2; 365 $file = $pfile; 366 } 367 if( /TODO/ ) 368 { 369 $HnsObj = 3; 370 $file = "$diaryDir/todo"; 371 } 372 if( /REPEAT/ ) 373 { 374 $HnsObj = 4; 375 $file = "$diaryDir/repeat"; 376 } 377 } 378} 379 380$PASSWORD = 0; 381for( @hnfheaders ) 382{ 383 if( /^(PASSWORD|PASSWD)\s*:\s*$MASTERPASSWD/i ) 384 { 385 386# @list = split( /\s*:\s*/ , $_ ); 387# $tmp = shift( @list ); 388# $tmp = shift( @list ); 389# $PASSWORD = 1 if ( $MASTERPASSWD =~ /$tmp/ ) ; 390 391 $PASSWORD = 1; 392 next; 393 } 394 if( /^DATE\s*:\s*/ && $HnsObj == 1 ) 395 { 396 @list = split( /\s*:\s*/ , $_ ); 397 $tmp = shift( @list ); 398 $tmp = shift( @list ); 399 chop $tmp; 400 if( $tmp =~ /([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])/ ) 401 { 402 $year = $1; 403 if ( ! (-d $diaryDir . "/" . $year) ) 404 { 405 system("mkdir $diaryDir/$year;chmod 755 $diaryDir/$year"); 406 } 407 408 $file = "$diaryDir/$year/d$tmp.hnf"; 409 } 410 else 411 { 412 $file = "$diaryDir/d$tmp.hnf"; 413 } 414 next; 415 } 416 if( /^DATE\s*:\s*/ && $HnsObj == 2 ) 417 { 418 @list = split( /\s*:\s*/ , $_ ); 419 $tmp = shift( @list ); 420 $tmp = shift( @list ); 421 chop $tmp; 422 if( $tmp =~ /([0-9][0-9][0-9][0-9])([0-9][0-9])/ ) 423 { 424 $year = $1; 425 if ( ! (-d $diaryDir . "/" . $year) ) 426 { 427 system("mkdir $diaryDir/$year;chmod 755 $diaryDir/$year"); 428 } 429 430 $file = "$diaryDir/$year/y$tmp"; 431 } 432 else 433 { 434 $file = "$diaryDir/y$tmp"; 435 } 436 next; 437 } 438 439 push( @userVar , $_ ); 440} 441 442open( SLOG , ">>$SimpleLogFile" ); 443$slogMsg = "[$year/$mon/$mday:$hour:$min:$sec]" 444 . " COMMAND=$hnfCommandHash[$HnsMode]" 445 . " OBJ=$hnfObjectHash[$HnsObj]" 446 . " PASSWD=$PASSWORD" 447 . " LOOPCHK=$loopcheck"; 448 449print SLOG "$slogMsg"; 450 451if( $PASSWORD == 0) 452{ 453 print SLOG " STATE=ERROR\n"; 454 close( SLOG ); 455 savelog() if( $LOGMODE != 2 ) ; 456 NgMail( $slogMsg ) if( $MAILMODE == 1 ); 457 exit; 458} 459 460if( $LOGMODE == 1 ) 461{ 462 savelog(); 463} 464 465 466# /* CREATE �ʤ� �������ե�������� OK ��Ƥ��顢mail����ʸ */ 467if( $HnsMode == 1 ) 468{ 469 if( $HnsFlag ) 470 { 471 # ��ȥե�����˰��٤���롣 472 open( OUT , ">$mailTempFile" ); 473 for( @userVar ) 474 { 475 print OUT "$_"; 476 } 477 print OUT "OK\n\n" if ($HnsObj == 1); 478 HnsPrint(); 479 close( OUT ); 480 481 # ��ȥե����뤫�饳�ԡ����� ���롣 482 if ($NKF_USE) { 483 system( "$nkf -e < $mailTempFile > $file" ); 484 } 485 else { 486 copy ($mailTempFile, $file); 487 } 488 unlink "$mailTempFile"; 489 print SLOG " STATE=DONE\n"; 490 close( SLOG ); 491 OkMail ($slogMsg . "\n-- body\n" . join('', @body)) if $MAILMODE == 1; 492 493 # Update Namazu index 494 system("$MkNamazuPath") if $NamazuExecFlag == 1; 495 496 # cvs_add_commit ($file); 497 exit; 498 } 499} 500 501# /* APPEND �� */ 502if( $HnsMode == 2 ) 503{ 504 if( $HnsFlag ) 505 { 506 if(-f "$file") 507 { 508# /* ���˥ե����뤬����ʤ� ���Τޤ� */ 509 if ($NKF_USE) { 510 system( "$nkf -e < $file > $mailTempFile"); 511 } 512 else { 513 copy ($file, $mailTempFile); 514 } 515 system( "cp $mailTempFile $file" ); 516 517 open( OUT , ">$mailTempFile" ); 518# /* mail ����ʸ */ 519 HnsPrint(); 520 close( OUT ); 521 # ��ȥե����뤫�饳�ԡ����� ���롣 522 if ($NKF_USE) { 523 system( "$nkf -e < $mailTempFile >> $file" ); 524 } 525 else { 526 append ($mailTempFile, $file); 527 } 528 unlink "$mailTempFile"; 529 530 } 531 else 532 { 533# /* �ʤ��ä��� ��ä� OK ������� */ 534 # ��ȥե�����˰��٤���롣 535 open( OUT , ">$mailTempFile" ); 536 for( @userVar ) 537 { 538 print OUT "$_"; 539 } 540 print OUT "OK\n\n" if ($HnsObj == 1); 541# /* mail ����ʸ */ 542 HnsPrint(); 543 close( OUT ); 544 # ��ȥե����뤫�饳�ԡ����� ���롣 545 if ($NKF_USE) { 546 system( "$nkf -e < $mailTempFile > $file" ); 547 } 548 else { 549 copy ($mailTempFile, $file); 550 } 551 unlink "$mailTempFile"; 552 553 } 554 555 print SLOG " STATE=DONE\n"; 556 close( SLOG ); 557 558 OkMail ($slogMsg . "\n-- body\n" . join('', @body)) if $MAILMODE == 1; 559 560 # Update Namazu index 561 system("$MkNamazuPath") if $NamazuExecFlag == 1; 562 563 # cvs_add_commit ($file); 564 exit; 565 } 566 567} 568 569# /* DELETE �ʤ顢�ä����㤨 */ 570if( $HnsMode == 3 ) 571{ 572 if( $HnsFlag ) 573 { 574# /* �Ǥⶲ������ ���� �Τ����Ƥ����� */ 575 system( "cat $file >>$backupFile" ); 576 unlink "$file"; 577 print SLOG " STATE=DONE\n"; 578 close( SLOG ); 579 OkMail( $slogMsg ) if( $MAILMODE == 1 ); 580 exit; 581 } 582} 583# /* GET �ʤ� mail ������ */ 584if( $HnsMode == 4 ) 585{ 586 if( $HnsFlag ) 587 { 588 589 # �ޤ�����ȥե������ nkf -j ���롣 590 if ($NKF_USE) { 591 system( "$nkf -j < $file > $mailTempFile" ); 592 } 593 else { 594 copy_jis ($file, $mailTempFile); 595 } 596 # ���Υե�������٤� sendmail ���롣 597 598 @mbody = ( 'This message was written by mail2nikki', 599 'System accsept GET command', 600 ''); 601 602 open( IN , "$mailTempFile"); 603 while( $_=<IN>) 604 { 605 chomp; 606 s/^\./\.\./; 607 push( @mbody , $_ ); 608 } 609 close( IN ); 610 611## Sendmail($sendmail , $mailAddress , $recvMailAddress , 612 Sendmail($sendmail , $cmdGetAddress , $recvMailAddress , 613 "[mail2nikki] GET $file", \@mbody); 614 unlink "$mailTempFile"; 615 print SLOG " STATE=DONE\n"; 616 close( SLOG ); 617 OkMail( $slogMsg ) if( $MAILMODE == 1 ); 618 exit; 619 } 620} 621 622 623print SLOG " STATE=NO TRANSACT\n"; 624close( SLOG ); 625NgMail( $slogMsg ) if( $MAILMODE == 1 ); 626exit; 627 628