Newsgroup: it.comp.lang.perl
Titolo: Attachment con sendmail (era gia' stato chiesto ma...)

Salve a tutti,
SO che era già stato chiesto ma non riesco più a trovare il messaggio, è
sparito!!
La mia domanda è questa: come invio attachment con SENDMAIL dal mio magnifico
CGI?
Grazie e scusate per il re-post.
(quando sarà online il sito questi problemi non ci saranno più!)
--
Umberto Meroni
[
http://www.ubi1k.com
] [
http://www.ubi1k-vb.net
]
[
webm...@ubi1k.com
] [ICQ: 14660006]
[MSN Messenger: 
ub...@hotmail.com
]
[per contattarmi: 
http://www.ubi1k.com/meroni
]

';
$to  = 'Pinco Pallino <pincop...@vedi.tu>';
open  MAIL,"|/usr/sbin/sendmail -t -odb '$to'";
print MAIL "From: $frm\n";
print MAIL "To: $to\n";
print MAIL "Subject: Vediamo cosa ti mando\n";
print MAIL "\n";
print MAIL "Occhio, che ora arriva il file\n\n";
print MAIL $uuencoded;
close MAIL;
exit;
sub uue {
   my $fn = shift @_;
   return if !-f $fn || !-r $fn;
   my $uue = pack("u",join('',`cat $fn`)); # <- CODIFICA UUE
   $fn =~ s/.*\/// or 'NoFilename';
   return <<ENDUUE;
------------ Begin cut here... uuencoded file ---------------
begin 644 $fn
$uue
`
end
------------ End   cut here... uuencoded file ---------------
ENDUUE
}
------- FINE PROGRAMMA
Just my 2 cents
saluti, Marco Cacchiani 
ma...@sirius.pisa.it
--
Sirius Servizi Informatici                     e-mail: 
in...@sirius.pisa.it
Parco Teatro Pasolini, 1                       Phone:  +39 (50) 865120
I-56019 - Vecchiano                            Fax:    +39 (50) 860260
(Pisa - ITALIA)                                
http://www.sirius.pisa.it/

 ------- FINE PROGRAMMA
Non avevo pensato che per l'appunto l'uuencode e' un codice che serve a
mandare i files e che molti mailbrowsers riconoscono automaticamente la
stringa di inzio del file codificato (begin... ecc. ecc.).
Per cui il programma che ho inviato con il mio precedente post puo' non
venire visualizzato correttamente nel vostro mail/news-browser, che credera'
di avere a che fare con un vero attachment anziche' con il codice che serve
per
crearlo.
Riecco la subroutine che contiene la parte di codice che viene mascherata
dal vostro browser (togliere
TOGLIQUESTO):
[...]
sub uue {
   my $fn = shift @_;
   return if !-f $fn || !-r $fn;
   my $uue = pack("u",join('',`cat $fn`)); # <- CODIFICA UUE
   $fn =~ s/.*\/// or 'NoFilename';
   return <<ENDUUE;
------------ Begin cut here... uuencoded file ---------------
TOGLIQUESTObegin 644 $fn
$uue
`
end
------------ End   cut here... uuencoded file ---------------
ENDUUE
}
saluti, Marco Cacchiani 
ma...@sirius.pisa.it


M'han detto che uuencode non è supportata da tutti; in questo caso non mi
sarebbe utilissima, no?
Premetto che i miei visitatori sono praticamente tutti utenti Windows


 
Ecco, a grande (?) richiesta, una tecnica quick-and-dirty per creare un
messaggio di testo con un attachment... per chi non puo (o non vuole)  
installare nuovi moduli. Il codice è in fondo al messaggio e si usa così:
   open F, "/percorso/del/file";
   my $messaggio = 
   create_a_text_message_with_a_file_attached(
		"ciao ciao",       # testo del messaggio
		\*F,		   #  file handle glob ref
		"application/pdf", # mime-type
		"pippo.pdf"     # nome file
		);
Quindi aggiugete il From:, il To:, il Subject: (e quant'altro) e date il
tutto in pasto al sendmail.
Max
#
# Ecco!
#
#
sub create_a_text_message_with_a_file_attached { 
	my ( $testo, $fh, $content_type, $filename ) = @_;
	return undef unless $testo && ref( $fh );
	$content_type ||= "application/octet-stream";
	local $/= undef;
	my $file_encodato = encode_base64( <$fh> );
	my $separatore = "PIPPOPIPPO".time().$$;
	my $messagio = <<EOM;
MIME-Version: 1.0
Content-Type: MULTIPART/MIXED; BOUNDARY="$separatore"
--$separatore
Content-Type: TEXT/PLAIN; CHARSET="ISO-8859-1"
Content-Transfer-Encoding: 8bit
$testo
 
--$separatore
Content-Type: $content_type; NAME="$filename"
Content-Transfer-Encoding: BASE64
$file_encodato
--$separatore--
EOM
	return $messagio;
}
sub encode_base64 {  #copiato-e-incollato da MIME::Lite
	my $res = "";
	my $eol = "\n";
	pos($_[0]) = 0;        # thanks, Andreas!
	while ($_[0] =~ /(.{1,45})/gs) {
		$res .= substr(pack('u', $1), 1);
		chop($res);
	}
	$res =~ tr|` -_|AA-Za-z0-9+/|;
	# Fix padding at the end:
	my $padding = (3 - length($_[0]) % 3) % 3;
	$res =~ s/.{$padding}$/'=' x $padding/e if $padding;
	# Break encoded string into lines of no more than 76 characters each:
	$res =~ s/(.{1,76})/$1$eol/g if (length $eol);
	return $res;
}