For invio mail-allegato con smtp

  • Creatore Discussione Creatore Discussione dla86
  • Data di inizio Data di inizio

dla86

Utente Attivo
27 Mag 2009
36
0
0
Ciao,
tempo fa ho realizzato un form per l'invio mail prendendo qualche suggerimento on-line. Il form funzionava correttamente però ora necessito dell'autenticazione smtp su un server di un cliente.. l'emal arriva con tutti i dati, però l'allegato no..come mai secondo voi? non sono esperto php... grazie per l'aiuto

PHP:
<form action="invioMail.php" method="GET">
<input type="hidden" name="destinatario" value="">
<table border="0">
<tr>
  <td>Tua Mail:</td>
  <td><input type="text" name="mittente" value="" /></td>
</tr>
<tr>
<tr>
  <td>Scegli Selezione</td>
  <td>
  <select name="selezione">
  <option value="scelta1">scelta1</option>
  <option value="scelta2">scelta2</option>
  <option value="scelta3">scelta3</option>
  </select>
  </td>
  
</tr>
<tr>
  <td>Oggetto:</td>
  <td><input type="text" name="oggetto" value="" /></td>
</tr>
<tr>
  <td>Messaggio:</td>
  <td><textarea cols="20" rows="4" name="messaggio"></textarea></td>
  </tr>
<tr>
  <td>Allega Curriculum:</td>
  <td><input type="file" name="allegato" /></td>
</tr>
<tr>
  <td colspan="2"><input type="submit" value="Invia" /></td>
</tr>
</table>
</form>

PHP:
  <?php
    include('SMTPconfig.php');
include('SMTPClass.php');
if($_SERVER["REQUEST_METHOD"] == "GET")
{
// Recupero il valore dei campi del form
$destinatario = $_GET['destinatario'];
$mittente = $_GET['mittente'];
$selezione = $_GET['selezione'];
$oggetto = $_GET['oggetto'];
$messaggio = $_GET['messaggio'];

// Valorizzo le variabili relative all'allegato
$allegato = $_FILES['allegato']['tmp_name'];
$allegato_type = $_FILES['allegato']['type'];
$allegato_name = $_FILES['allegato']['name'];

// Creo 2 variabili che riempirò più avanti...
$headers = "From: " . $mittente;
$msg = "";

// Verifico se il file è stato caricato correttamente via HTTP
// In caso affermativo proseguo nel lavoro...
if (is_uploaded_file($allegato))
{
  // Apro e leggo il file allegato
  $file = fopen($allegato,'rb');
  $data = fread($file, filesize($allegato));
  fclose($file);

  // Adatto il file al formato MIME base64 usando base64_encode
  $data = chunk_split(base64_encode($data));

  // Genero il "separatore"
  // Serve per dividere, appunto, le varie parti del messaggio.
  // Nel nostro caso separerà la parte testuale dall'allegato
  $semi_rand = md5(time());
  $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
  
  // Aggiungo le intestazioni necessarie per l'allegato
  $headers .= "\nMIME-Version: 1.0\n";
  $headers .= "Content-Type: multipart/mixed;\n";
  $headers .= " boundary=\"{$mime_boundary}\"";

  // Definisco il tipo di messaggio (MIME/multi-part)
  $msg .= "This is a multi-part message in MIME format.\n\n";

  // Metto il separatore
  $msg .= "--{$mime_boundary}\n";

  // Questa è la parte "testuale" del messaggio
  $msg .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
  $msg .= "Content-Transfer-Encoding: 7bit\n\n";
  $msg .= $messaggio . "\n\n";
    $msg .= $selezione . "\n\n";
     
    
  // Metto il separatore
  $msg .= "--{$mime_boundary}\n";

  // Aggiungo l'allegato al messaggio
  $msg .= "Content-Disposition: attachment;\n";
  $msg .= " filename=\"{$allegato_name}\"\n";
  $msg .= "Content-Transfer-Encoding: base64\n\n";
  $msg .= $data . "\n\n";
  

  // chiudo con il separatore
  $msg .= "--{$mime_boundary}--\n";
}
else
{
$msg .= $messaggio . "\n\n";
  $msg .= $selezione . "\n\n";

}



$SMTPMail = new SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $mittente,$destinatario, $oggetto, $msg, $headers);
$SMTPChat = $SMTPMail->SendMail();
echo "<h2>Grazie per averci contattato!</h2>";
  echo "<p>Mail inviata con successo</p>";
}else{
  echo "<p>Errore!</p>";
}
?>

