Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    Inviare mail con allegato PHP

    Salve,
    Ho creato un form in php che mi invia una mail in html e funziona bene.
    Ora vorrei che mi inviasse assieme a questa mail anche un allegato pdf standard che ho sul mio sito. Attenzione: non voglio che l'utente faccia l'upload di un allegato, ma sono io che mando lo stesso allegato in automatico a tutte le mail.
    Ho cercato in giro e scaricato vari scripts ma sono alquanto complessi e ci capisco poco.

    Mi potreste dire per cortesia cosa devo inserire in questo codice:

    <?php
    ....

    if (isset($_POST['Submit'])) {

    $email = "esempio@hotmail.it";
    $subject = "Richiesta informazioni";
    $message = "Messaggio HTML";
    $headers = "From: Mario Rossi\n";
    $headers .= "MIME-Version: 1.0\n";
    $headers .= "Content-Type: text/html; charset=\"iso-8859-1\"\n";
    $headers .= "Content-Transfer-Encoding: 7bit\n\n";

    //invio mail
    mail($email, $subject, $message, $headers);

    echo ("<font color='red'>Messaggio inviato!font>");
    }
    ?>

    N.B. Ho volontariamente omesso altre parti del codice che non interessano l'argomento, come variabili, sostituzione caratteri speciali, accapo, etc...
    Premetto che vorrei evitare di ricorrere a PHPMailer e programmi simili.

    Grazie.

  2. #2
    Non puoi farlo con la semplice funzione mail di php.
    Molti utenti php utilizzano phpmailer.
    Lo scarichi gratuitamente in rete, funziona bene ed è (relativamente) facile da usare se conosci un po'di php e di classi.
    Io stesso lo ho usato con successo in varie applicazioni commerciali.

  3. #3
    ...a detta del seguente script è una cosa fattibile anche senza l'uso di phpmailer, solo che in questo caso è un file che viene uppato dall'utente. Io vorrei solamente adattare questo script al mio, ma da solo non ci riesco. Non posso?

    Script:
    <?php
    if (isset($_POST["submit"])){
    $a = $_POST['a'];
    $da = $_POST['da'];
    $obj = $_POST['obj'];
    $testo = $_POST['testo'];

    $attachment = $_FILES['attachment']['tmp_name'];
    $attachment_type = $_FILES['attachment']['type'];
    $attachment_name = $_FILES['attachment']['name'];

    $intestazioni = "From: " . $da;
    $messaggio = "";

    if (is_uploaded_file($attachment))
    {
    $file = fopen($attachment,'rb');
    $data = fread($file, filesize($attachment));
    fclose($file);
    $data = chunk_split(base64_encode($data));
    $rand = md5(time());
    $boundary = "==Multipart_Boundary_x{$rand}x";

    $intestazioni .= "\nMIME-Version: 1.0\n";
    $intestazioni .= "Content-Type: multipart/mixed;\n";
    $intestazioni .= " boundary=\"{$boundary}\"";

    $messaggio .= "This is a multi-part message in MIME format.\n\n";
    $messaggio .= "--{$boundary}\n";
    $messaggio .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
    $messaggio .= "Content-Transfer-Encoding: 7bit\n\n";
    $messaggio .= $testo . "\n\n";
    $messaggio .= "--{$boundary}\n";
    $messaggio .= "Content-Disposition: attachment;\n";
    $messaggio .= " filename=\"{$attachment_name}\"\n";
    $messaggio .= "Content-Transfer-Encoding: base64\n\n";
    $messaggio .= $data . "\n\n";
    $messaggio .= "--{$boundary}--\n";
    }
    else{
    $messaggio = $testo;
    }

    if (mail($a, $obj, $messaggio, $intestazioni))
    {
    echo "Messaggio inviato con successo.";
    }else{
    echo "Si &egrave; verificato un errore nell'invio.";
    }
    }else{
    ?>

    <form action="<? echo $_SERVER['PHP_SELF']; ?>"
    method="POST" enctype="multipart/form-data">
    Destinatario:
    <input type="text" name="a">

    Mittente:
    <input type="text" name="da">

    Oggetto:
    <input type="text" name="obj">

    Messaggio:
    <textarea name="testo"></textarea>

    Allega file:
    <input type="file" name="attachment">

    <input type="submit" name="submit" value="Invia" />
    </form><?
    }
    ?>

  4. #4
    Hai ragione, si potrebbe utilizzare la tecnica proposta nel file che hai pubblicato.
    A suo tempo la avevo anche usata.
    Non è difficilissima da implementare (= adattarla al tuo script e contesto) ma richiede competenze superiori all'utilizzo del phpmailer che ti ho consigliato.
    Ed in alcuni casi mi dava dei problemi, tanto che poi sono passato sistematicamente a phpmailer per ogni invio di email che non sia un plain text.

  5. #5
    Ma io vorrei anche usarlo questo benedetto PHPMailer ma dovrei riscrivere tutto il codice per adattarlo, e non essendo esperto mi viene difficile.

    In pratica, ritornando allo script di sopra, si tratta solo di scoprire come e dove inserire le intestazioni per far riconoscere l'allegato e il percorso del file PDF. Non credo sia una cosa difficile, ma da solo non ci riesco.

  6. #6
    Codice PHP:
    <?php
    if (isset($_POST["submit"])){
    $a $_POST['a'];
    $da $_POST['da'];
    $obj $_POST['obj'];
    $testo $_POST['testo'];

    /*
    **questo non ti serve più, visto che nn uppi i files**
    $attachment = $_FILES['attachment']['tmp_name'];
    $attachment_type = $_FILES['attachment']['type'];
    $attachment_name = $_FILES['attachment']['name'];
    **/

    /*Questa riga la cambi con il nomefile che vuoi mandare*/
    $attachment="tuofile_che_vuoi_inviare";

    $intestazioni "From: " $da;
    $messaggio "";

    /* 
    **non devi fare controlli sull'up, al limite controllare che il file esista.
    if (is_uploaded_file($attachment))
    {
    */
    $file fopen($attachment,'rb');
    $data fread($filefilesize($attachment));
    fclose($file);
    $data chunk_split(base64_encode($data));
    $rand md5(time());
    $boundary "==Multipart_Boundary_x{$rand}x";

    $intestazioni .= "\nMIME-Version: 1.0\n";
    $intestazioni .= "Content-Type: multipart/mixed;\n";
    $intestazioni .= " boundary=\"{$boundary}\"";

    $messaggio .= "This is a multi-part message in MIME format.\n\n";
    $messaggio .= "--{$boundary}\n";
    $messaggio .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
    $messaggio .= "Content-Transfer-Encoding: 7bit\n\n";
    $messaggio .= $testo "\n\n";
    $messaggio .= "--{$boundary}\n";
    $messaggio .= "Content-Disposition: attachment;\n";
    $messaggio .= " filename=\"{$attachment_name}\"\n";
    $messaggio .= "Content-Transfer-Encoding: base64\n\n";
    $messaggio .= $data "\n\n";
    $messaggio .= "--{$boundary}--\n";

    if (
    mail($a$obj$messaggio$intestazioni))
    {
    echo 
    "Messaggio inviato con successo.";
    }else{
    echo 
    "Si è verificato un errore nell'invio.";
    }
    }else{
    ?>

    <form action="<? echo $_SERVER['PHP_SELF']; ?>
    method="POST" enctype="multipart/form-data">
    Destinatario:
    <input type="text" name="a">

    Mittente:
    <input type="text" name="da">

    Oggetto:
    <input type="text" name="obj">

    Messaggio:
    <textarea name="testo"></textarea>

    <!-- questa parte del form non ti serve più 
    Allega file:
    <input type="file" name="attachment">

    -->
    <input type="submit" name="submit" value="Invia" />
    </form><?
    }
    ?>
    Spero ti sia d'aiuto ciao.

  7. #7
    Il messaggio me lo invia, non mi da errori, ma l'allegato non c'è.
    La posizione dell'allegato è ./public/Depliant.pdf quindi ho sostituito la riga

    $attachment="tuofile_che_vuoi_inviare";

    con

    $attachment="./public/Depliant.pdf";

    dove sbaglio?

  8. #8
    Io farei un po' di echo per vedere se ti prende il file giusto. il "./" mi puzza un po'. Se nn hai tempo/voglia ho trovato un codice simile or ora che ho personalmente testato e funziona.


    Codice PHP:
    <?php

    function Sendmail($mittente$destinatario$soggetto$bodyhtml$bodytxt=""$allegato=""$allegatofolder="/"){
        
    $boundary1 ="XXMAILXX".md5(time())."XXMAILXX";
            
    $boundary2 ="YYMAILYY".md5(time())."YYMAILYY";
            if(
    $bodytxt=="" && $bodyhtml!=""){
                
    $bodytxt=str_replace("
    "
    ,"\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($fpfilesize($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 .= "$curr\n";
                
    $body .= "--$boundary1--\n";
            }
            
                    if(@
    mail($destinatario$soggetto$body$headers)) {
                return 
    true;
                    } else {
                return 
    false;
                    }
    }

    Sendmail("mittente@mail.it""destinatario@mail.it","Prova""testo
    testo"
    ,"testo\ntesto","grafico.png");
    ?>
    Nell'esempio di utilizzo che ti scritto in fondo il file deve essere nella stessa dir dello script. se così non ti piace gli puoi o passare il path completo oppure modificare la riga
    Codice PHP:
    function Sendmail($mittente$destinatario$soggetto$bodyhtml$bodytxt=""$allegato=""$allegatofolder="/"
    bye.

  9. #9
    si l'ho trovato anch'io questo script che verifica prima se il client del destinatario accetta html o meno e poi manda la mail di conseguenza. Visto che i client sono tutti conosciuti e accettano html non vorrei sprecare del tempo a dover formattare anche un messaggio text.

    Guarda, ti dirò, lo script che mi hai dato tu è ottimo, ho provato con gli echo ma non mi esce nemmeno la scritta "file esistente" (forse lo metto al punto sbagliato), ma comunque io credo sia grosso modo un problema di specifica del percorso del file più che altro, perchè le intestazioni per far interpretare un allegato sono quelle in tutti gli script che ho visto, chi in un modo chi nell'altro, sono quelle, cambia solo la disposizione e il nome delle variabili.

    Toglimi una curiosità, ma lo scipt lo hai fatto tu?

  10. #10
    Ho scoperto una cosa molto strana...

    Riguarda il primo codice che mi hai inviato.

    In pratica, non è che l'allegato non me lo invia, me lo invia e come! Il problema è che lo converte in txt e lo cambia di nome. Se io apro il messaggio trovo un allegato del tipo ATT00272.txt, lo scarico e gli cambio l'estensione mettendogli .pdf, ebbene con grande stupore, l'allegato è proprio lui!

    ci sarà qualcosa da cambiare nelle intestazioni credo.....

    Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.