For invio mail-allegato con smtp

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;


}        
           
        

}


?>
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

dla86

Utente Attivo
27 Mag 2009
36
0
0
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?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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)
 

dla86

Utente Attivo
27 Mag 2009
36
0
0
grazie ora faccio delle prove..lunedì ti faccio sapere perchè nel week end non ci sono. grazie davvero!
 

dla86

Utente Attivo
27 Mag 2009
36
0
0
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>
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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";
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

dla86

Utente Attivo
27 Mag 2009
36
0
0
ciao grazie davvero, il problema erano i form... non ci avevo fatto caso, evidentemente col copia e incolla.. grazie davvero tanto!!!
 
Discussioni simili
Autore Titolo Forum Risposte Data
B Problema form mail per invio doppio allegato PHP 1
E Form invio e-mail con allegato PHP 51
E Form invio e-mail con allegato PHP 0
N Form invio Mail con Allegato PHP 2
F Implementare l'invio mail con allegato PHP 1
M telecamera Foscam - mancato invio mail ad account gmail IP Cam e Videosorveglianza 0
R Invio mail con allegati multipli PHP 0
R Invio mail con allegati da directory PHP 1
Daniele_Carrara Problema timeout - invio mail PHP 7
U PHP bottone per invio mail o ritorno al form PHP 15
G Invio mail con php da dati prelevati da un database PHP 9
AC1 [PHP] Invio Mail PHP 18
B [PHP] Invio mail automatico dopo compilazione form - db PHP 25
A [PHP] Problema invio mail con funzione mail() PHP 3
A [PHP] RISOLTO Invio Mail con Tabella PHP 2
paloppa [PHP] Invio mail da form dubbio PHP 17
F Form mail php errore invio PHP 5
Punix [PHP] problema script invio e-mail PHP 2
G Invio Mail con PHPMailer, problemi SMTP PHP 7
cobra_72 [PHP] problema invio multiplo allegati mail PHP 21
Z Limite invio newsletter con PHP - mail() PHP 4
E [Javascript] Messaggio di avvenuto invio mail non visualizzato Javascript 1
F Invio Mail con Javascript Javascript 25
E Rimuovere "dati in memoria" dopo invio mail [PHP] PHP 18
lucarpenter Settaggio invio mail allarme IP camera P2P IP Cam e Videosorveglianza 9
I form invio mail HTML e CSS 1
F Invio automatico mail php PHP 0
Francesco Polese Errore form invio mail+php PHP 22
R Errore invio mail in php PHP 1
M Errore invio mail da php Posta Elettronica 5
P invio mail da form con dati php PHP 7
webmachine Come programmare l'invio di una mail in PHP? PHP 1
W Estrapolare un indirizzo mail di un form durante l'invio PHP 5
Z Invio mail da telecamere HIKVision - HELP!!! IP Cam e Videosorveglianza 0
M WANSCAM Invio allarme tramite mail IP Cam e Videosorveglianza 4
M configurazione invio mail php PHP 25
I invio mail da form PHP 1
S Form invio mail html, con invio tramite file denominato invio.php PHP 8
asevenx link cliccabile che non funziona con invio mail PHP 1
P Invio mail diversi destinatari PHP 10
W problemi incomprensibili invio mail dal sito in PHP PHP 3
M Invio mail con destinatari da mysql con inserimento di nome e cognome PHP 6
Il Matta Problema Form e invio mail PHP 2
G WansCam invio mail IP Cam e Videosorveglianza 11
F invio di una mail tramite script php PHP 6
D [Risolto] Invio mail a blocchi Classic ASP 31
A Problema orario invio mail per form PHP 4
S [risolto] Invio scheda dettagliata in mail Classic ASP 6
antonio_oti Invio di e-mail tramite PHP PHP 23
O [PHP] Problema Invio Mail PHP 2

Discussioni simili