Mi trovo a dover risolvere un curioso problema (almeno per me che conosco poco il PHP).
Consiste in questo: uso da un po' degli script mediati da questo sito e un po' da altre esperienze, per inviare email tramite script php, con allegati.
Devo dire che sembra funzionare egregiamente:
Codice PHP:
<?php
// Campi da variare per personalizzare il messaggio
$destinatario = "info@miosito.it";
$redirOK = "http://www.miosito.it/mail/ok.asp";
$redirKO = "http://www.miosito.it/mail/ko.asp";
//Questa parte non deve essere modificata!
function clean($key) {
$key=str_replace("\\", "", $key);
$find=array(
"/bcc\:/i",
"/Content\-Type\:/i",
"/Mime\-Type\:/i",
"/cc\:/i",
"/to\:/i"
);
$key=preg_replace($find,"",$key);
return $key;
}
// Recupero il valore dei campi del form
extract($_POST, EXTR_SKIP);
// Valorizzo le variabili relative all'allegato
$allegato = $_FILES['allegato']['tmp_name'];
$allegato_type = $_FILES['allegato']['type'];
$allegato_name = $_FILES['allegato']['name'];
// 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 = "{$semi_rand}";
// Aggiungo intestazioni e routines necessarie per l'allegato
$messaggio = clean($messaggio);
// Controllo che nome, destinatario, mittente e oggetto siano riportati
if (trim($destinatario) == "") {
header("location: $redirKO");
exit;
}
if (trim($mittente) == "") {
header("location: $redirKO");
exit;
}
if (trim($nome) == "") {
$nome = $mittente;}
if (trim($oggetto) == "") {
header("location: $redirKO");
exit;
}
$headers = "From: " . $nome . " <".$mittente.">";
// Definisco il tipo di messaggio (MIME/multi-part)
$headers .= "\nMIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/mixed;\n";
$headers .= " boundary=\"{$mime_boundary}\"\n";
$headers .="This is a multi-part message in MIME format.\n";
$msg = "";
// Verifico se il file è stato caricato correttamente via HTTP
// In caso affermativo trasformo il file
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));
}
// Questa è la parte "testuale" del messaggio
$msg .= "--{$mime_boundary}\n"; // Metto il separatore
$msg .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
$msg .= "Content-Transfer-Encoding: quoted-printable\n\n";
// $msg .= "Content-Transfer-Encoding: 7bit\n\n";
$msg .= $messaggio . "\n\n";
// Se abbiamo un allegato...
if (is_uploaded_file($allegato))
{
// Aggiungo l'allegato al messaggio
$msg .= "--{$mime_boundary}\n"; // inizializzato da un separatore
$msg .= "Content-Disposition: attachment;\n";
$msg .= " filename=\"{$allegato_name}\"\n";
$msg .= "Content-Transfer-Encoding: base64\n\n";
$msg .= $data . "\n\n";
}
// Alla fine, in ogni caso, chiudo con il separatore di fine messaggio terminato da due hyphens
$msg .= "--{$mime_boundary}--\n";
// Invio la mail
if (mail($destinatario, $oggetto, $msg, $headers))
{
header("location: $redirOK");
}else{
header("location: $redirKO");
}
?>
Succede però che alcuni allegati (non piccoli, ma non giganteschi) non producano alcun invio: vale a dire, esce per "ok", ma la mail indicata in testa non riceve nulla.
Non vedo qui, alcun controllo di dimensione, ma naturalmente può essere che mi sbaglio, o che ci sia un limite di default che io non conosco, o non so dove trovare.
Qualcuno sa darmi qualche spunto?
Grazie.