Semplice form PHP: Allegato a e-mail (codice di golf)

Immaginate un utente che vorrei mettere un modulo sul loro sito web, per consentire a un visitatore del sito per l’upload di un file e un messaggio semplice, che saranno immediatamente inviati via email (vale a dire, il file non viene salvato sul server, o se lo è allora solo temporaneamente) come allegato un file con la nota nel corpo del messaggio.

Vedere più dettagli a http://a2zsollution.com/php-secure-e-mail/

Qual è il modo più semplice per ottenere questo risultato?

Più semplice in termini di:

  • Dimensioni (codice di golf)
  • Facilità di implementazione (idealmente tutti in un unico file, ha bisogno di pochi a risorse esterne)
  • Non offuscato per il bene di offuscamento (compromessi per le dimensioni vanno bene)
  • Autonomi esempio (se chiamato senza un post di forma, si visualizza il form)

Questo è quasi il contrario di: Come arrivare e-mail e i relativi allegati dal PHP. Quasi si sarebbe potuto rispondere in La compilazione e-mail con allegati multipli in PHP, ma in realtà, non mostra codice.

  • Vorrei proporre la mia soluzione, ma a giudicare dal precedente codice di gare di golf vorrei essere sonoramente battuto!

 

6 Replies
  1. 71

    Solo per divertimento, ho pensato di battere in su. È finito per essere più complicato di quanto pensassi, perché ho fatto a non comprendere appieno come il confine parte funziona, alla fine ho capito che l’avvio e la fine ‘–‘ sono stati significativi e andarono via.

    <?php
        if(isset($_POST['submit']))
        {
            //The form has been submitted, prep a nice thank you message
            $output = '<h1>Thanks for your file and message!</h1>';
            //Set the form flag to no display (cheap way!)
            $flags = 'style="display:none;"';
    
            //Deal with the email
            $to = '[email protected]';
            $subject = 'a file for you';
    
            $message = strip_tags($_POST['message']);
            $attachment = chunk_split(base64_encode(file_get_contents($_FILES['file']['tmp_name'])));
            $filename = $_FILES['file']['name'];
    
            $boundary =md5(date('r', time())); 
    
            $headers = "From: [email protected]\r\nReply-To: [email protected]";
            $headers .= "\r\nMIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=\"_1_$boundary\"";
    
            $message="This is a multi-part message in MIME format.
    
    --_1_$boundary
    Content-Type: multipart/alternative; boundary=\"_2_$boundary\"
    
    --_2_$boundary
    Content-Type: text/plain; charset=\"iso-8859-1\"
    Content-Transfer-Encoding: 7bit
    
    $message
    
    --_2_$boundary--
    --_1_$boundary
    Content-Type: application/octet-stream; name=\"$filename\" 
    Content-Transfer-Encoding: base64 
    Content-Disposition: attachment 
    
    $attachment
    --_1_$boundary--";
    
            mail($to, $subject, $message, $headers);
        }
    ?>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>MailFile</title>
    </head>
    
    <body>
    
    <?php echo $output; ?>
    
    <form enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF'];?>" method="post" <?php echo $flags;?>>
    <p><label for="message">Message</label> <textarea name="message" id="message" cols="20" rows="8"></textarea></p>
    <p><label for="file">File</label> <input type="file" name="file" id="file"></p>
    <p><input type="submit" name="submit" id="submit" value="send"></p>
    </form>
    </body>
    </html>

    Molto minimale davvero, e, ovviamente, l’utilizzo di CSS in linea per nascondere la forma è un po ‘basso e si sarebbe quasi certamente vuole un po’ di più il feedback per l’utente! Inoltre, mi sarebbe probabilmente spendere un po ‘ più di tempo ciò che è il Contenuto per il Tipo di file è, piuttosto che barare e con application/octet-stream ma che parte è molto interessante.

    • Questa è la risposta migliore finora, a mio parere, come tu sei l’unico a fornire il codice completo (che la domanda chiede in modo specifico). +1.
    • È bello usare md5 per il confine per il golf, ma per la produzione devi controllare che il confine non si verificano nella codifica allegato. Alcune codifiche sono più sicuri, ad esempio, Base64 non sarà mai accidentalmente in corrispondenza di un confine che ha _ in esso
    • C’è un modo per allegare più file ?
    • se si desidera inviare l’immagine poi come si fa
    • Molto semplice e lineare. Grazie per questo!
    • Bello e tutto, ma l’intera stringa creata è visualizzato come è nella posta… c’È un modo per il file il mio utente upload essere allegato alla mail e non codificati? NVM: l’ho trovato qui sanwebe.com/2011/01/send-php-mail-with-attachment
    • Si sta inoltre lavorando per me.Grazie mille

  2. 16

    Una combinazione di questo http://www.webcheatsheet.com/PHP/send_email_text_html_attachment.php#attachment

    con il php per l’upload di file di esempio dovrebbe funzionare. Nel caricare file di esempio, invece di utilizzare move_uploaded_file per spostarlo dalla cartella temporanea avrebbe appena aperto:

    $attachment = chunk_split(base64_encode(file_get_contents($tmp_file))); 

    dove $tmp_file = $_FILES['userfile']['tmp_name'];

    e inviarlo come allegato, come il resto dell’esempio.

    Tutti in un unico file /autonomo:

    <? if(isset($_POST['submit'])){
    //process and email
    }else{
    //display form
    }
    ?>

    Penso che sia un rapido esercizio, per ottenere ciò di cui hai bisogno per lavorare sulla base di quanto sopra due esempi disponibili.

    P. S. ha bisogno di avere caricato da qualche parte prima di Apache passa insieme a PHP a fare ciò che vuole con esso. Che sarebbe la cartella temp del sistema per impostazione predefinita a meno che non è stato cambiato nel file di configurazione.

  3. 4

    Questo articolo “Come creare basato su PHP modulo e-mail con il file allegato” presenta step-by-step istruzioni su come ottenere il vostro requisito.

    Citazione:

    In questo articolo viene illustrato come creare un
    Basato su PHP modulo e-mail che supporta
    file allegato. L’articolo inoltre
    mostrare come validare il tipo e
    la dimensione del file caricato.

    Si compone dei seguenti passi:

    • Il modulo HTML con upload di file casella di
    • Ottenere l’upload del file in PHP
      script
    • Convalida la dimensione e l’estensione del
      il file caricato
    • Copiare il file caricato
    • Inviare l’e-Mail

    L’intero codice di esempio, può essere scaricato qui

  4. 4

    Per aggiungere il file al messaggio e-mail come allegato, sarà devono essere memorizzati sul server brevemente. È banale, anche se, per collocarlo in un tmp posizione quindi eliminarlo dopo che hai finito con esso.

    Come per le email, Zend Mail è molto facile da usare l’interfaccia per gestire allegati di e-mail. Abbiamo eseguito con tutta la Zend Framework installato, ma sono abbastanza sicuro che si può solo installare il Zend_Mail libreria senza bisogno di altri moduli per le dipendenze.

    Con Zend_Mail, l’invio di una e-mail con un allegato è semplice:

    $mail = new Zend_Mail();
    $mail->setSubject("My Email with Attachment");
    $mail->addTo("[email protected]");
    $mail->setBodyText("Look at the attachment");
    $attachment = $mail->createAttachment(file_get_contents('/path/to/file'));
    $mail->send();

    Se stai cercando un one-file-pacchetto per il modulo/e-mail/attachment cosa, non ho mai visto nessuno. Ma i singoli componenti sono certamente disponibile e facile da montare. Cosa più delicata di tutto il gruppo è di allegato e-mail, che la raccomandazione di cui sopra rende molto semplice.

  5. 4

    Non ho testato anche l’email parte di questo (il mio box di prova non inviare e-mail), ma credo che funzionerà.

    <?php
    if ($_POST) {
    $s = md5(rand());
    mail('[email protected]', 'attachment', "--$s
    
    {$_POST['m']}
    --$s
    Content-Type: application/octet-stream; name=\"f\"
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment
    
    ".chunk_split(base64_encode(join(file($_FILES['f']['tmp_name']))))."
    --$s--", "MIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=\"$s\"");
    exit;
    }
    ?>
    <form method="post" enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF'] ?>">
    <textarea name="m"></textarea><br>
    <input type="file" name="f"/><br>
    <input type="submit">
    </form>
    • Mi piace la tua per le piccole e semplici, e vorrei poter avere dato entrambi il bounty.
  6. 1

    PEAR::Mail_Mime? Certo, PERA dipendenza (min) 2 file (solo mail_mime stesso, se si modifica per rimuovere la pera dipendenze), ma funziona bene. Inoltre, la maggior parte dei server hanno PERA installato in una certa misura, e nel migliore dei casi hanno Pera/e-Mail e Pera/Mail_Mime. Qualcosa che non può essere detto per la maggior parte delle altre biblioteche, che offre le stesse funzionalità.

    Si può anche prendere in considerazione in cerca di PHP L’estensione IMAP. È un po ‘ più complicato e richiede più l’installazione (non attivato o installato di default), ma è necessario più efficiente compilng e l’invio di messaggi IMAP in grado di server.

Lascia un commento