PHP:
<?php
//Server Address
$SmtpServer="..";
$SmtpPort="25";
$SmtpUser="..";
$SmtpPass="..";

?>

PHP:
<?php


class SMTPClient
{

function SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body)
{

$this->SmtpServer = $SmtpServer;
$this->SmtpUser = base64_encode ($SmtpUser);
$this->SmtpPass = base64_encode ($SmtpPass);
$this->from = $from;
$this->to = $to;

$this->subject = $subject;
$this->body = $body;


	if ($SmtpPort == "") 
	{
	$this->PortSMTP = 25;
		}else{
	$this->PortSMTP = $SmtpPort;
	}


}

                   

function SendMail ()
{

	if ($SMTPIN = fsockopen ($this->SmtpServer, $this->PortSMTP)) 
	{
           
           fputs ($SMTPIN, "EHLO ".$HTTP_HOST."\r\n");  
           $talk["hello"] = fgets ( $SMTPIN, 1024 ); 
                   
		   fputs($SMTPIN, "auth login\r\n");
		   $talk["res"]=fgets($SMTPIN,1024);
			fputs($SMTPIN, $this->SmtpUser."\r\n");
		    $talk["user"]=fgets($SMTPIN,1024);
		    
		    fputs($SMTPIN, $this->SmtpPass."\r\n");
			$talk["pass"]=fgets($SMTPIN,256);
			   	    
           fputs ($SMTPIN, "MAIL FROM: <".$this->from.">\r\n");  
           $talk["From"] = fgets ( $SMTPIN, 1024 );  
           fputs ($SMTPIN, "RCPT TO: <".$this->to.">\r\n");  
           $talk["To"] = fgets ($SMTPIN, 1024); 
           
           fputs($SMTPIN, "DATA\r\n");
			$talk["data"]=fgets( $SMTPIN,1024 );
           
			
			fputs($SMTPIN, "To: <".$this->to.">\r\nFrom: <".$this->from.">\r\nSubject:".$this->subject."\r\n\r\n\r\n".$this->body."\r\n.\r\n");
			$talk["send"]=fgets($SMTPIN,256);
           
           //CLOSE CONNECTION AND EXIT ... 
		   
           fputs ($SMTPIN, "QUIT\r\n");  
           fclose($SMTPIN); 
		 //  
	}  

return $talk;


}        
           
        

}


?>
 
ciao
intanto un piccolo particolare: il form per inviare i files deve avere
<form... enctype="multipart/form-data">
poi perchè non usi il metodo POST?
per finire, se usi la classe phpmailler ti risolvi i problemi sia per inviare uno o più allegati che l'smtp
 
ciao e grazie.
ho fatto anche prove con POST e inserendo enctype="multipart/form-data" ma nulla,... non funziona. si ho letto di phpmailer ma non ho trovato uno script/form completo da cui partire e non essendo un esperto php non saprei da dove iniziare. ma questo form da me postato non potrebbe funzionare lo stesso?
 
ciao
intanto farei il tutto su un'unica pagina, poi ti do delle indicazioni per usare phpmailler.
scarichi la classe class.phpmailer.php e (visto che usi smtp) class.smtp.php, poi ci pensa phpmailler ad arrangiarsi con la classe smtp.
se cerchi fra gli articoli php di mrwm trovi dove scaricarla


PHP:
<?php
//qui la parte php tutta nella stessa pagina
//costruisco la funzione per allegare il file
function file_da_allegare($file_nome, $file_tmp){//$_FILES['allegato_1']['name'], $_FILES['allegato_1']['tmp_name']
	//ricavo il nome del file e del temp cone gli eventuali percorsi
	$nome_file=pathinfo($file_nome, PATHINFO_BASENAME);
	$nome_file_temp=$file_tmp;
	//ricavo il percorso temporaneo con + slash finale
	$cartella_temp=pathinfo($nome_file_temp, PATHINFO_DIRNAME);
	//aggoungo lo slash in funzione del so
	if (strpos($cartella_temp, '/') !== false){
		$cartella_temp.= "/";
	}else{
		$cartella_temp.= "\\";
	}
	//e ricavo il nome del file da allegare con il suo percorso
	$da_allegare=$cartella_temp.$nome_file;
	//uploado e verifico
	if(move_uploaded_file($nome_file_temp, $da_allegare)){
		return $da_allegare;//file caricato in cartella temporanea e nome da indicare a PHPmailler
	}else{
		return FALSE;//c'è stato un errore
	}
}//fine function file da allegare

