Form mail scelta se inviare il testo in html

IImanuII

Utente Attivo
10 Giu 2012
390
0
16
Salve a tutti (di nuovo),
Ho un form per inviare mail (che borgo italia mi ha già aiutato a modificare) basato su questo script https://www.mrw.it/php/articoli/inviare-email-allegati-usando-php_497_2.html

In particolare vorrei sapere come posso fare per modificare tale script e far si che invii e mail in html. Ho provato in questo modo:

Ho modificato:
PHP:
// 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";

Con:
PHP:
 // Questa è la parte "testuale" del messaggio  
  $msg .= "Content-type: text/html; charset=iso-8859-1\r\n";  
  $msg .= "MIME-Version: 1.0\r\n";  
  $msg .= "Content-Transfer-Encoding: 7bit\n\n";
  $msg .= $messaggio . "\n\n";

Solo che le email se mandate in html non vengono comunque lette.....

Mi chiedevo se inoltre era possibili fare una cosa come questa:
http://free-script.it/post/Script_php_Invio_mail_in_formato_html_con_allegato-16.htm

Grazie.

Manu
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
149
63
PR
www.borgo-italia.it
ciao
per inviare in html devi modificare la parte heder della funzione mail, non la parte del messaggio
guarda qui
http://it.php.net/manual/en/function.mail.php
e scorri sino all'esempio #4

perche non passi alla classe phpmailer abbandonando mail()? ti risolveresti molti problemi

poi se invii in formato html la ricezione non dipende da te ma da come il ricevente ha impostato il client di posta.
con php mailer si puo inviare un messaggio in html e contemporanemente in formato txt in modo che chi riceve veda comunque un email corretta
 

IImanuII

Utente Attivo
10 Giu 2012
390
0
16
ciao
per inviare in html devi modificare la parte heder della funzione mail, non la parte del messaggio
guarda qui
http://it.php.net/manual/en/function.mail.php
e scorri sino all'esempio #4

La parte di codice interessata è questa quindi:
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/plain; charset=\"iso-8859-1\"\n"; 
  $msg .= "Content-Transfer-Encoding: 7bit\n\n"; 
  $msg .= $messaggio . "\n\n";

Ho provato sia ad aggiungere
PHP:
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

Che a sostituire
PHP:
  $headers .= "Content-Type: multipart/mixed;\n";

con
PHP:
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

Ma non va Ovviamente in ambo due i casi ho cambiato
PHP:
  $msg .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
con
PHP:
  $msg .=  'Content-type: text/html; charset=iso-8859-1' . "\r\n";

perche non passi alla classe phpmailer abbandonando mail()? ti risolveresti molti problemi

poi se invii in formato html la ricezione non dipende da te ma da come il ricevente ha impostato il client di posta.
con php mailer si puo inviare un messaggio in html e contemporanemente in formato txt in modo che chi riceve veda comunque un email corretta

Perchè prima di fare questo form l'ho usata ma le mail che inviavo arrivavano SEMPRE nella cartella spam di hotmail, con questo script invece no. Poi oramai è completo e funzionante in ogni sua parte, vorrei solo far si che invii mail in html e poi basta :)
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
149
63
PR
www.borgo-italia.it
ciao
devi impostare in questa maniera
PHP:
<?php
//....non ho messo i dovuti controlli se provengono da form
$destinatario="[email protected]";
$oggetto ="invio in formato html";//immagino che provenga da un form
$mittente "[email protected]";//immagino che provenga da un form
$testo="ciao\r <b>come stai?</b>";//immagino che provenga da un form area di testo con formattazione
$testo=nl2br($testo);//trasforma \r in <br> * guarda se è necessario *
$msg="<html><body>";
$msg .="$testo";
$msg .= "<hr>";
$msg .= "messaggio inviato da: $mittente<br>";
$msg .= "il ".date("d.m.Y h:i:s")."<hr>";
$msg="</body></html>";
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
//se vuoi pui aggiunge altre informazioni a $headers
if(mail($destinatario, $oggetto,$msg,$headers)){
	echo "email inviata con successo";
}else{
	echo "errore di trasmissione, riprova più tardi";
}
//....
?>
ti ricordo che però chi riceve deve avere il cliente (es. outlook) impostato su html altrimenti ci riceve vede il testo e i tag inseriti, ma non la formattazione
 

