Newsgroup: it.comp.www.php
Titolo: Problema - invio curriculum tramite web

Salve a tutti,
ho un grandissimo problema che mi tormenta da due giorni.
Devo fare un sito con un form che permetta agli utenti di inviare il
proprio curriculum in formato DOC (o ZIP, o qualsiasi altro: per il momento
non mi importa discriminare sul tipo di file).
Ad ogni modo, il problema è appunto che devo permettere all'utente di
seleazionare un file dal proprio hard disk (tramite un campo "file" del
form) e di *allegarlo* ad una mail indirizzata al titolare del sito.
Questo è il mio form (form.php), opportunamente semplificato:
---------------------------------------------------------
<form name="curriculumForm" method="post" action="processCurriculum.php"
enctype="multipart/form-data">
<table cellpadding="0" cellspacing="0" border="0">
   <tr>
      <td class="text">Nome* &nbsp;</td>
      <td><input name="nome" type="text"></td>
      <td class="text">Cognome* &nbsp;</td>
      <td><input name="cognome" type="text"></td>
   </tr>
   <tr>
      <td>Curriculum</td>
      <td><input name="curriculum" type="file"></td>
      <td></td>
      <td></td>
   </tr>
   <tr>
      <td colspan="4"><input type="submit" value="Invia"></td>
   </tr>
</table>
</form>
---------------------------------------------------------
Questa (cfMailFile.php) è la classe che sto cercando di utilizzare
(disponibile su 
http://renoir.vill.edu/~ylee/mailfile.html
):
---------------------------------------------------------
<?
class CMailFile {
	var $subject;
	var $addr_to;
	var $text_body;
	var $text_encoded;
	var $mime_headers;
	var $mime_boundary = "--==================_846811060==_";
	var $smtp_headers;
 
	function CMailFile($subject,$to,$from,$msg,$filename,$mimetype =
"application/octet-stream", $mime_filename = false) {
		$this->subject = $subject;
		$this->addr_to = $to;
		$this->smtp_headers = $this->write_smtpheaders($from);
		$this->text_body = $this->write_body($msg);
		$this->text_encoded = $this->attach_file($filename,$mimetype,$mime_filename);
		$this->mime_headers = $this->write_mimeheaders($filename, $mime_filename);
	}
	function attach_file($filename,$mimetype,$mime_filename) {
		$encoded = $this->encode_file($filename);
		if ($mime_filename) $filename = $mime_filename;
		$out = "--" . $this->mime_boundary . "\n";
		$out = $out . "Content-type: " . $mimetype . "; name=\"$filename\";\n";		
		$out = $out . "Content-Transfer-Encoding: base64\n";
		$out = $out . "Content-disposition: attachment; filename=\"$filename\"\n\n";
		$out = $out . $encoded . "\n";
		$out = $out . "--" . $this->mime_boundary . "--" . "\n";
		return $out; 
// added -- to notify email client attachment is done
	}
	function encode_file($sourcefile) {
		if (is_readable($sourcefile)) {
			$fd = fopen($sourcefile, "r");
			$contents = fread($fd, filesize($sourcefile));
			$encoded = my_chunk_split(base64_encode($contents));
			fclose($fd);	
		}
		return $encoded;
	}
	function sendfile() {
		$headers = $this->smtp_headers . $this->mime_headers;
		$message = $this->text_body . $this->text_encoded;
		mail($this->addr_to,$this->subject,$message,$headers);
	}
	function write_body($msgtext) {
		$out = "--" . $this->mime_boundary . "\n";
		$out = $out . "Content-Type: text/plain; charset=\"us-ascii\"\n\n";
		$out = $out . $msgtext . "\n";
		return $out;
	}
	function write_mimeheaders($filename, $mime_filename) {
		if ($mime_filename) $filename = $mime_filename;
		$out = "MIME-version: 1.0\n";
		$out = $out . "Content-type: multipart/mixed; ";
		$out = $out . "boundary=\"$this->mime_boundary\"\n";
		$out = $out . "Content-transfer-encoding: 7BIT\n";
		$out = $out . "X-attachments: $filename;\n\n";
		return $out;
	}
	function write_smtpheaders($addr_from) {
		$out = "From: $addr_from\n";
		$out = $out . "Reply-To: $addr_from\n";
		$out = $out . "X-Mailer: PHP3\n";
		$out = $out . "X-Sender: $addr_from\n";
		return $out;
	}
}
// usage - mimetype example "image/gif"
// $mailfile = new
CMailFile($subject,$sendto,$replyto,$message,$filename,$mimetype);
// $mailfile->sendfile();
// Splits a string by RFC2045 semantics (76 chars per line, end with \r\n).
// This is not in all PHP versions so I define one here manuall.
function my_chunk_split($str)
{
	$stmp = $str;
	$len = strlen($stmp);
	$out = "";
	while ($len > 0) {
		if ($len >= 76) {
			$out = $out . substr($stmp, 0, 76) . "\r\n";
			$stmp = substr($stmp, 76);
			$len = $len - 76;
		}
		else {
			$out = $out . $stmp . "\r\n";
			$stmp = ""; $len = 0;
		}
	}
	return $out;
}
?>
---------------------------------------------------------
Questo, infine, è il mio script (processCurriculum.php) che processa il
form e dovrebbe mandare la mail appoggiandosi alla classe riportata sopra:
---------------------------------------------------------
<?
   include('cfMailFile.php');
   $destinatario = "
st...@syntax.it
";
   $titolo = "CURRICULUM da SITO WEB";
   $contenuto = $nome ." ". $cognome;
   $newmail = new
