Script php: Invio mail in formato html con allegato

   difficoltà:  script script script script script

Script simili
26/7/2006


Funzione php per l'invio di mail in formato html o testuale con allegato. Se non viene indicato il nome dell'allegato questo non viene inviato, in caso contrario si.
Lo stesso vale per il formato della mail.
Il formato base è l'html. In automatico , se non specificato, il sistema cerca di convertire la mail in formato testuale per utenti che non possono visualizzare le mail in formato html. Se specificato invece è possibile, con maggior sicurezza, inviare una mail in formato html e una in formato testuale sicuramente leggibile da chi non ha attiva la visualizzazione html.

function Sendmail($mittente, $destinatario, $soggetto, $bodyhtml, $bodytxt="", $allegato="", $allegatofolder="/public/"){
$boundary1 ="XXMAILXX".md5(time())."XXMAILXX";
$boundary2 ="YYMAILYY".md5(time())."YYMAILYY";
if($bodytxt=="" && $bodyhtml!=""){
$bodytxt=str_replace("<br>","\n",$bodyhtml);
$bodytxt=strip_tags($bodyhtml);
}
if($bodytxt!="" && $bodyhtml==""){
$bodyhtml=$bodytxt;
}
$headers = "From: $mittente\n";
$headers .= "MIME-Version: 1.0\n";
if ($allegato!=""){
$headers .= "Content-Type: multipart/mixed;\n";
$headers .= " boundary=\"$boundary1\";\n\n";
$headers .= "--$boundary1\n";
}
$headers .= "Content-Type: multipart/alternative;\n";
$headers .= " boundary=\"$boundary2\";\n\n";

//mail alternativa solo testo
$body = "--$boundary2\n";
$body .= "Content-Type: text/plain; charset=ISO-8859-15; format=flowed\n";
$body .= "Content-Transfer-Encoding: 7bit\n\n";
$body .= "$bodytxt\n";
//mail html
$body .= "--$boundary2\n";
$body .= "Content-Type: text/html; charset=ISO-8859-15\n";
$body .= "Content-Transfer-Encoding: 7bit\n\n";
$body .= "$bodyhtml\n\n";
$body .= "--$boundary2--\n";
//allegato se presente
if ($allegato!=""){
$fileallegato=getcwd().$allegatofolder.$allegato;
$fp=@fopen($fileallegato, "r");
if ($fp) {
$data = fread($fp, filesize($fileallegato));
}
$curr = base64_encode($data);

$body .= "--$boundary1\n";
$body .= "Content-Type: application/octet-stream;";
$body .= "name=\"$allegato\"\n";
$body .= "Content-Transfer-Encoding: base64\n\n";
//$body .= "Content-Disposition: attachment;\n";
//$body .= "filename=\"$allegato\"\n\n";
$body .= "$curr\n";
$body .= "--$boundary1--\n";
}

if(@mail($destinatario, $soggetto, $body, $headers)) {
return true;
} else {
return false;
}
}
Esempio invio senza allegati. Solo formato html:
Sendmail("mittente@mail.it", "destinatario@mail.it","prova", "testo<br>testo");
Esempio invio senza allegati. Formato html e testo:
Sendmail("mittente@mail.it", "destinatario@mail.it","prova", "testo<br>testo","testo\ntesto");
Esempio invio con allegato in cartella predefinita:
Sendmail("mittente@mail.it", "destinatario@mail.it","prova", "testo<br>testo","testo\ntesto","file.pdf");
Esempio invio con allegato in cartella diversa:
Sendmail("mittente@mail.it", "destinatario@mail.it","prova", "testo<br>testo","testo\ntesto","file.pdf","/allegati/");


Social:


Donazione:
Se questo script ti è stato utile e ti ho fatto risparmiare tempo e denaro fai una
qualsiasi cifra è ben accetta! 1€, 3€, 5€ ,10€, 50€ ;-) fai te!

