#!/usr/local/bin/perl -w # @(#) SEPclWin.pl Программа-клиент с повышенной безопасностью для Windows, # использует GPG. # Обрабатыввет данные со стандартного входа и генерирует # сообщение с PGP-подписью; сообщение разбивается на фрагменты # согласно RFC 2046, а затем отправляется на сервер по # электронной почте. Требуется 'gpg'-программа. # Graham Jenkins, IBM GSA, Янв. 2002. [Пересмотрено 2002-02-05] use strict; # Примечание: Это облегчённая версия use File::Basename; # SEPclientGPG.pl; рекомендации use Net::SMTP; # RFC 3156 здесь не учтены. use Net::hostent; use Net::Domain; # Вам может понадобиться изменить местоположение use Net::Config; # исполняемого модуля 'gpg' в вашей системе. use Socket; my ($Sender,$Id,$j,$Dest,$InpBuf,$OutBuf,$Number); die "Usage: ".basename($0)." kb-per-part destination\n". " e.g.: ".basename($0)." 16 lp3\@pserv.acme.com < report.ps\n". " Part-size must be >= 1\n" if ( ($#ARGV != 1) or ($ARGV[0] < 1) ); $Dest=$ARGV[1]; $Number = 0; $OutBuf=""; $InpBuf=""; $Sender="nobody\@".Net::Domain->hostfqdn; $Id=$Sender.time; if ( $^O eq 'MSWin32' ) {open PIPE, "C:\\UTILS\\GPG -as - |"} else {open PIPE, "/usr/local/bin/gpg -as - |"} while () { # Читать входной канал и записывать данные if ( (length($InpBuf . $_)) > ($ARGV[0] * 1024) ) {do_output()} # в $InpBuf, пока не встретиться EOF. $InpBuf = $InpBuf . $_ # Если $InpBuf заполнен, то вызывать } # функцию отправки сообщения do_output() . foreach $j (1,2) {do_output()} # EOF: сбросить оба буфера и выйти. exit 0; sub do_output { # Функция отправки сообщения. my $hosts = $NetConfig{smtp_hosts}; my ($Total,$Content,$mailhost,$smtp); # Если внешний буфер содержит данные, if ($OutBuf ne "") { # то инкрементировать Number, и проверить $Number++; $Total=""; # не является ли это последней частью сообщения. $Content="message/partial; id=\"$Id\"; number=\"$Number\""; if ($InpBuf eq "") {$Total=$Number; $Content="$Content; total=\"$Total\""} foreach $mailhost (@{$hosts}) { # Ensure $mailhost address is known. next if ! defined gethost($mailhost); print STDERR "Sending part: ",$Number,"/",$Total," via: ",$mailhost,"\n"; $smtp = Net::SMTP->new($mailhost) || next; $smtp->mail($Sender); $smtp->to ($Dest); $smtp->data(); $smtp->datasend("From: $Sender\n"); $smtp->datasend("Content-Disposition: inline\n"); $smtp->datasend("Content-Transfer-Encoding: 7bit\n"); # Изменить на 8bit. Прим.перев. $smtp->datasend("Content-Type: $Content\n"); $smtp->datasend("MIME-Version: 1.0\n"); $smtp->datasend("To: $Dest\n"); $smtp->datasend("Subject: Secure Email Print Job # ".time."\n\n"); $smtp->datasend($OutBuf); $smtp->dataend; $smtp->quit; goto L } die "SMTP connection failure!\n" } L:$OutBuf = $InpBuf; # Перенести данные входного буфера $InpBuf = "" # в выходной и выйти. }