PHPMailer: inserire allegato

  • Creatore Discussione Creatore Discussione piccino
  • Data di inizio Data di inizio

piccino

Nuovo Utente
9 Dic 2011
7
0
0
Scusatemi, anch'io ho un problema simile.

Ho un form nel sito per invio mail, e vorrei che l'utente potesse riempire i soliti campi Email, Oggetto e Messaggio. con l'opzione di allegare un file, e precisamente solo una immagine jpg, png o bmp.

Ho trovato e sto provando anch'io PHPMailer, ma credo di non sapere dove settare le opportune modifiche per delle determinate esigenze.

questo è il form:
HTML:
<form action="form.php" method="POST">
<table  style="border:0;color:white;float:left">
<tr>	
  <td>Tua Mail:</td>
  <td><input type="text" name="From" value="" style="width: 300px" /><br><br></td>
</tr>
<tr>
  <td>Oggetto:</td>
  <td><input type="text" name="Subject" value="" style="width: 300px" /><br><br></td>
</tr>
<tr>
  <td>Messaggio:</td>
  <td style="width:300px"><textarea cols="20" rows="4" name="Body" style="width:300px;overflow:hidden;height:130px; max-width:300px;max-height:130px"></textarea><br>
  <br></td>
  </tr>
<tr>
  <td>Allega file:</td>
  <td style="width:305px"><input type="file" name="AddAttachment" style="width:305px;" class="file_1"/><br>
  <br><br></td>
</tr>
<tr>
  <td colspan="2"><input type="image"  value="submit" name="imput"  src="images/invia2.png" style="float:right" /><br>
  <br><br><br><span lang="it"></span></td>
</tr>
</table>

e questo è il php:

PHP:
<?
require "phpmailer/class.phpmailer.php";
$messaggio = new PHPmailer();
$messaggio->From='[email protected]';
$messaggio->AddAddress('[email protected]');
$messaggio->AddReplyTo('[email protected]');
$messaggio->Subject='Email con allegato';
$messaggio->Body='Invio file  JPG';

//percorso all'allegato
$messaggio->AddAttachment($_FILES['input']['tmp_name'],$_FILES['input']['name']);  
if(!$messaggio->Send()){
   echo $messaggio->ErrorInfo;
}else{
  echo 'Email inviata correttamente!';
}
$messaggio->SmtpClose();
unset($messaggio);
?>

La risposta che mi da la pagina dopo l'invio è:

"Could not access file: Email inviata correttamente!"

e nell'email arriva:
come mittente "Root User"
come Oggetto "Email con allegato"
come Messaggio "Invio file Pdf"
come Allegato nulla

Dal codice php per Inviare allegati con PHPMailer della guida, ho apportato alcune modifiche (ovviamente sbagliate).

Avendo deciso di non sfruttare il metodo SMTP, ho eliminato tutte le chiamate ai metodi: IsSMTP() e Host(), come da guida, e come consigliato da Eliox precedentemente, ho modificato la stringa:
PHP:
$messaggio->AddAttachment('pdf/file.pdf');

in:

PHP:
$messaggio->AddAttachment($_FILES['input']['tmp_name'],$_FILES['input']['name']);

Arrivato a questo punto mi sono arreso.
Quello che vorrei è che giungesse sia l'email del mittente che inserisce nel campo "Email",
sia il testo della missiva che inserisce nel campo "Messaggio"
e per ultimo il file che allegherà l'utente in formato jpg, png o bmp.

Spero qualcuno saprà aiutarmi?

Un Grazie anticipato è cosa buona e giusta!
 
Ciao Alessandro, e grazie della risposta , vengo subito al punto.

Quello che cerco è un form.php che faccia in modo che l'utente che visita ilmiosito.it, possa, dall'apposito form, compilare i campi obbligatori scrivendo

il suo indirizzo email
l'oggetto dell'email in questione
il messaggio di testo

e infine dargli la possibilità di allegare un immagine formato jpg presa dal suo PC (immaginiamo che ilmiosito.it sia un sito di riparazione moto, il tipo ha un danno alla sua moto e mi allega una foto del danno).

Nell'articolo Inviare email con la classe PHPMailer, nell'esempio :