if(isset($_POST['invia'])){//verifica se è stato premuto il submit
	//qui ricevi i vari campi es.
	$nome=$_POST['nome'];//nome del mittente
	//eccetera......
	//faccio i controlli necessari per la correttezza dei dati
	//formatto il testo anche con i tag html e lo metto un una varabile es. $invio_il_testo
	//eccetera... ed quello per l'allegato
	$allegato_1=$_FILES['allegato_1'];
	//verifico se c'è l'allegato e lo tratto con la funzione
	if($allegato_1 !=""){//c'è un file da allegare -  carico in cartella temporanea
		$allegare=file_da_allegare($_FILES['allegato_1']['name'],$_FILES['allegato_1']['tmp_name']);
		if($allegare == FALSE){//se non riesco vuoto
			$allegare="";
		}
	}
	//a questo punto ho tutti i dati per inviare il messaggio
	//carico la classe phpmailler e l'istanzio
	require "phpmailler/class.phpmailer.php";//richiamo la classe
	//attento ai percorsi
	$Emailmessaggio = new PHPmailer();
	//parametri necessari
	$Emailmessaggio->SetLanguage('it','language/');//setto il linguaggio
	//per inviare da locale o SMTP*** INIZIO*************************************************************
	$Emailmessaggio->IsSMTP();  // send via SMTP
	$Emailmessaggio->Host     = "smtp.pinco_pallo.it"; // SMTP servers
	$Emailmessaggio->SMTPAuth = true;     // turn on SMTP authentication
	$Emailmessaggio->Username = "sempronio";  // SMTP username
	$Emailmessaggio->Password = "abracadabra"; // SMTP password
	//per inviare da locale o SMTP *** FINE***************************************************************
	$Emailmessaggio->IsHTML(true); // invio l'email in formato HTML
	//inizio dati da inviare
	$Emailmessaggio->FromName= $nome;
	$Emailmessaggio->Subject=$oggetto;
	$Emailmessaggio->From="[email protected]";
	$Emailmessaggio->AddAddress("[email protected]");
	$Emailmessaggio->AddReplyTo("replay@a_chi_voglio.it","");
	$Emailmessaggio->Body=$invio_il_testo;//il testo che ho preparato prima
	if($allegare !=""){//se non vuoto allego
		$Emailmessaggio->AddAttachment($allegare);
	}
	//e finalmente invio
	if(!$Emailmessaggio->Send()){ //errore di trasmissione
  		echo "errore di trasmissione, riprova più tardi";
	}else{ //invio avvenuto
  		echo "grazie per averci contattato...";
	}//fine if-else invio
	//qui eventuale ritorno a dove vuoi
}//fine isset post

?>

<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>" method="post" enctype="multipart/form-data">
<!-- qui metti i vari campi di input -->
<!-- il campo/i per l'allego/i -->
<input name="allegato_1" type="file" id="allegato_1" size="40">
<!-- se vuoi altri allegati -->
<!-- il tasto di submit -->
<input type="submit" name="invia" value="invia">
</form>
p.s.
visto che ti servono gli allegati fai un controllo sul tipo, se ti inviano un .exe può non essere molto gradevole
p.s. al p.s.
sembra complicato, ma non lo è, una volta fatto tutto va via come un treno (incendi aruba permettendo)
 
grazie ora faccio delle prove..lunedì ti faccio sapere perchè nel week end non ci sono. grazie davvero!
 
Ciao,
ho fatto delle prove, ed ho inserito alcuni campi però non mi funziona.. non capisco cosa ho sbagliato, ho visto e rivisto il codice senza trovare nulla. allego di seguito il codice tuo da me modificato:

PHP:
<?php
//qui la parte php tutta nella stessa pagina
//costruisco la funzione per allegare il file
function file_da_allegare($file_nome, $file_tmp){//$_FILES['allegato_1']['name'], $_FILES['allegato_1']['tmp_name']
    //ricavo il nome del file e del temp cone gli eventuali percorsi
    $nome_file=pathinfo($file_nome, PATHINFO_BASENAME);
    $nome_file_temp=$file_tmp;
    //ricavo il percorso temporaneo con + slash finale
    $cartella_temp=pathinfo($nome_file_temp, PATHINFO_DIRNAME);
    //aggoungo lo slash in funzione del so
    if (strpos($cartella_temp, '/') !== false){
        $cartella_temp.= "/";
    }else{
        $cartella_temp.= "\\";
    }
    //e ricavo il nome del file da allegare con il suo percorso
    $da_allegare=$cartella_temp.$nome_file;
    //uploado e verifico
    if(move_uploaded_file($nome_file_temp, $da_allegare)){
        return $da_allegare;//file caricato in cartella temporanea e nome da indicare a PHPmailler
    }else{
        return FALSE;//c'è stato un errore
    }
}//fine function file da allegare