Permalink: Tag:
script   php   invio   e-mail   html   allegato  
Script Simili: Permalink: Link utili:
Tools:
Feed RSS    



Commenti


  Pippo

5/1/2007 16:30:12

Mi pare ottimo. Non avresti qualcosa che prevede più allegati?

  Fabio

7/1/2007 20:04:31

@Pippo:
Ti posso consigliare questa classe:
PhpMailer
negli esempi puoi vedere come aggiungere più allegati.
Magari uno dei prossimi script potrebbe essere una guida all'uso di PhpMailer..

  Francesco

27/3/2007 16:39:39

Io non ho alcun messaggio di errore, ma l'email non arriva...
Sbaglio qualcosa?

  Fabio

27/3/2007 16:46:37

ho notato proprio oggi che se il server apache è settato male, senza indirizzo di Return-Path, alcuni server di posta non ricevono la mail, probabilmente vedendola come spam. Infatti su gmail mi arrivavano tranquillamente su altre mail no.

Ho risolto aggiungendo dopo


$headers = "From: $mittente\n";

queste 2 righe:

$headers .= "Reply-To: ".$mittente."\n";
$headers .= "Return-Path: ".$mittente."\n";


fammi sapere se cosi funziona.

  Michele

13/6/2007 14:44:28

Grandissimo funziona! Grazie, mi hai fatto risparmiare un bel po' di tempo e fatica. Ora vedo se riesco a http://phpmailer.sourceforge.net/, ho necessità anch'io di abilitare gli allegati multipli...

  Lucas

4/3/2008 19:52:48

Ciao a tutto il sito free-script.it o un messe che sto facendo il mio sito ed sono a un buon punto , ma da 6 giorni che sto impazzendo a creare un form sendmail.php un amico mi ha indiriziato qui http://free-script.it su questa guida che non penso che fa nel mio caso o provato alcuni script in rete ma non mi funzionano :(
mi potette aiutare a fare il file php per il form del html che posto
vi supplico non so proprio dove sbattere la testa aiutatemi
Grazie in Anticipo

form.html


<form method="post" action="form.php" target="_blank">
<div align="center">
<center>
<table border="0" cellpadding="3" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" id="AutoNumber2">

<tr>
<td><font face="Verdana" size="2">Nome</font></td>
<td><input type="text" name="name" size="30"></td>
</tr>
<tr>
<td><font face="Verdana" size="2">Cognome</font></td>
<td><input type="text" name="surname" size="30"></td>
</tr>

<tr>
<td><font face="Verdana" size="2">Azienda</font></td>
<td><input type="text" name="company" size="30"></td>
</tr>
<tr>
<td><font face="Verdana" size="2">Telefono</font></td>
<td><input type="text" name="telephone" size="30"></td>
</tr>

<tr>
<td><font face="Verdana" size="2">Fax</font></td>
<td><input type="text" name="fax" size="30"></td>
</tr>
<tr>
<td><font face="Verdana" size="2">Email</font></td>
<td><input type="text" name="email" size="30"></td>
</tr>

</table>
</center>
</div>
<p align="center"><font face="Verdana" size="2">Messaggio<br>
</font><textarea rows="9" name="comments" cols="34"></textarea>


  Fabio

4/3/2008 23:30:02

La funzione dello script è la funzione per l'invio della mail, solo che la devi usare in modo corretto. Nella pagina sendmail.php devi prelevare i dati del form e poi passarli come desideri alla funzione.
Per prelevare i dati devi usare ad esempio
$name=$_POST['name'];
etc

  Lucas

5/3/2008 20:24:35

