Mail in php da testo a html

  • Creatore Discussione Creatore Discussione IImanuII
  • Data di inizio Data di inizio

IImanuII

Utente Attivo
10 Giu 2012
390
0
16
Vi posto l'ennesimo ed ultimo problema (almeno spero D: )

Allora ho un form html che gestisce gli allegati, ed ho preso il codice da qui
https://www.mrw.it/php/articoli/inviare-email-allegati-usando-php_497.html

Il fatto è che invia mail in formato solo testuale, cosa devo sostituire per far si che invii mail in html?

Ho provato questa soluzione ma non funziona

PHP:
 // 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/html; charset=iso-8859-1' . "\r\n";
  $msg .= "Content-Transfer-Encoding: 8bit\n\n"; 
$msg="<html><body>";
$msg .="$messaggio";
$msg="</body></html>";

le variabili che recupero dal form sono queste

PHP:
// Recupero il valore dei campi del form
 
$fromname = $_POST['nomedichiinvia'];
$fromemail = $_POST['maildichiinvia'];
$destinatario = "xxx@yahoo.it"; 
$oggetto = $_POST['oggetto']; 
$messaggio = $_POST['messaggio']; 
$verif_box = $_POST["verif_box"];

Non va, la mail la spedisce sempre in formato testuale, perchè?

Questo
PHP:
 $headers .= "Content-Type: multipart/mixed;\n";
credo di non poterlo toccare altrimenti non invia più l'allegato, giusto?

Vorrei passare al phpmailer, ci ho provato ma non capisco come recuperare i miei campi....
 
Ultima modifica:
Mi dai una mano? non riesco a capire come recuperare i campi dal form....
 
In che senso recuperare? Non ricavi gia le variabili $_POST del form?
 
In che senso recuperare? Non ricavi gia le variabili $_POST del form?

Si esatto non capisco come funziona la classe. Cioè senza classe io recupero i valori dal form in questo modo

PHP:
// Recupero il valore dei campi del form
 
$fromname = $_POST['nomedichiinvia'];
$fromemail = $_POST['maildichiinvia'];
$destinatario = "xxx@yahoo.it"; 
$oggetto = $_POST['oggetto']; 
$messaggio = $_POST['messaggio']; 
$verif_box = $_POST["verif_box"];

Poi li vado a gestire.

Con phpmailer come faccio? Hai percaso un esempio con form e php funzionanti che me lo studio un po?
 
Ultima modifica:
Si esatto non capisco come funziona la classe. Cioè senza classe io recupero i valori dal form in questo modo

PHP:
// Recupero il valore dei campi del form 
  
$fromname = $_POST['nomedichiinvia']; 
$fromemail = $_POST['maildichiinvia']; 
$destinatario = "pocodibuono4ever@yahoo.it";  
$oggetto = $_POST['oggetto'];  
$messaggio = $_POST['messaggio'];  
$verif_box = $_POST["verif_box"];

Poi li vado a gestire.

Con phpmailer come faccio? Hai percaso un esempio con form e php funzionanti che me lo studio un po?
Gestisci gli stessi valori nelle funzioni richiamate dopo l'istanza, come vedi negli esempi :faraone:
 
Gestisci gli stessi valori nelle funzioni richiamate dopo l'istanza, come vedi negli esempi :faraone:

Ad es c'è questo php d'esempio:

PHP:
require_once '../class.phpmailer.php';

$mail = new PHPMailer(true); //defaults to using php "mail()"; the true param means it will throw exceptions on errors, which we need to catch

try {
  $mail->AddReplyTo('name@yourdomain.com', 'First Last');
  $mail->AddAddress('whoto@otherdomain.com', 'John Doe');
  $mail->SetFrom('name@yourdomain.com', 'First Last');
  $mail->AddReplyTo('name@yourdomain.com', 'First Last');
  $mail->Subject = 'PHPMailer Test Subject via mail(), advanced';
  $mail->AltBody = 'To view the message, please use an HTML compatible email viewer!'; // optional - MsgHTML will create an alternate automatically
  $mail->MsgHTML(file_get_contents('contents.html'));
  $mail->AddAttachment('images/phpmailer.gif');      // attachment
  $mail->AddAttachment('images/phpmailer_mini.gif'); // attachment
  $mail->Send();
  echo "Message Sent OK<p></p>\n";
} catch (phpmailerException $e) {
  echo $e->errorMessage(); //Pretty error messages from PHPMailer
} catch (Exception $e) {
  echo $e->getMessage(); //Boring error messages from anything else!
}