if(isset($_POST['invia'])){//verifica se è stato premuto il submit
    //qui ricevi i vari campi es.
    $nome=$_POST['nome'];//nome del mittente
	$messaggio=$_POST['messaggio'];//messaggio
	$mittente=$_POST['mittente'];//mittente
	$oggetto=$_POST['oggetto'];//mittente
    //eccetera......
    //faccio i controlli necessari per la correttezza dei dati
    //formatto il testo anche con i tag html e lo metto un una varabile es. $invio_il_testo
    //eccetera... ed quello per l'allegato
    $allegato_1=$_FILES['allegato_1'];
    //verifico se c'è l'allegato e lo tratto con la funzione
    if($allegato_1 !=""){//c'è un file da allegare -  carico in cartella temporanea
        $allegare=file_da_allegare($_FILES['allegato_1']['name'],$_FILES['allegato_1']['tmp_name']);
        if($allegare == FALSE){//se non riesco vuoto
            $allegare="";
        }
    }
    //a questo punto ho tutti i dati per inviare il messaggio
    //carico la classe phpmailler e l'istanzio
    require "class.phpmailer.php";//richiamo la classe
    //attento ai percorsi
    $Emailmessaggio = new PHPmailer();
    //parametri necessari
    $Emailmessaggio->SetLanguage('it','language/');//setto il linguaggio
    //per inviare da locale o SMTP*** INIZIO*************************************************************
    $Emailmessaggio->IsSMTP();  // send via SMTP
    $Emailmessaggio->Host     = ".."; // SMTP servers
    $Emailmessaggio->SMTPAuth = true;     // turn on SMTP authentication
    $Emailmessaggio->Username = "..";  // SMTP username
    $Emailmessaggio->Password = ".."; // SMTP password
    //per inviare da locale o SMTP *** FINE***************************************************************
    $Emailmessaggio->IsHTML(true); // invio l'email in formato HTML
    //inizio dati da inviare
    $Emailmessaggio->FromName= $nome;
    $Emailmessaggio->Subject=$oggetto;
    $Emailmessaggio->From=$mittente;
    $Emailmessaggio->AddAddress("..t");
    $Emailmessaggio->AddReplyTo=$mittente;
    $Emailmessaggio->Body=$messaggio;//il testo che ho preparato prima
    if($allegare !=""){//se non vuoto allego
        $Emailmessaggio->AddAttachment($allegare);
    }
    //e finalmente invio
    if(!$Emailmessaggio->Send()){ //errore di trasmissione
          echo "errore di trasmissione, riprova più tardi";
    }else{ //invio avvenuto
          echo "grazie per averci contattato...";
    }//fine if-else invio
    //qui eventuale ritorno a dove vuoi
}//fine isset post

?>

<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>" method="post" enctype="multipart/form-data">
<!-- qui metti i vari campi di input -->
Tua mail:<input type="text" name="mittente" value="" /></form></br>
Oggetto:<input type="text" name="oggetto" value="" /></form></br>
Messaggio:<textarea cols="20" rows="4" name="messaggio"></textarea></br>
<!-- il campo/i per l'allego/i -->
<input name="allegato_1" type="file" id="allegato_1" size="40">
<!-- se vuoi altri allegati -->
<!-- il tasto di submit -->
<input type="submit" name="invia" value="invia">
</form>
 
ciao
ci do un occhio poi ti so dire (comunque lo script che ho fatto io funzia, puoi vederlo sul mio sito)
ma sarebbe opportuno che tu indicassi che tipo di errore ti da.
un piccolo dubbio: la classe l'hai lasciata nella sua cartella phpmailler?
dentro la cartella ci sono i files class.phpmailler.php e calss.smtp.php e la cartella language?
se è nella sua cartella per richiamarla devi stare attento ai percorsi relativi al file del form
es.
require "phpmailler/class.phpmailer.php";
 
ciao
non ti sembra di aver messo un po' troppi </form> ????
ci deve essere solo un tag di chiusura alla fine dopo tutti i campi di input
 
ciao grazie davvero, il problema erano i form... non ci avevo fatto caso, evidentemente col copia e incolla.. grazie davvero tanto!!!
 

Discussioni simili