Fabio ti ringrazio di cuore per la risposta ma non so dove mettere le mani :( :( non e che mi potresti aiutare a creare lo script per la funzione per l'invio della mail php ?
Grazie in Anticipo


  un amico

22/4/2008 10:38:14

bel lavoro però..
ho provato lo script.. mi sono inviato una mail con una gif allegata..arriva tutto solo che poi quando apro l allegato nn riesco a vedere nulla..


$fileallegato=getcwd().$allegatofolder.$allegato;
cmq la funzione getcwd() mi sa che nn va bene..
perchè le miei allegati sono messi su una cartella sopra di dove mi trovo adesso..vajelo a spiegare..

per il resto va bene..se solo riuscissi a sistemare ji allegati

  Fabio

22/4/2008 10:48:00

Prova mettendo:
$allegatofolder="/../cartella/";

  un amico

22/4/2008 11:37:43

ci avevo già provato ma nn va..cmq nn importa ho tolto la funzione getcwd() e ho messo indirizzo assoluto sulla variabile $allegatofolder..

cmq ji allegati nn riesco a vederli..
e poi nn capisco..perchè nella tua funzione queste due righe sono commentate ?
//$body .= "Content-Disposition: attachment;\n";
//$body .= "filename=\"$allegato\"\n\n";



  Fabio

22/4/2008 11:52:11

Prova a mettere:


if ($fp) {
$data = fread($fp, filesize($fileallegato));
echo "ok";
}


cosi controlliamo se effettivamente va a leggere il file.

  un amico

22/4/2008 12:38:41

echo "ok" me lo stampa...
l allegato mi arriva sempre solo che è come se fosse vuoto.

rispetto al tuo codice ho modificato :
$fileallegato=getcwd().$allegatofolder.$allegato;
con
$fileallegato=$allegatofolder.$allegato;

e questo
Sendmail("mittente@mail.it", "destinatario@mail.it","prova", "testo<br>testo","testo\ntesto","file.pdf","/allegati/");

con questo

Sendmail("mittente@mail.it", "destinatario@mail.it","prova", "testo<br>testo","testo\ntesto","file.pdf",$_SERVER["DOCUMENT_ROOT"]."/allegati/");

  Fabio

22/4/2008 20:20:00

Ho fatto un test. Lasciando lo script esattamente com'è funziona richiamando la funzione cosi:


Sendmail("xxxxxx@mail.com", "xxxx@mail.com","prova", "testo<br>testo","testo\ntesto","file.pdf","/../allegati/");


  un amico

23/4/2008 9:32:34

ciao fabio..si hai ragione funziona..è che dovevo fare cos': /../../allegati dato che la cartella era sopra di 2..

cmq l allegato arriva ma rimane vuoto sempre..

ho modificato due cose sulla tua bella funzioncina
ho inserito queste 3 righe :


$headers = "From: \"$mittente\" <$email_info> \n";
$headers .= "Reply-To: \"$mittente\" <$email_info>\n";
$headers .= "X-Mailer: \"$mittente Mail\" server \n";



function Sendmail($mittente, $destinatario,$email_info, $soggetto, $bodyhtml, $bodytxt="", $allegato="", $allegatofolder="/public/"){
$boundary1 ="XXMAILXX".md5(time())."XXMAILXX";
$boundary2 ="YYMAILYY".md5(time())."YYMAILYY";
if($bodytxt=="" && $bodyhtml!=""){
$bodytxt=str_replace("<br>","\n",$bodyhtml);
$bodytxt=strip_tags($bodyhtml);
}
if($bodytxt!="" && $bodyhtml==""){
$bodyhtml=$bodytxt;
}
$headers = "From: \"$mittente\" <$email_info> \n";
$headers .= "Reply-To: \"$mittente\" <$email_info>\n";
$headers .= "X-Mailer: \"$mittente Mail\" server \n";
$headers .= "MIME-Version: 1.0\n";
if ($allegato!=""){
$headers .= "Content-Type: multipart/mixed;\n";
$headers .= " boundary=\"$boundary1\";\n\n";
$headers .= "--$boundary1\n";
}
$headers .= "Content-Type: multipart/alternative;\n";
$headers .= " boundary=\"$boundary2\";\n\n";
//mail alternativa solo testo
$body = "--$boundary2\n";
$body .= "Content-Type: text/plain; charset=ISO-8859-15; format=flowed\n";
$body .= "Content-Transfer-Encoding: 7bit\n\n";
$body .= "$bodytxt\n";
//mail html
$body .= "--$boundary2\n";
$body .= "Content-Type: text/html; charset=ISO-8859-15\n";
$body .= "Content-Transfer-Encoding: 7bit\n\n";
$body .= "$bodyhtml\n\n";
$body .= "--$boundary2--\n";
//allegato se presente
if ($allegato!=""){
//getcwd mi ristituscie l attuale directory di lavoro e nn mi va bene
//$fileallegato=getcwd().$allegatofolder.$allegato;
$fileallegato=getcwd().$allegatofolder.$allegato;
$fp=fopen($fileallegato, "r");

if ($fp) {
$data = fread($fp, filesize($fileallegato));
}
$curr = base64_encode($data);
$body .= "--$boundary1\n";
$body .= "Content-Type: application/octet-stream;";
$body .= "name=\"$allegato\"\n";
$body .= "Content-Transfer-Encoding: base64\n\n";
$body .= "Content-Disposition: attachment;\n";
$body .= "filename=\"$allegato\"\n\n";
$body .= "$curr\n";
$body .= "--$boundary1--\n";
}
if(mail($destinatario, $soggetto, $body, $headers)) {
return true;
} else {
return false;
}
}


  Fabio

23/4/2008 10:02:24

Togli le due righe:


$body .= "Content-Disposition: attachment;\n";
$body .= "filename=\"$allegato\"\n\n";

che erano commentate

  un amico

23/4/2008 10:15:52

okkkkkkkkk ho capito il problema eheheh..
i due file che stavo provando ad allegare avevano dei diffetti da me creati in passato..

funziona bene il tuo script..

quanto tempo perso..però che figata quando scopri il problema..

  Rocks

8/10/2009 13:08:39

Erano due giorni che cercavo uno script PHP in rete per mandare mail con attach ed erano tutti (ma proprio tutti) buggati... Comlimenti il tuo ha funzionato al primo colpo.
Grande!

  carlo

30/10/2009 11:51:07

Ciao ,
tutto ok con questo script.Un unico problema.Il file che mi arriva in allegato è leggermente diverso da quello che creo sul server(non faccio l'upload , il file lo creo io).Infatti il file di testo che allega ha una riga iniziale in più rispetto a quello presente sul server[li ho confrontati(ovviamente poi elimino il file sul server)].
Qualche intuizione,aiutino?

  Leonardo

2/8/2011 18:46:52

Ciao Fabio,

lo script è semplice ed illuminante: purtroppo su piattaforme XAMPP in Windows il path è UNC (c:\\xampplite\\...)
ma lo adatatto alle mie esigenze.

Ancora complimenti.

  giulia

3/6/2012 20:12:16

Ciao Fabio,
sto facendo un sito in cui dovrei inviare email ai clienti e per fortuna ho trovato il tuo script che non mi da nemmeno un errore.. però ho un problema, non riesco a ricevere l'email (o a mandarla).. Dovrei inviare solo del testo nelle email.. Se mi potresti aiutare te ne sarei grata.
Grazie

  Campanello

14/12/2012 17:25:57

ciao Fabio, sto tentando di utilizzare il tuo script ma ho un problema su questa linea:

$fileallegato=getcwd().$allegatofolder.$allegato;

xche' il getcwd mi ristituscie l attuale directory mentre io vorrei utilizzare quella indicata tipo:
$fileallegato=$allegatofolder.$allegato.$file;

come devo fare?
grazie, Cam




  carlo

10/11/2016 10:11:36

Salve, sto usando il tuo script... funziona bene... tranne con dominio icloud... non arrivano al destinatario... Come posso risolvere??? Grazie



Lascia un commento


Codice di controllo*:
Nome*:
Email/Link:
Testo*:
 
I campi contrassegnati con * sono obbligatori.