#!/usr/local/bin/perl -w # @(#) SplitSend.pl Разделение на части и отправка электронного сообщения (См: RFC 1521, 2046). # Graham Jenkins, IBM GSA, Декабрь 2001. [Пересмотрено: 2 января 2002 г.] use strict; use File::Basename; use MIME::Lite; use Net::Domain; my ($Id,$j,$Dest,$Subj,$part,$InpBuf,$OutBuf,$Number,$Total); die "Usage: ".basename($0)." kb-per-part\n". " Part-size must be >= 1\n" if ( ($#ARGV != 0) or ($ARGV[0] < 1) ); $Id=(getlogin."\@".Net::Domain::hostfqdn().time) or $Id="unknown_user".time; $Number = 0; $Total = ""; $OutBuf=""; $InpBuf=""; print STDERR "\n"; sub do_output { # функция отправки сообщения die basename($0)." .. destination undefined!\n" if ! defined($Dest); $Subj = "" if ! defined($Subj); if ($OutBuf ne "") { # Если выходной буфер содержит данные, $Number++; # то увеличиваем значение Number, и проверяем $Total=$Number if $InpBuf eq ""; # не последняя ли это часть в цепочке. print STDERR "Sending part: ", $Number,"/",$Total,"\n"; $part = MIME::Lite->new( To => $Dest, # Конструируем сообщение. Subject => $Subj, Type => 'message/partial', Encoding=> '7bit', # (Изменить на 8bit! Прим.перев.) Data => $OutBuf); $part->attr("content-type.id" => "$Id"); $part->attr("content-type.number" => "$Number"); $part->attr("content-type.total" => "$Total") if ($Number eq $Total); $part->send; # Отправить сообщение. } $OutBuf = $InpBuf; # Скопировать содержимое входного буфера $InpBuf = "" # в выходной буфер и выйти из процедуры. } while () { # Основной цикл. if ( (substr($_, 0, 3) eq "To:") && (! defined($Dest)) ) { $Dest = substr($_, 4, length($_) - 4); chomp $Dest; next } if ( (substr($_, 0, 8) eq "Subject:") && (! defined($Subj)) ) { $Subj = substr($_, 9, length($_) - 9); chomp $Subj; next } if ( (length($InpBuf . $_)) > ($ARGV[0] * 1024) ) {do_output} $InpBuf = $InpBuf . $_ } foreach $j (1,2) {do_output} # Сброс обоих буферов и выход из программы. __END__