PHP:
<?
require "phpmailer/class.phpmailer.php";
$messaggio = new PHPmailer();
$messaggio->IsSMTP();
$messaggio->Host='Host SMTP';
$messaggio->From='[email protected]';
$messaggio->AddAddress('[email protected]');
$messaggio->AddReplyTo('[email protected]'); 
$messaggio->Subject='Email con allegato';
$messaggio->Body='Invio file Pdf';

//percorso all'allegato
$messaggio->AddAttachment('pdf/file.pdf');
if(!$messaggio->Send()){
  echo $messaggio->ErrorInfo; 
}else{ 
  echo 'Email inviata correttamente!';
}
$messaggio->SmtpClose();
unset($messaggio); 
?>

tratta file pdf predefinito, oggetto predefinito, e mittente predefinito, e molto probabilmente non è quello necessario per le sopraindicate esigenze.

Preciso che ho un form diciamo "semplice"
che funziona in parte:

HTML:
<form action="form.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="destinatario" value="[email protected]">
<table  style="border:0;color:white;float:left">
<tr>	
  <td>Tua Mail:</td>
  <td><input type="text" name="mittente" value="" style="width: 300px" /><br><br></td>
</tr>
<tr>
  <td>Oggetto:</td>
  <td><input type="text" name="oggetto" value="" style="width: 300px" /><br><br></td>
</tr>
<tr>
  <td>Messaggio:</td>
  <td style="width:300px"><textarea cols="20" rows="4" name="messaggio" style="width:300px;overflow:hidden;height:130px; max-width:300px;max-height:130px"></textarea><br>
  <br></td>
  </tr>
<tr>
  <td>Allega file:</td>
  <td style="width:305px"><input type="file" name="allegato" style="width:305px;" class="file_1"/><br>
  <br><br></td>
</tr>
<tr>
  <td colspan="2"><input type="image"  value="submit"  src="images/invia2.png" style="float:right" /></td>
</tr>
</table>
</form>

PHP:
<?php
// Recupero il valore dei campi del form
$destinatario = $_POST['destinatario'];
$mittente = $_POST['mittente'];
$oggetto = $_POST['oggetto'];
$messaggio = $_POST['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";

  // 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;
}

// Invio la mail
if (mail($destinatario, $oggetto, $msg, $headers))
{
  echo "<p>Mail inviata con successo!</p>";
}else{
  echo "<p>Errore!</p>";
}
?>

Dico in parte perché:

se si compilano tutti i campi e si allega qualsiasi file, va tutto a buon fine con "Mail inviata con successo!"
se non si compila nulla e non si allega nulla e si clicca si "Invia" è sempre "Mail inviata con successo!"
( ovviamente non arriva nessuna email ) e non da "Errore" come da codice

Mi era stato consigliato il PHPMailer proprio per ragioni di sicurezza nell'eventualità di invio di file dannosi.

Ora la mia domanda è:

per un form html tipo:

HTML:
<form action="form.php" method="POST" enctype="multipart/form-data">
<table  style="border:0;color:white;float:left">
<tr>	
  <td>Tua Mail:</td>
  <td><input type="text" name="From" value="" style="width: 300px" /><br><br></td>
</tr>
<tr>
  <td>Oggetto:</td>
  <td><input type="text" name="Subject" value="" style="width: 300px" /><br><br></td>
</tr>
<tr>
  <td>Messaggio:</td>
  <td style="width:300px"><textarea cols="20" rows="4" name="Body" style="width:300px;overflow:hidden;height:130px; max-width:300px;max-height:130px"></textarea><br>
  <br></td>
  </tr>
<tr>
  <td>Allega file:</td>
  <td style="width:305px"><input type="file" name="AddAttachment" style="width:305px;" class="file_1"/><br>
  <br><br></td>
</tr>
<tr>
  <td colspan="2"><input type="image"  value="submit" name="imput"  src="images/invia2.png" style="float:right" /><br>
  <br><br><br><span lang="it"></span></td>
</tr>
</table>

esiste un form.php (che possa anche includere il "class.phpmailer.php") che faccia in modo che:

se non si compilino i campi dia l'errore,
e che faccia allegare solo jpg.

Spero di essermi spiegato.

Un Grazie anticipato è cosa buona e giusta!
 