IImanuII

Utente Attivo
10 Giu 2012
390
0
16
In base a quello che hai scritto tu mi trovo "logicamente con le modifiche che ti ho detto prima........ eppure non va!

Ti riposto il codice magari riesci ad indicarmi l'errore.

form.php

PHP:
<?php 
session_start();//attento deve essere la prima istruzione anche prima di require o include 
//ti aggiungo questa parte più sicura dei cookie per imperdire l'accesso a invia.php 
$_SESSION['p'] = sha1(uniqid(mt_rand()));//genero e codifico un numero casuale 
//come vedrai ti aggiungo un campo hidden per trasmettere e confrontare il numero generato 
/* 
qui la parte per la verifica del numero di email inviate 
è inutile mostrare il pulsante di submit se l'email non può essere inviata, o meglio 
NON mostrare l'intero form, dai un avviso e riinvii alla pg che vuoi 
*/ 
$numero_massimo=10;//che puoi modificare 
require_once "connessione.php"; 
$dati=mysql_fetch_array(mysql_query("SELECT *FROM inviate")); 
$id=$dati['id']; 
$data=$dati['data']; 
$quante=$dati['numero']; 
$oggi=date("Y-m-d");//!!!verifica che sia nello stesso formato di quello che hai nel db 
//verifico quante email sono state inviate oggi 
if($oggi == $data && $quante >= $numero_massimo){ 
    //oggi ho raggiunto il numero massimo di email quindi non posso inviare 
    //avviso e ritorno in automatico alla pag che mi pare 
    echo "<center><br><h1>Oggi $oggi sono state già inviate $quante email, non è possibile inviarne altre!<br>Reindirizzamento in corso...</center></h1>"; 
    //quindi dopo 4 sec riinvio (uso il tag meta e non header refresh per non aggiungere altre istruzioni) 
    echo "<meta http-equiv='Refresh' content='4; URL=ops.php'>"; 
    exit; 
}else{ 
//non ho raggiunto il numero massimo quindi posso inviare 
?> 
<html>  
<head>  
<title></title> 
<META HTTP-EQUIV="Imagetoolbar" Content="no"> 
<link rel="stylesheet" type="text/css" href="stile.css"> 
<script language="javascript">

//funzione per disabilitare il tasto destro del mouse
var message=""; 

function clickIE() {

if (document.all) {
(message); 
return false
}

} 

function clickNS(e) {

if (document.layers||(document.getElementById&&!document.all)) {
if (e.which==2||e.which==3) {(message); return false}}} 
if (document.layers) {document.captureEvents(Event.MOUSEDOWN); document.onmousedown=clickNS} 
else {
document.onmouseup=clickNS; document.oncontextmenu=clickIE
} 

document.oncontextmenu=new Function("return false")

// funzione per accettare solo numeri nel box del campo verifica

function reloadCaptcha() 
{
	document.getElementById("image").src=document.getElementById("image").src;
}

function keyCheck(eventObj, obj)
{
var keyCode

// Check For Browser Type
if (document.all){
keyCode=eventObj.keyCode
}
else{
keyCode=eventObj.which
}

var str=obj.value

if(keyCode==46){
if (str.indexOf(".")>0){
return false
}
}

if((keyCode<48 || keyCode >58) && (keyCode != 46)){ // Allow only integers and decimal points
return false
}

return true
}

//funzione di validazione delle due mail, messaggio, nome e oggetto
function validate()
{
var str=true;
document.getElementById("msgnome").innerHTML="";
document.getElementById("msgemailinvia").innerHTML="";
document.getElementById("oggetto").innerHTML="";



if(document.modulo.nomedichiinvia.value=='')
{
document.getElementById("msgnome").innerHTML="&nbsp;<img src=\"./sign_warning.png\" align=\"absmiddle\">&nbsp;Inserire il nome.";
str=false;
}

var validate_char= /^[\w\-\.\+]+\@[a-zA-Z0-9\.\-]+\.[a-zA-z0-9]{2,4}$/;
if(!document.modulo.maildichiinvia.value.match(validate_char))
{
document.getElementById("msgemailinvia").innerHTML="&nbsp;<img src=\"./sign_warning.png\" align=\"absmiddle\">&nbsp;Inserire un indirizzo email valido.";
str=false;
}

if(document.modulo.oggetto.value=='')
{
document.getElementById("oggetto").innerHTML="&nbsp;<img src=\"./sign_warning.png\" align=\"absmiddle\">&nbsp;Inserire l\'oggetto della mail.";
str=false;
}

if(document.modulo.messaggio.value=='')
{
document.getElementById("messaggio").innerHTML="&nbsp;<img src=\"./sign_warning.png\" align=\"absmiddle\">&nbsp;Inserire il messaggio.";
str=false;
}

return str;

}
</script>
</head>  
<body oncontextmenu="return false;" ondragstart="return false;" onselectstart="return false;"> 
<p>   
<form name="modulo" action="invio.php" method="post" enctype="multipart/form-data" onSubmit="return validate()" > 
<table border="0" align="center" >   
    <tr> 
      <td width="160"><div align="left"><b>Nome di chi invia&nbsp;:</b>&nbsp;&nbsp;&nbsp;<br></div></td> 
      <td width="100"><input size="44" type="text" name="nomedichiinvia" ></td> 
    </tr>  
    <tr> 
      <td width="160"><br></td> 
      <td width="100"><div></div><div id="msgnome" style="color:#FF0000"></div></td> 
    </tr>   
    <tr> 
      <td width="160"><div align="left"><b>Email di chi invia&nbsp;:</b>&nbsp;&nbsp;&nbsp;<br></div></td> 
      <td width="100"><input size="44" type="text" name="maildichiinvia" ></td> 
    </tr>  
    <tr> 
      <td width="160"><br></td> 
      <td width="100"><div id="msgemailinvia" style="color:#FF0000"></div></td> 
    </tr>      
    <tr> 
      <td width="160"><div align="left"><b>Oggetto&nbsp;:</b>&nbsp;&nbsp;&nbsp;<br></div></td> 
      <td width="100"><input size="44" type="text" name="oggetto" ></td> 
    </tr>  
    <tr> 
      <td width="160"><br></td> 
      <td width="100"><div id="oggetto" style="color:#FF0000"></div></td> 
    </tr>        
    <tr> 
      <td width="160"><div align="left"><b>Messaggio&nbsp;:</b>&nbsp;&nbsp;&nbsp;<br></div></td> 
      <td width="100"><textarea cols="20" rows="4" name="messaggio" style="width:293px;overflow:hidden;height:130px; max-width:300px;max-height:130px"></textarea></td> 
    </tr>  
    <tr> 
      <td width="160"><br></td> 
      <td width="100"><div id="messaggio" style="color:#FF0000"></div></td> 
    </tr>         
    <tr> 
      <td width="160"><div align="left"><b>Allega file&nbsp;:</b>&nbsp;&nbsp;&nbsp;<br></div></td> 
      <td width="100"><input type="file" name="allegato" size="32" class="file_1"/></td> 
    </tr> 
    <tr> 
      <td width="160"><br></td> 
      <td width="100"></td> 
    </tr>       
    <tr> 
        <td width="160"><div align="left"><b>Codice di verifica&nbsp;:</b>&nbsp;&nbsp;&nbsp;<br></div></td> 
          <td width="30"><input type="text" name="verif_box" id="verif_box" size="25" onKeyPress="return keyCheck(event, this)" />       
            <a onclick="javascript:reloadCaptcha()" style="cursor: pointer;"><img src="refresh.png" valign="middle" ></a>  
            <iframe align="left" valign="top" id="image" style="border:0;height:40px;width:60px" scrolling="no" src="verificationimage.php?<?php echo rand(0,9999);?>" ></iframe> 
        </td> 
    </tr>  
    <tr> 
      <td width="160"><br></td> 
      <td width="100"></div></td> 
    </tr>     
    <tr> 
      <!-- *********ecco qui il campo hidden ******--> 
      <td width="160"><input name="accesso" type="hidden" value="<?php echo $_SESSION['p'];?>"></td> 
      <td width="100"><center><input type="submit" name="Submit" value="Invia"><input type="reset" value="Reset"></center></td> 
    </tr> 
  </table> 
</td> 
</tr> 
</table> 
</form> 
</body>  
</html> 
<?php 
}//fine dell if else invio permesso o non permesso 
?>


