• User Attivo

    Invio allegato con php

    Salve, salvino.
    Ora che ho risolto i problemi relativi al corretto funzionamento del mio form in flash devo risolvere i problemi relativi la pagina php che questo richiama.
    In pratica ho, come avrete capito un form in flash dove l'utente inserisce i suoi dati, nome, cognome, email, e spunta dell'autorizzazione, la pagina php riceve i dati, li controlla e se corretti invia due mail, una deve inviarla ad un indirizzo fisso che decido io e l'altra all'indirizzo dell'utente che è stato specificato nel form.

    La prima mail è semplice, contiene solo i dati dell'utente che ha ricevuto compilato il form, volevo metterci uno sfondo ma per ora non ci riesco.

    La seconda mail deve contenere un allegato ed è qui il problema.
    La mail viene inviata ma non contiene l'allegato, inoltre il codice html non viene riconosciuto e nella mail che ricevo lo visualizzo come se fosse quello il testo, in pratica vedo il codice ma non l'aspetto che questo codice dovrebbe creare.

    Secondo il client di posta la mail contiene un allegato ma forse si riferisce solo ad un file di testo ATT00034.txt, questo file dovrebbe essere quello creato dall'antivirus che controlla il file.

    posto il codice della pagina php, ovviamente solo la parte che interessa.

    [php]
    $mittente = "[email protected]";

    //CODICE PER INVIO DELLA MAIL CON ALLEGATO

    // creo il messaggio in html per la seconda mail
    $msg = '
    <html>
    <head>
    <meta http-equiv="Content-Type:" content="multipart/mixed;">
    <title>titolo</title>
    <style type="text/css">
    <!--
    body {
    margin-left: 0px;
    margin-top: 0px;
    background-image: url('.$image.');
    background-repeat: no-repeat;
    }
    .Stile1 {font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; font-weight: bold; }
    .Stile2 {font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; }
    -->
    </style>
    </head>
    <body>
    <table width="780" border="0" align="left" cellpadding="0" cellspacing="0">
    <tr>
    <td valign="top" ><table width="780" border="0" cellpadding="0" cellspacing="0">
    <tr>
    <td width="23" height="97"> </td>
    <td width="757" height="97"> </td>
    </tr>
    <tr>
    <td height="125"> </td>
    <td valign="top"><table>
    <tr>
    <td colspan="2"></td>
    </tr>
    <tr>
    <td width="50"> </td>
    <td width="648" class="Stile1"><span class="Stile2"><span class="Stile1">Grazie </span>'.$nome.' '.$cognome.' per aveci contattato, in allegato a questa mail troverà il file pdf </span></td>
    </tr>
    <tr>
    <td> </td>
    <td class="Stile1"><div align="center"><span class="Stile2">"titolo del mio file pdf"</span></div></td>
    </tr>
    </table></td>
    </tr>
    </table></td>
    </tr>
    </table>
    </body>
    </html>
    ';

    // creo la variabile che conterrà tutto il secondo messaggio più l'allegato
    $datiemail2 = "";

    //carico l'allegato
    $allegato = "Download/allegato.pdf";

    // Apro e leggo il file allegato
    $file = fopen($allegato,'rb');
    $data = fread($file, filesize($allegato));
    fclose($file);

    // Adatto il file allegato al formato MIME base64 usando base64_encode
    $data = chunk_split(base64_encode($data));

    // Genero il separatore che separerà la parte testuale dall'allegato
    $semi_rand = md5(time());
    $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";

    // headers per la seconda mail, quella che viene inviata all'utente
    $headers2 = "From: Jumbo Screen - ufficio marketing <$mittente>\n";
    $headers2 .= "\nMIME-Version: 1.0\n";
    $headers2 .= "Content-Type: multipart/mixed;\n";
    $headers2 .= " boundary="{$mime_boundary}"";

    // Definisco il tipo di messaggio (MIME/multi-part)
    $datiemail2 .= "This is a multi-part message in MIME format.\n\n";

    // Metto il separatore
    $datiemail2 .= "--{$mime_boundary}\n";

    // Questa è la parte "testuale" del messaggio
    $datiemail2 .= "Content-Type: text/plain; charset="iso-8859-1"\n";
    $datiemail2 .= "Content-Transfer-Encoding: 7bit\n\n";
    $datiemail2 .= $msg . "\n\n";

    // Metto il separatore
    $datiemail2 .= "--{$mime_boundary}\n";

    // Aggiungo l'allegato al messaggio
    $datiemail2 .= "Content-Disposition: attachment;\n";
    $datiemail2 .= " filename="{$allegato_name}"\n";
    $datiemail2 .= "Content-Transfer-Encoding: base64\n\n";
    $datiemail2 .= $data . "\n\n";

    // chiudo con il separatore
    $datiemail2 .= "--{$mime_boundary}--\n";
    //___________________________________________________________________________________________________________

    // invio la mail al cliente
    if (mail("$mailutente", "oggetto", "$datiemail2","$headers2"))
    [/php]Sapreste darmi una mano a risolvere anche questo rompicapo? :arrabbiato:


  • User Attivo

    Ho trovato questo altro codice
    [PHP]
    //
    // FUNZIONE PER L'INVIO DI MAIL CON ALLEGATI
    // $mex E' IL MESSAGGIO DELL'EMAIL (CON FORMATTAZIONE HTML)
    // $oggetto E' L'OGGETTO
    // $aChi E' IL DESTINATARIO
    // $mittente E' IL MITTENTE
    // $allegato E' NOME DEL FILE CHE SI VUOLE ALLEGARE (COMPRENSIVO DI PATH)
    // $nomeAllegato E' IL NOME DEL FILE ALL'INTERNO DELLA MAIL
    // $bcc SONO I DESTINATARI DELLE COPIE CONFORMI NASCOSTE
    // $reply E' LA MAIL A CUI VIENE INVIATA UNA EVENTUALE RISPOSTA
    // LASCIARE VUOTA SE E' LA STESSA DEL MITTENTE
    // $stile UN'EVENTUALE BLOCCO DI STILE PER LA FORMATTAZIONE DEL MESSAGGIO
    // COMPRENSIVO DI <style> E </style>
    //
    function mailAllegati( $mex, $oggetto, $aChi, $mittente,
    $allegato, $nomeAllegato,
    $bcc = "", $reply = "", $stile = "")
    {
    $filetype = mime_content_type($allegato);

    $filez = fopen($allegato, "r");
    $contents = fread($filez, filesize($allegato));
    $encoded_attach = chunk_split(base64_encode($contents));
    fclose($filez);

    if ($reply == "")
    $reply = $mittente;

    // CREO L'INTESTAZIONE
    $testa = "From: $mittente\n";
    if ($bcc != "")
    $testa .= "BCC: $bcc;\n";
    $testa .= "Reply-To: $reply\n";
    $testa .= "X-Mailer: Sismail Web Email Interface\n";
    $testa .= "MIME-version: 1.0\n";
    $testa .= "Content-type: multipart/mixed;\n";
    $testa .= " boundary="Message-Boundary"\n";
    $testa .= "Content-transfer-encoding: 7BIT\n";
    $testa .= "X-attachments: $nomeAllegato";

    // CREO IL MESSAGGIO
    $corpo = "--Message-Boundary\n";
    $corpo .= "Content-type: text/html; charset=iso-8859-1\n";
    $corpo .= "Content-transfer-encoding: 7BIT\n";
    $corpo .= "Content-description: Mail message body\n\n";
    $corpo .= "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">";
    $corpo .= "<HTML><HEAD>";
    $corpo .= "<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">";
    $corpo .= $stile;
    $corpo .= "</HEAD>";
    $corpo .= "<BODY>";
    $corpo .= $mex;
    $corpo .= "</BODY></HTML>";
    $corpo .= "\n\n--Message-Boundary\n";
    $corpo .= "Content-type: $filetype; name="$nomeAllegato"\n";
    $corpo .= "Content-Transfer-Encoding: BASE64\n";
    $corpo .= "Content-disposition: attachment; filename="$nomeAllegato"\n\n";
    $corpo .= "$encoded_attach\n";
    $corpo .= "--Message-Boundary--\n";

    if(@mail($aChi, $oggetto, $corpo, $testa))
    return true;
    else
    return false;
    }
    [/PHP]

    non capisco bene una cosetta, nella linea
    [PHP]if(@mail($aChi, $oggetto, $corpo, $testa))[/PHP]
    cosa devo inserire al posto di @mail, sul sito in cui ho trovato questo codice dice mette questo esempio

    [PHP] if (mailAllegati($messaggio, $oggetto, $aChi, $mittente, $allegato, $nomeAllegato, "", "", ""))[/PHP]

    mi sembra lo stesso che avevo trovato prima ma credo che mailAllegati non sia corretto, come lo modifico?


  • User Attivo

    mailAllegati si riferisce al nome della funzione? Lo lascio così?


  • User Attivo

    Ho modificato un po' il codice che ho trovato, anche perché mi sono accorto di alcuni errori dovuti a come il server su cui si trovava aveva interpretato alcuni simboli, in particolare il < ed il >.

    questo è il codice che riguarda la funzione che non funziona perfettamente

    [php]
    if ( ! function_exists ( 'mime_content_type ' ) )
    {
    function mime_content_type ( $f )
    {
    return system ( trim( 'file -bi ' . escapeshellarg ( $f ) ) ) ;
    }
    }

    // FUNZIONE PER L'INVIO DI MAIL CON ALLEGATI
    function mailAllegati( $datiemail2, $oggetto2, $mailutente, $mittente,
    $allegato, $nomeAllegato,
    $bcc = "", $reply = "", $stile = "")
    {
    $filetype = mime_content_type($allegato);

    $filez = fopen($allegato, "r");
    $contents = fread($filez, filesize($allegato));
    $encoded_attach = chunk_split(base64_encode($contents));
    fclose($filez);

    if ($reply == "")
    $reply = $mittente;

    // CREO L'INTESTAZIONE
    $testa = "From: Jumbo Screen - ufficio Marketing <$mittente>\n";
    if ($bcc != "")
    $testa .= "BCC: $bcc;\n";
    $testa .= "Reply-To: $reply\n";
    $testa .= "X-Mailer: Sismail Web Email Interface\n";
    $testa .= "MIME-version: 1.0\n";
    $testa .= "Content-type: multipart/mixed;\n";
    $testa .= " boundary="Message-Boundary"\n";
    $testa .= "Content-transfer-encoding: 7BIT\n";
    $testa .= "X-attachments: $nomeAllegato";

    // CREO IL MESSAGGIO
    $corpo = "--Message-Boundary\n";
    $corpo .= "Content-type: text/html; charset=iso-8859-1\n";
    $corpo .= "Content-transfer-encoding: 7BIT\n";
    $corpo .= "Content-description: Mail message body\n\n";
    $corpo .= "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">";
    $corpo .= "<HTML><HEAD>";
    $corpo .= "<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">";
    $corpo .= $stile;
    $corpo .= "</HEAD>";
    $corpo .= "<BODY>";
    $corpo .= $datiemail2;
    $corpo .= "</BODY></HTML>";
    $corpo .= "\n\n--Message-Boundary\n";
    $corpo .= "Content-type: $filetype; name="$nomeAllegato"\n";
    $corpo .= "Content-Transfer-Encoding: BASE64\n";
    $corpo .= "Content-disposition: attachment; filename="$nomeAllegato"\n\n";
    $corpo .= "$encoded_attach\n";
    $corpo .= "--Message-Boundary--\n";

    if(@mail($mailutente, $oggetto2, $corpo, $testa))
    return true;
    else
    return false;
    }//fine della funzione
    [/php]e questa è la riga che richiama il file allegato, ho provato in diversi modi ma nulla, mi arriva sempre una mail con un file allegato.php che in realtà è vuoto

    [php]
    // $allegato E' IL NOME DEL FILE CHE SI VUOLE ALLEGARE (COMPRENSIVO DI PATH)
    $allegato = 'http://www.miosito.it/download/allegato.pdf';
    [/php]