Mi disci dove dovrei gestire i miei campi?
 
PHP:
require_once '../class.phpmailer.php'; 

$mail = new PHPMailer(true); //defaults to using php "mail()"; the true param means it will throw exceptions on errors, which we need to catch 

//if(!empty($_POST['variabile']).....) ...controlla tutte le variabili che non devono essere vuote per inviare la mail, e poi settale nulle se inviata o fai un redirect

//vista la situazione non credo ti serva un try catch per gestire le eccezioni
  $mail->AddReplyTo($destinatario, 'Tuo sito'); 
  $mail->AddAddress($_POST['maildichiinvia']; , $_POST['nomedichiinvia']);
  $mail->SetFrom($destinatario, 'Tuo sito'); 
  $mail->Subject = $_POST['oggetto']; 
  $mail->AltBody = 'Usa un editor mail compatibile con l\'html per vedere il messaggio!'; // optional - MsgHTML will create an alternate automatically 
  $mail->MsgHTML($_POST['messaggio']); 
  //$mail->AddAttachment('images/phpmailer.gif');      Ti serve uno o piu allegati?
  if($mail->Send()) {
  echo "Messaggio inviato<p></p>\n"; //...etc..etc...
 }else{
   echo "Errore nell'invio della mail<p></p>\n"; //...etc..etc...
}

Il campo $_POST["verif_box"] cosa sarebbe? Comunque ti ho fatto un esempio col codice che hai postato
 
PHP:
require_once '../class.phpmailer.php'; 

$mail = new PHPMailer(true); //defaults to using php "mail()"; the true param means it will throw exceptions on errors, which we need to catch 

//if(!empty($_POST['variabile']).....) ...controlla tutte le variabili che non devono essere vuote per inviare la mail, e poi settale nulle se inviata o fai un redirect

//vista la situazione non credo ti serva un try catch per gestire le eccezioni
  $mail->AddReplyTo($destinatario, 'Tuo sito'); 
  $mail->AddAddress($_POST['maildichiinvia']; , $_POST['nomedichiinvia']);
  $mail->SetFrom($destinatario, 'Tuo sito'); 
  $mail->Subject = $_POST['oggetto']; 
  $mail->AltBody = 'Usa un editor mail compatibile con l\'html per vedere il messaggio!'; // optional - MsgHTML will create an alternate automatically 
  $mail->MsgHTML($_POST['messaggio']); 
  //$mail->AddAttachment('images/phpmailer.gif');      Ti serve uno o piu allegati?
  if($mail->Send()) {
  echo "Messaggio inviato<p></p>\n"; //...etc..etc...
 }else{
   echo "Errore nell'invio della mail<p></p>\n"; //...etc..etc...
}

Il campo $_POST["verif_box"] cosa sarebbe? Comunque ti ho fatto un esempio col codice che hai postato

E' il campo che controlla che il captcha sia corretto, funziona con l'ausilio dei cookie per far si che la sessione scada e che l'utente non possa reinviare la stessa mail.