Invio.php
PHP:
<?php 
session_start(); 
if(!isset($_SESSION['p']) || $_SESSION['p'] != $_POST['accesso']){//ricorda i cookie possono essere cancellati dall'utente 
    //la sessione non esiste o è diversa da valore del campo nascosto: ho tentato un accesso diretto a invio.php 
    header('Location: ops.php'); 
    exit; 
}else{ 
    //provengo dal form quindi posso fare le verifiche del numero per upparlo 
    //la cosa è possibile solo se il numero di oggi è minore dell'ammesso 
    //elimino la sessione che non serve più 
    unset($_SESSION['p']); 
    require_once "connessione.php"; 
    $mumero_massimo=10; 
    $dati=mysql_fetch_array(mysql_query("SELECT *FROM inviate"));//non metto il controllo per la prima volta di utilizzo 
	$id=$dati['id']; 
    $data=$dati['data']; 
    $quante=$dati['numero']; 
	$oggi=date("Y-m-d");   
    if($oggi == $data){  
        //aggiorno il numero di email inviate oggi  
        $up=mysql_query("UPDATE inviate SET numero=numero+1 WHERE id=$id");  
    }else{  
        $up=mysql_query("UPDATE inviate SET data= '$oggi', numero=0  WHERE id=$id");  
    }  
    /* *************************** 
    qui dovresti mettere i controlli lato server dei dati inviati 
    qui metti tutto il tuo ambaradan di lettura dei dati e l'invio 
    **************************** */ 
if ($_POST['Submit'] == 'Invia')
{

// Recupero il valore dei campi del form
 
$fromname = $_POST['nomedichiinvia'];
$fromemail = $_POST['maildichiinvia'];
$destinatario = "[email protected]"; 
$oggetto = $_POST['oggetto']; 
$messaggio = $_POST['messaggio']; 
$verif_box = $_POST["verif_box"];

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

// Creo la variabile headers 
$lt= '<';
$gt= '>';
$sp= ' ';
$from= 'From:';
$headers = $from.$fromname.$sp.$lt.$fromemail.$gt;
$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; 
} 	


// controllo se il codice di verifica è corretto
if(md5($verif_box).'a4xn' == $_COOKIE['tntcon']){
	// se il codice di verifica è corretto invio il messaggio
	mail($destinatario, $oggetto, $msg, $headers);
	// 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 {

	echo '<html><center>OooopS!</center><br><a href="javascript:history.go(-1)">Torna indietro</a></html>';
	
	exit;
	}

} 
	
	
}//fine if else : provengo da form.php 
?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>E-Mail inviata</title>
<style type="text/css">
<!--
body,td,th {
	font-family: Arial, Helvetica, sans-serif;
	font-size: 12px;
}
-->
</style></head>