ciao
nei miei form generalmente faccio così, ti schematizzo, prova a buttare giù qualcosa e poi eventualmente procediamo
intanto faccio tutto in una pagina unica php.
ecco lo schema, leggi i commenti (guarda che i vari nomi dei campi/post/variabili che uso li metto a caso, quindi devi verificarene la corrispondenza a quello che hai tu)

PHP:
<?php
//i controlli li faccio impostando delle funzioni di cui ti indico un esempio, le funzioni le metto all'inizio pagina
function controlla_email($em){
	$em=filter_var($email, FILTER_SANITIZE_EMAIL);//ripulisce
	if(!filter_var($em, FILTER_VALIDATE_EMAIL)){
		return FALSE;//l'indirizzo non è sintatticamente valido ritorno il valore FALSE
	}else{
		return $em;//indirizzo ok, ritorno l'indirizzo
	}//fine if email
}//fine function
//....e altre function
if(isset($_POST['input'])){//verifico che sia stato premuto il submit per l'invio
	$errori="";//inizializzo a vuoto i messaggi di errori
	//raccolgo ì vari post
	$from=controlla_email($_POST['email']);//leggo l'indirizzo verificandolo con la function
	if($from === FALSE){//se FALSE valorizzo $errori col suo messaggio
		//metto la concatenazione .= perchè gli errori possono essere più di uno
		$errori .="indirizzo email mancante o non corretto<br>";
	}
	//ecc..... con tutti gli altri post
	//verifico quindi che non ci siano stati errori
	if($errori !=""){//se $errori non è vuoto ci sono errori
		echo $errori;//visualizzo il messaggio di errore quindi ritorno in automatico al form pulito
		echo "<meta http-equiv='Refresh' content='4; URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>";//con content = 4 secondi di attesa
	}else{//non ci sono errori
		require "phpmailler/class.phpmailer.php";//richiamo la classe
		$Emailmessaggio = new PHPmailer();
		$Emailmessaggio->SetLanguage('it','language/'); //messo italiano, ma la scelta è vasta
		$Emailmessaggio->IsHTML(true); // invio l'email in formato HTML
		//ecc... metto tutte le variabili come hai fatto
		if(!$Emailmessaggio->Send()){ //errore di trasmissione
  			echo "errore di trasmissione, riprova più tardi";
		}else{ //invio avvenuto
  			echo "email inviata, ti contatteremo al più presto";
		}//fine if-else invio e ritorno al form
		echo "<meta http-equiv='Refresh' content='4; URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>";
	}//fine if/else invio
}//fine if submit
?>

<!--metti nell'action $_server... in modo che puoi modificare il nome della pagina senza problemi-->
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="POST" enctype="multipart/form-data">
<!-- quello che hai messo va bene -->
</form>

guarda che è uno schema perfettibile
 
Ciao Borgo Italia, grazie prima di tutto, io l'ho buttata giu qualcosa, pa credo di averla "buttata" nel vero senso della parola.

Partendo dal tuo esempio, ho provato ad aggiungere i post come mi ricordavi, facendo opportune modifiche (sbagliate), ai nomi, variabili ecc. ecc.

Questa è la pagina unica form_mail.php

