#!/usr/local/bin/perl -w # @(#) filemail.pl Разбивает входящий поток на части, а затем кодирует # каждую часть и посылает её по e-mail указанному получателю. # Vers. 2.05; Graham Jenkins, IBM GSA, Декабрь 2002. use strict; # Части кодируются и высылаются по схеме с двойным буфером. use File::Basename; # Используется Uuencode для сокращения зависимости от модулей. my $PSize = 700; # Размер части на входе по умолчанию. my $PSize = 700; # Default (input) part-size. my ($Count,$Sum,$Size,$Total,$InpBuf,$InpLen,$OutBuf,$j); if ($#ARGV eq 2) { if ($ARGV[0] =~ m/^-\d+$/ ) { $PSize=0-$ARGV[0]; shift } } die "Использование: cat файл |".basename($0)." [-KbНаЧасть] получатель ИмяФайла\n". "Например: tar cf - .|".basename($0)." -64 smith\@popser.acme.com mydir.tar\n". "(Примечание: размер незакодированной части по умолчанию = $PSize","kb)\n" if ($#ARGV ne 1); open(INFILE,"-") || die "Не могу прочесть входные данные!\n"; $Count = 0; $Total = "";# Цикл пока не кончатся данные. do { $InpLen = read(INFILE, $InpBuf, 1024 * $PSize); $Total = $Count if $InpLen lt 1; do { $Size = length($OutBuf); print STDERR "$ARGV[1] part $Count/$Total => $ARGV[0] $Size bytes\n"; $Sum = unpack("%32C*", $OutBuf); foreach $j (1,2) {$Sum = ($Sum & 0xffff) + int($Sum/0x10000)} open(PIPE, "| Mail -s" . "'$ARGV[1] part $Count/$Total size/sum $Size/$Sum' $ARGV[0]"); $j = $Count ; while (length($j) < 3 ) { $j = "0" . $j } $j = dirname($ARGV[1])."/".$j if dirname($ARGV[1]) ne "."; print PIPE "begin 644 ",$j,"_", basename($ARGV[1]),"\n", pack("u",$OutBuf),"\`\nend\n"; close(PIPE) } if $Count gt 0; $Count++; $OutBuf = $InpBuf } until $InpLen lt 1;