Ma una spiegazione di queste (ad es. $mail->AddReplyTo( ) funzioni le trovo nella classe?

Altra cosa, e se io volessi aggiungere ulteriori campi all'header?

//$mail->AddAttachment('images/phpmailer.gif'); Ti serve uno o piu allegati?
Me ne servono di più, due o tre, che consentano l'invio di svariati file poichè gli utenti dovrebber inviarmi o motivi musicali o spartiti o aggiustamenti fatti con dei programmi specifici (quindi i file hanno un estensione non convenzionale). In realtà la molteplicità di allegati vorrei gestirla nella pagina html con questo script: http://api.jquery.com/clone/ però poi ci penso xD
 
Mi ero dimenticato di dirti che il campo che contiene l'allegato è $allegato , successivamente saranno $allegato1 $allegato2 ecc... :mavieni:
 
Ho provato a modificare il php in questo modo

PHP:
require_once '../class.phpmailer.php';  

$mail = new PHPMailer(true); //defaults to using php "mail()"; the true param means it will throw exceptions on errors, which we need to catch  

//settiamo su true il metodo che indica alla classe 
//il formato HTML
$mail->IsHTML(true);

// ...controlla tutte le variabili che non devono essere vuote per inviare la mail, e poi settale nulle se inviata o fai un redirect 
if(!empty($_POST['nomedichiinvia']) && !empty($_POST['emaildichiriceve']) && !empty($_POST['oggetto']) && !empty($_POST['messaggio']) && !empty($_POST['maildichiinvia']) ) {

	header('Location: ops.php');
	
	exit;
	} else {

//vista la situazione non credo ti serva un try catch per gestire le eccezioni 
  $mail->AddReplyTo($destinatario, 'Tuo sito');  
  $mail->AddAddress($_POST['maildichiinvia']; , $_POST['nomedichiinvia']); 
  $mail->SetFrom($destinatario, 'Tuo sito');  
  $mail->Subject = $_POST['oggetto'];  
  $mail->AltBody = 'Usa un editor mail compatibile con l\'html per vedere il messaggio!'; // optional - MsgHTML will create an alternate automatically  
  $mail->MsgHTML($_POST['messaggio']);  
  //$mail->AddAttachment($_FILES['input']['tmp_name'],$_FILES['input']['name']);  //Ti serve uno o piu allegati? 

// controllo se il codice di verifica è corretto
if(md5($verif_box).'a4xn' == $_COOKIE['tntcon']){
	// se il codice di verifica è corretto invio il messaggio
	$mail->Send()
	// cancello il cookie in modo che non può essere inviato nuovamente aggiornando la pagina
	setcookie('tntcon','');
} else if(isset($message) and $message!=""){
	// se il codice di verifica non è corretto o provano ad accedere direttamente alla pagina php mostro l'errore.
} else {

	header('Location: ops.php');
	
	exit;
	}

	} //fine del controllo dei campi vuoti

Solo che mi da un errore alla riga 68 che è
PHP:
  $mail->AddAddress($_POST['maildichiinvia']; , $_POST['nomedichiinvia']);

Che non è altro che il richiamo all'indirizzo mail e al nome di chi mi invia la mail in modo da potergli rispondere.

Il form di prova è questo

http://manutest.site50.net/Form/form.php

Se puoi dai un occhio anche all'allegato vedi se va bene
 
Ultima modifica:
Ho risolto, solo che ora ho un problema con questa parte del codice

PHP:
// controllo se il codice di verifica è corretto
if(md5($verif_box).'a4xn' == $_COOKIE['tntcon']){
	// se il codice di verifica è corretto invio il messaggio
	$mail->Send()
	// cancello il cookie in modo che non può essere inviato nuovamente aggiornando la pagina
	setcookie('tntcon','');
} else if(isset($message) and $message!=""){
	// se il codice di verifica non è corretto o provano ad accedere direttamente alla pagina php mostro l'errore.
} else {

	header('Location: ops.php');
	
	exit;
	}

on line 80

questa in particolare

PHP:
	// cancello il cookie in modo che non può essere inviato nuovamente aggiornando la pagina
	setcookie('tntcon','');

EDIT: mi sono accorto di aver lasciato la mail nel mio codice potreste censurarla? Evitiamo che gli spammer facciano festa...... xD
 
Ultima modifica:
Mi ero dimenticato un ;

PHP:
$mail->Send();

Solo che quando premo invio mi porta sulla pagina d'errore... messaggi d'errore non me ne porta.... (l'unico è un errore mysql ma quello è perchè non ho creato tabelle, ma questo è ininfluente)
 
E' il campo che controlla che il captcha sia corretto, funziona con l'ausilio dei cookie per far si che la sessione scada e che l'utente non possa reinviare la stessa mail.

Ma una spiegazione di queste (ad es. $mail->AddReplyTo( ) funzioni le trovo nella classe?

Altra cosa, e se io volessi aggiungere ulteriori campi all'header?

//$mail->AddAttachment('images/phpmailer.gif'); Ti serve uno o piu allegati?
Me ne servono di più, due o tre, che consentano l'invio di svariati file poichè gli utenti dovrebber inviarmi o motivi musicali o spartiti o aggiustamenti fatti con dei programmi specifici (quindi i file hanno un estensione non convenzionale). In realtà la molteplicità di allegati vorrei gestirla nella pagina html con questo script: http://api.jquery.com/clone/ però poi ci penso xD
Quella funzione serve per aggiungere uno o piu indirizzi di risposta, in che senso nell'header?

Poi come gestisci attualmente gli allegati? Potresti gestirli tramite un ciclo for ad esempio
PHP:
for($i=1;$i<=3;$i++) if(!empty($_POST['allegato'.$i]))$mail->AddAttachment($_POST['allegato'.$i]);
 
Ultima modifica:
Mi ero dimenticato un ;

PHP:
$mail->Send();

Solo che quando premo invio mi porta sulla pagina d'errore... messaggi d'errore non me ne porta.... (l'unico è un errore mysql ma quello è perchè non ho creato tabelle, ma questo è ininfluente)

Allora riaggiungi il try catch per gestire le eccezioni e vediamo che ti dice
 
Allora riaggiungi il try catch per gestire le eccezioni e vediamo che ti dice

Perdonami ma non so come si faccia. Ho modificato l'if per il controllo dei campi (sta nel codice postato su), puoi darci un occhiata? Credo però sia corretto... anche perchè se commento l'if di controllo dei campi l'errore esce comunque.
 
Perdonami ma non so come si faccia. Ho modificato l'if per il controllo dei campi (sta nel codice postato su), puoi darci un occhiata? Credo però sia corretto... anche perchè se commento l'if di controllo dei campi l'errore esce comunque.
Se l'errore si trova nel controllo, assicurati che md5($verif_box).'a4xn' e $_COOKIE['tntcon'] abbiano il valore da te desiderato
 
Se l'errore si trova nel controllo, assicurati che md5($verif_box).'a4xn' e $_COOKIE['tntcon'] abbiano il valore da te desiderato

Il problema è che non riesco a capire dove sia l'errore........... prima con il vecchio metodo d'invio il form funzionava perfettamente, non ho toccato nulla all'interno del php tranne che la parte della mail.
 
Il problema è che non riesco a capire dove sia l'errore........... prima con il vecchio metodo d'invio il form funzionava perfettamente, non ho toccato nulla all'interno del php tranne che la parte della mail.

Che valore hanno le 2 stringhe al confronto? Le hai stampate?

Comunque riaggiungi il try catch
PHP:
try { 
  //settiamo su true il metodo che indica alla classe  
//il formato HTML 
$mail->IsHTML(true); 

// ...controlla tutte le variabili che non devono essere vuote per inviare la mail, e poi settale nulle se inviata o fai un redirect  
if(!empty($_POST['nomedichiinvia']) && !empty($_POST['emaildichiriceve']) && !empty($_POST['oggetto']) && !empty($_POST['messaggio']) && !empty($_POST['maildichiinvia']) ) {

    header('Location: ops.php'); 
     
    exit; 
    } else { 

//vista la situazione non credo ti serva un try catch per gestire le eccezioni  
  $mail->AddReplyTo($destinatario, 'Tuo sito');   
  $mail->AddAddress($_POST['maildichiinvia']; , $_POST['nomedichiinvia']);  
  $mail->SetFrom($destinatario, 'Tuo sito');   
  $mail->Subject = $_POST['oggetto'];   
  $mail->AltBody = 'Usa un editor mail compatibile con l\'html per vedere il messaggio!'; // optional - MsgHTML will create an alternate automatically   
  $mail->MsgHTML($_POST['messaggio']);   
  //$mail->AddAttachment($_FILES['input']['tmp_name'],$_FILES['input']['name']);  //Ti serve uno o piu allegati?  

// controllo se il codice di verifica è corretto 
if(md5($verif_box).'a4xn' == $_COOKIE['tntcon']){ 
    // se il codice di verifica è corretto invio il messaggio 
    $mail->Send() 
    // cancello il cookie in modo che non può essere inviato nuovamente aggiornando la pagina 
    setcookie('tntcon',''); 
} else if(isset($message) and $message!=""){ 
    // se il codice di verifica non è corretto o provano ad accedere direttamente alla pagina php mostro l'errore. 
} else { 

    header('Location: ops.php'); 
     
    exit; 
    } 

    }
} catch (phpmailerException $e) { 
  echo $e->errorMessage(); //Pretty error messages from PHPMailer 
} catch (Exception $e) { 
  echo $e->getMessage(); //Boring error messages from anything else! 
}
Poi ho notato che $destinatario non è settato ma hai messo $_POST['emaildichiriceve'], devi forse sostituirli?
 
Si quegli errori S_POST li avevo già corretti... credo di aver trovato l'errore in maniera un pochino più ortodossa e faticosa.

Ti spiego, in ogni controllo che faccio richiamo la pagina ops.php, così mi son messo a sostituire uno per uno tutti gli errori con un echo ed a provare uno per uno i messaggi d'errore. Ad es. per l'errore dei cookie ho messo "errore 1" e così via....

Il codice d'invio è questo:

PHP:
if ($_POST['Submit'] == 'Invia')
{

//registro l'ip di chi invia la mail su un file php

$file = "logip.php"; 
$open = fopen($file, "a+"); 
$testo = 'Ip mittente: '.$_SERVER['REMOTE_ADDR']. '  - Ora accesso: ' . date("G:i:s Y/m/d") . "<br />\r\n"; 
$write = fwrite ($open, $testo); 
fclose($open); 

// Recupero il valore dei campi del form 
  
$fromname = $_POST['nomedichiinvia']; 
$fromemail = $_POST['maildichiinvia']; 
$destinatario = "mai@mail.io";  
$oggetto = $_POST['oggetto'];  
$messaggio = $_POST['messaggio'];  
$verif_box = $_POST["verif_box"];  


require_once 'class.phpmailer.php';  

$mail = new PHPMailer(true); //defaults to using php "mail()"; the true param means it will throw exceptions on errors, which we need to catch  

//settiamo su true il metodo che indica alla classe 
//il formato HTML
$mail->IsHTML(true);

// ...controlla tutte le variabili che non devono essere vuote per inviare la mail, e poi settale nulle se inviata o fai un redirect 
if(!empty($fromname) && !empty($fromemail) && !empty($oggetto) && !empty($messaggio)  ) {

	header('Location: ops.php');
	
	exit;
	} else {

//vista la situazione non credo ti serva un try catch per gestire le eccezioni 
  $mail->AddReplyTo($destinatario, 'Tuo sito');  
  $mail->AddAddress($fromemail, $fromname); 
  $mail->SetFrom($destinatario, 'Tuo sito');  
  $mail->Subject = $oggetto;  
  $mail->AltBody = 'Usa un editor mail compatibile con l\'html per vedere il messaggio!'; // optional - MsgHTML will create an alternate automatically  
  $mail->MsgHTML = $messaggio;  
  //$mail->AddAttachment($_FILES['input']['tmp_name'],$_FILES['input']['name']);  //Ti serve uno o piu allegati? 

// controllo se il codice di verifica è corretto
if(md5($verif_box).'a4xn' == $_COOKIE['tntcon']){
	// se il codice di verifica è corretto invio il messaggio
	$mail->Send();
	// cancello il cookie in modo che non può essere inviato nuovamente aggiornando la pagina
	setcookie('tntcon','');
} else if(isset($message) and $message!=""){
	// se il codice di verifica non è corretto o provano ad accedere direttamente alla pagina php mostro l'errore.
} else {

	header('Location: ops.php');
	
	exit;
	}

	} //fine del controllo dei campi vuoti
} //fine dell'invio

L'errore credo sia qui:

PHP:
// ...controlla tutte le variabili che non devono essere vuote per inviare la mail, e poi settale nulle se inviata o fai un redirect 
if(!empty($fromname) && !empty($fromemail) && !empty($oggetto) && !empty($messaggio)  ) {

	header('Location: ops.php');
	
	exit;
	} else {

Secondo me la sintassi non è corretta.
 

Discussioni simili