Codice:
<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<title>form_mail.php</title>
</head>
<body>
<?php 
//i controlli li faccio impostando delle funzioni di cui ti indico un esempio, le funzioni le metto all'inizio pagina 
function controlla_email($em){ 
    $em=filter_var($email, FILTER_SANITIZE_EMAIL);//ripulisce 
    if(!filter_var($em, FILTER_VALIDATE_EMAIL)){ 
        return FALSE;//l'indirizzo non è sintatticamente valido ritorno il valore FALSE 
    }else{ 
        return $em;//indirizzo ok, ritorno l'indirizzo 
    }//fine if email 
}//fine function 
//....e altre function 
if(isset($_POST['input'])){//verifico che sia stato premuto il submit per l'invio 
    $errori="";//inizializzo a vuoto i messaggi di errori 
    //raccolgo ì vari post 
    $from=controlla_email($_POST['email']);//leggo l'indirizzo verificandolo con la function 
    if($from === FALSE){//se FALSE valorizzo $errori col suo messaggio 
        //metto la concatenazione .= perchè gli errori possono essere più di uno 
        $errori .="indirizzo email mancante o non corretto<br>"; 
    }
    $subject=controlla_oggetto($_POST['subject']);//leggo l'oggetto verificandolo con la function 
    if($subject === FALSE){//se FALSE valorizzo $errori col suo messaggio 
        //metto la concatenazione .= perchè gli errori possono essere più di uno 
        $errori .="Oggetto mancante<br>"; 
    }
    $body=controlla_messaggio($_POST['body']);//leggo l'oggetto verificandolo con la function 
    if($subject === FALSE){//se FALSE valorizzo $errori col suo messaggio 
        //metto la concatenazione .= perchè gli errori possono essere più di uno 
        $errori .="Messaggio mancante<br>"; 
    }
    $attachment=controlla_allegato($_FILES['body']['tmp_name'],$_FILES['body']['name']);//controllo l'allegato verificandolo con la function 
    if($subject === FALSE){//se FALSE valorizzo $errori col suo messaggio 
        //metto la concatenazione .= perchè gli errori possono essere più di uno 
        $errori .="Allegato mancante<br>"; 
    }
    //ecc..... con tutti gli altri post 
    //verifico quindi che non ci siano stati errori 
    if($errori !=""){//se $errori non è vuoto ci sono errori 
        echo $errori;//visualizzo il messaggio di errore quindi ritorno in automatico al form pulito 
        echo "<meta http-equiv='Refresh' content='4; URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>";//con content = 4 secondi di attesa 
    }else{//non ci sono errori 
        require "phpmailler/class.phpmailer.php";//richiamo la classe 
        $Emailmessaggio = new PHPmailer(); 
        $Emailmessaggio->SetLanguage('it','language/'); //messo italiano, ma la scelta è vasta 
        $Emailmessaggio->IsHTML(true); // invio l'email in formato HTML
        $Emailmessaggio->From = $from;
        $Emailmessaggio->subject = $subject;
        $Emailmessaggio->body = $body;
        $Emailmessaggio->AddAddress('[email protected]');
        $Emailmessaggio->AddAttachment= $attachment;      // attach
        //ecc... metto tutte le variabili come hai fatto 
        if(!$Emailmessaggio->Send()){ //errore di trasmissione 
              echo "errore di trasmissione, riprova più tardi"; 
        }else{ //invio avvenuto 
              echo "email inviata, ti contatteremo al più presto"; 
        }//fine if-else invio e ritorno al form 
        echo "<meta http-equiv='Refresh' content='4; URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>"; 
    }//fine if/else invio 
}//fine if submit 
?> 

<!--metti nell'action $_server... in modo che puoi modificare il nome della pagina senza problemi--> 
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="POST" enctype="multipart/form-data"> 
<!-- quello che hai messo va bene -->
<table  style="border:0;color:black;float:left">
<tr>	
  <td>Tua Mail:</td>
  <td><input type="text" name="from" value="" style="width: 300px" /><br><br></td>
</tr>
<tr>
  <td>Oggetto:</td>
  <td><input type="text" name="subject" value="" style="width: 300px" /><br><br></td>
</tr>
<tr>
  <td>Messaggio:</td>
  <td style="width:300px"><textarea cols="20" rows="4" name="body" style="width:300px;height:130px;"></textarea><br>
  <br></td>
  </tr>
<tr>
  <td>Allega file:</td>
  <td style="width:305px"><input type="file" name="attachment" style="width:305px;"/><br>
  <br><br></td>
</tr>
<tr>
  <td colspan="2"><input type="submit"  value="Invia" name="imput"  /><br>
  <br><br><br><span lang="it"></span></td>
</tr>
</table> 
</form>
</body>
</html>

e qui è l'esempio

...cosa devo dirti, c'ho provato!!

compilando tutti i campi o non compilandoli, non da cenni di vita, mi si azzerano solo i campi e torna come prima, niente errori o messaggi.

l'unico messaggio appropriato che mi viene è "un bel corso approfondito di php no??"

Mentre mi frusto le parti basse chiedo umilmente un Aiuto!

Un Grazie anticipato è cosa buona e giusta.
 

Discussioni simili