CMailFile($titolo,$destinatario,"
s.ro...@syntax.it
",$contenuto,$req_Curriculum,"application/octet-stream");
   $newmail->sendfile();
?>
---------------------------------------------------------
Ovviamente il problema è che non funziona.
Gli errori che mi tornano sono questi:
Warning: open_basedir restriction in effect. File is in wrong directory in
/usr/local/psa/home/vhosts/
satef.com/httpdocs/nuovo/cfMailFile.php
 on line 55
Warning: fopen("/tmp/phpKFHa3z", "r") - Operation not permitted in
/usr/local/psa/home/vhosts/
satef.com/httpdocs/nuovo/cfMailFile.php
 on line 55
Warning: Supplied argument is not a valid File-Handle resource in
/usr/local/psa/home/vhosts/
satef.com/httpdocs/nuovo/cfMailFile.php
 on line 56
Warning: Supplied argument is not a valid File-Handle resource in
/usr/local/psa/home/vhosts/
satef.com/httpdocs/nuovo/cfMailFile.php
 on line 58
Potete aiutarmi please?
(Visto che sto scrivendo al forum tramite interfaccia web, se ci dovessero
essere problemi nel decifrare il codice che ho incollato fatemelo sapere
please!)
Grazie a tutti, davvero!
Stex
_____________________________
Inviato da 
www.mynewsgate.net

Ti allego uno script che puň fare al caso tuo e che ho usato in diversi
siti, modificandolo secondo le mie esigenze.
Spero possa esserti utile.
Ciao.
Ale
----------------------------------------------------------------------------
-----------------------------
<?php
if ($action == "send")
{
  //mail del destinatario ovvero di colui il quale riceve la mail con
l'allegato
  $to="
ma...@dominio.it
";
  //oggetto del messaggio
  $subject="Richiesta";
  $header = "From: " . $from . "\n";
  if ($attachement != "none")
  {
    // copia il file sul server...non si sa mai !!Ma questa fase puoi
tenerla commentata se la ritieni non necessaria
    //copy
($attachement,"/usr/local/plesk/apache/vhosts/
tuodominio.it/httpdocs/diretto
riodicopiafile/".$attachement_name)or die("impossibile copiare");
    //chmod
("/usr/local/plesk/apache/vhosts/
tuodominio.it/httpdocs/direttoriodicopiafil
e/".$attachement_name, 0777);
    //chmod
("/usr/local/plesk/apache/vhosts/
tuodominio.it/httpdocs/direttoriodicopiafil
e/".$attachement_name, 0777);
    // Ricava il filetype dell'allegato
    $type = $HTTP_POST_FILES[attachement][type];
    echo $type;
    if (($type == "text/plain") || ($type == "text/html"))
      $encoding = "8bit";
    else
      $encoding = "base64";
    // Ricava il contenuto dell'allegato
    $fp = @fopen($HTTP_POST_FILES[attachement][tmp_name],"r");
    if (!$fp) {
      print "Non posso aprire l'allegato...<br>\n";
      print "Invio interrotto<br><br>";
      print "L'email non č stata spedita.";
      exit;
    }
    $file_content =
fread($fp,filesize($HTTP_POST_FILES[attachement][tmp_name]));
    // Se filetype č base64 ... encode, fa il cunck del file
    if ($encoding == "base64")
      $file_content = chunk_split(base64_encode($file_content));
    // create a unqiue boundary
    $boundary = strtoupper(md5(uniqid(time())));
    // crea l'header del messaggio...
    $header .= "MIME-version: 1.0\n";
    $header .= "Content-Type: multipart/mixed;\n";
    $header .= "\tboundary= " . $boundary . "\n\n";
    $header .= "This is a multi-part message in MIME format.\n\n";
    // creail body del messaggio in header
    $header .= "--" . $boundary . "\n";
    $header .= "Content-Type: " . $ct . ";\n";
    $header .= "\tcharset=\"iso-8859-1\"\n";
    $header .= "Content-Transfer-Encoding: quoted-printable\n\n";
    // messaggio dal form
    $header .=  $body . "\n\n";
    // ricava l'allegato
    $header .= "--" . $boundary . "\n";
    $header .= "Content-Type: " . $type . "\n";
    $header .= "Content-Transfer-Encoding: " . $encoding . "\n";
    $header .= "Content-Disposition: attachment; filename=\"" .
$HTTP_POST_FILES[attachement][name] . "\"\n\n";
    $header .= $file_content . "\n\n";
    $header .= "--" . $boundary . "--";
  }
  else // se non c'č l'allegato...
  {
    $header .= "Content-Type: " . $ct . ";\n";
    $header .= "\tcharset=\"iso-8859-1\"\n";
    $header .= "Content-Transfer-Encoding: quoted-printable\n\n";
    // messaggio
    $header .=  $body . "\n\n";
  }
  if (@mail($to,$subject,"",$header))
    echo "</br>Mail spedita!";
  else
    echo "</br>Errore nell'invio!";
}
else
{
?>
<html>
<head>
<title>Mail con allegato</title>
</head>
<body>
<center>
<form enctype="multipart/form-data" action="originalmail.php" method="POST">
<input type="hidden" name="action" value="send">
Mittente EMail:
<input type="text" size="40" name="from">
</br>Messaggio:
<textarea rows="8" cols="38" name="body"></textarea>
</br>Allegato:
<input type="file" name="attachement">
</br><input type="submit" value="Invia">
</form>
</body></html>
<?php
}
?>
----------------------------------------------------------------------------
-----------------------------