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
 
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
 
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 :)
 
ciao
devi impostare in questa maniera
PHP:
<?php
//....non ho messo i dovuti controlli se provengono da form
$destinatario="pinco_pallo@pallino.it";
$oggetto ="invio in formato html";//immagino che provenga da un form
$mittente "sofonisba@bergonzi.com";//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
 
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 = "pocodibuono4ever@yahoo.it"; 
$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
 
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