<body>
<table width="100%" height="100%">
<tr>
<td align="center" valign="middle">

Email inviata. Grazie.<br />
<br />
<a href="javascript:history.go(-1)">Torna indietro</a>

</td>
</tr>
</table>
</body>
</html>

Ho provato a cambiare la variabile headers così
PHP:
$headers = "From: $fromname $sp $lt $fromemail $gt $from\nContent-Type:text/html"; // shows name, from, and makes the email able to use html

L'unico risultato è che se invio una mail in html vede il testo correttamente ma non interpreta il codice ad es. se invio un testo di colore blu arriva la mail, i tag html non vengono visualizzati ed il testo sembra come se non fosse in html
 

IImanuII

Utente Attivo
10 Giu 2012
390
0
16
Il problema secondo me è qui

PHP:
$headers .= "\nMIME-Version: 1.0\n";  
  $headers .= "Content-Type: multipart/mixed;\n";

$headers .= "Content-Type: multipart/mixed;\n"; è multipart mixed per poter permettere l'invio di un allegato
Allora ho pensato di agire sul msg visto che era dichiarato in questo modo

$msg .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";

Cambiando in


$msg .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

Solo che non ha prodotto alcun risultato
 
Discussioni simili
Autore Titolo Forum Risposte Data
Z form invio mail, scelta destinatari PHP 0
U PHP bottone per invio mail o ritorno al form PHP 15
I [PHP] inviare form con allegato tramite una mail PHP 1
B [PHP] Invio mail automatico dopo compilazione form - db PHP 25
Cosina Andare a capo nel testo della mail ricevuta dal form php PHP 1
paloppa [PHP] Invio mail da form dubbio PHP 17
F Form mail php errore invio PHP 5
allegria [PHP] Ricevo una doppia mail dal form PHP 6
ecosito [PHP] Attivare il form mail di un template PHP 2
Samuele Ronzani Form mail HTML HTML e CSS 7
utente Form mail php - indirizzo ip PHP 9
I form invio mail HTML e CSS 1
Francesco Polese Errore form invio mail+php PHP 22
F Form mail HTML e CSS 14
P invio mail da form con dati php PHP 7
W Estrapolare un indirizzo mail di un form durante l'invio PHP 5
P Creare form e inviare via mail HTML e CSS 2
I invio mail da form PHP 1
S Form invio mail html, con invio tramite file denominato invio.php PHP 8
R form mail in copiavuote PHP 3
F Problemi con ricezione mail dal form PHP 8
D form mail non funzionante PHP 1
Il Matta Problema Form e invio mail PHP 2
M non ci do fuori con il form mail PHP 1
M Form mail con dreamweaver cs6 PHP 2
S inviare the_title() in una mail tramite form html/php PHP 0
B Problema form mail per invio doppio allegato PHP 1
A Problema orario invio mail per form PHP 4
L Sviluppare form mail con allegato PHP 6
S Form per mandare la mail HTML e CSS 2
S php form invio mail PHP 3
L Form con invio mail PHP 1
A Form Mail PHP 12
U form mail per inviare tracciabilità corriere PHP 0
A Form mail php - ajax PHP 9
M Adattare script di "form mail con upload file" al mio form mail HTML! PHP 7
M form mail con allegato e immagine Classic ASP 4
M Form Mail: come farlo girare su server Windows? HTML e CSS 1
S Form mail php invia mail senza contenuto PHP 15
A form in php o html per raccolta mail PHP 4
E Form invio e-mail con allegato PHP 51
E Form invio e-mail con allegato PHP 0
E form mail con mysql PHP 18
N Form invio Mail con Allegato PHP 2
IImanuII Form mail in php e gmail.... PHP 0
P Inviare mail da form php anche al mittente PHP 37
C problema invio mail con form php PHP 0
F Problema form mail PHP 13
F Mail con un form post PHP 3
YellowMan Form mail per WordPress in italiano WordPress 2

Discussioni simili