Visualizzazione risultati 1 fino 3 di 3

Discussione: Funzione mail con allegato

  1. #1
    Guest

    Predefinito Funzione mail con allegato

    Ciao a tutti! ho torvato questo articolo che illustra come inviare una mail con allegati con php.
    Ho crecato di modificare un po' la funzione cercando di adattarla ai miei scopi.
    Adesso dovrebbe estrarre un file codificato con base64 da un db, servendosi di un id codificato in base64 passato come get alla pagina e di due variabili di sessione contenenti due password.
    A questo punto dovrebbe inviare la mail con, come allegato il file.
    Tutto va bene: il file viene estratto, la mail viene inviata.
    Il problema è che il file, invece di essere interpretato come allegato, me lo ritrovo codificato alla fine della mail.
    Codice PHP:
    <?php
    session_start
    ();
    if(isset(
    $_POST['ind']))
    {
    // Recupero il valore dei campi del form
    $destinatario = $_POST['ind'];
    $mittente = "miosito";
    $oggetto = "prova";
    $messaggio = $_POST['mss'];

    // connessione e selezione del database
    mysql_connect('sql09.freemysql.net', 'username', 'password')
    or die(
    'Connessione non riuscita: ' . mysql_error());

    if(!
    mysql_select_db('files'))
    die(
    'Selezione database fallita!');

    // query per recuperare il file
    $query = "SELECT * FROM tabella_files WHERE id_file = '".base64_decode($_GET['id'])."' AND password_1='".$_SESSION['pass_1']."' AND password_2='".$_SESSION['pass_2']."'";
    $risultato = mysql_query($query) or die("ATTENZIONE! Errore nell'estrazione dei file: il link potrebbe essere daneggiato, canellare le path del browser e riprovare piu tardi:".mysql_error());
    $tmp = mysql_fetch_array($risultato);

    // invio il contenuto del file
    $allegato = $tmp[nome_file];
    $allegato_name = $tmp[nome_file];
    $allegato_type = $tmp[tipo_file];
    $allegato_data = $tmp[data_file];

    // Creo 2 variabili che riempirò più avanti...
    $headers = "From: " . $mittente;
    $msg = "";

    // Verifico se il file è stato caricato correttamente via HTTP
    // In caso affermativo proseguo nel lavoro...



    // Adatto il file al formato MIME base64 usando base64_encode
    $data = chunk_split(base64_encode($allegato_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";

    // Invio la mail
    if (mail($destinatario, $oggetto, $msg, $headers))
    {
    echo
    "<p>Mail inviata con successo!</p>";
    }else{
    echo
    "<p>Errore!</p>";
    }
    }else{
    ?>

    <form name="login" method="post">
    <b>Invia il file via mail</b><br><br>
    indirzzo:<input type="text" name="ind"><br>
    messaggio (facoltativo):<br><textarea name="mss">
    </textarea>
    <input type="submit" value="Invia!">
    </form>
    <?php
    }
    ?>
    Come mai accade questo?
    Come posso risolvere il problema?
    Grazie in anticipo!

  2. #2
    Guest

    Predefinito

    Modificalo con la parte del DB, ma comunque a me funziona.

    Codice PHP:

    <?php
    // Recupero il valore dei campi del form

    $destinatario = "mail@mail.it";

    $email = ltrim(rtrim(strip_tags(stripslashes($_POST['email']))));
    $oggetto = "mail (con allegato)";
    $messaggio = ltrim(rtrim(strip_tags($_POST['messaggio'])));


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


    // Creo 2 variabili che riempirò più avanti...
    $headers = "From: " . $email;
    $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;
    }


    // validazione e invio mail

    if(!ereg("^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,3})$", $email)) {
    echo
    "<p><h3>La mail non è stata inviata!</h3></p> <p><b>Indirizzo mail non valido!</b></p>";

    }

    elseif(!((
    $allegato_type == "image/jpeg") || ($allegato_type == "image/jpg") || ($allegato_type == "image/gif") || ($allegato_type == "image/png"))){
    echo
    "<p><h3>La mail non è stata inviata!</h3></p> <p><b>Il file allegato non è consentito - file consentiti: (.jpg - .jpeg ; .gif ; .png)</b></p>";

    }


    else {
    mail($destinatario, $oggetto, $msg, $headers);
    echo
    "<p><h3>Mail inviata con successo !</h3></p> ";

    }

    ?>

    ciAO

  3. #3
    Guest

    Predefinito

    Eppure a me ancora non funziona...
    Evidentemente il problema è del db...

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •