2011-01-03 14 views
14

Come inviare l'e-mail con allegato curriculum,php inviare e-mail con allegato

prendo frammento da questo luogo Click here

In questo sito, frammento di codice funziona bene,

Anche ho ricevuto la posta, ma l'attaccamento non funziona, che ottiene attment come noname con 0kb dimensione del file

, cosa è questione in tale frammento,

+0

possibile duplicato di [Invia e-mail con allegati in PHP?] (http://stackoverflow.com/questions/1214646/send-email-with-attachments-in-php) –

+0

Si prega di cercare le domande esistenti/risposte prima di pubblicare una domanda - questo non è esattamente nuovo g round e la gente probabilmente non sarà incline a eseguire il debug di alcuni script che hai trovato su internet. –

risposta

39
function mail_attachment($to, $subject, $message, $from, $file) { 
    // $file should include path and filename 
    $filename = basename($file); 
    $file_size = filesize($file); 
    $content = chunk_split(base64_encode(file_get_contents($file))); 
    $uid = md5(uniqid(time())); 
    $from = str_replace(array("\r", "\n"), '', $from); // to prevent email injection 
    $header = "From: ".$from."\r\n" 
     ."MIME-Version: 1.0\r\n" 
     ."Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n" 
     ."This is a multi-part message in MIME format.\r\n" 
     ."--".$uid."\r\n" 
     ."Content-type:text/plain; charset=iso-8859-1\r\n" 
     ."Content-Transfer-Encoding: 7bit\r\n\r\n" 
     .$message."\r\n\r\n" 
     ."--".$uid."\r\n" 
     ."Content-Type: application/octet-stream; name=\"".$filename."\"\r\n" 
     ."Content-Transfer-Encoding: base64\r\n" 
     ."Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n" 
     .$content."\r\n\r\n" 
     ."--".$uid."--"; 
    return mail($to, $subject, "", $header); 
} 
+2

+1 Ma puoi creare una struttura di codice migliore? – sv88erik

+1

Sì, ha scritto questo anno fa e non ho davvero guardato il codice da allora. L'ho ripulito molto proprio ora. Il codice è ora non testato tuttavia. Dovrebbe essere esattamente lo stesso però ... solo meno linee e più efficiente. – dqhendricks

+0

:) Forse un po 'di spazio prima del ritorno? E vorrei includere un parametro charset ottimale, $ pCharset = "ISO-8859-1" – sv88erik

4

Se NON si sta cercando di imparare come farlo a mano e si desidera semplicemente inviare una e-mail con allegato, è meglio usare una sorta di libreria per questo. Raccomando SwiftMailer, ho provato un sacco di librerie e questo funziona meglio. Controllare come è facile aggiungere un allegato utilizzando SwiftMailer qui: http://swiftmailer.org/docs/attaching-files

+0

ma questo non richiede l'installazione di SwiftMailer sul tuo server ?? ... molti webhost non consentono l'installazione di moduli/librerie aggiuntivi. – dsdsdsdsd

+2

SwiftMailer è una libreria, quindi non c'è nulla da "installare" - basta caricare i file sorgente e usarli. –

3

La cosa migliore è quello di utilizzare la libreria Mime posta PEAR per la gestione degli allegati. È molto più semplice e più pulito e sarai meno incline agli errori.

PEAR Mime Mail

è possibile allegare file a una e-mail semplicemente in questo modo:

$headers['From'] = '[email protected]'; 
$headers['To'] = '[email protected]'; 
$headers['Subject'] = 'Email Subject'; 

$mime = new Mail_mime("\r\n"); 
$mime->setTXTBody('Email text'); 
$mime->addAttachment($filedata, 'application/octet-stream', 'filename', true, 'base64'); 

//Prepare the message to be sent 
$body = $mime->get(); 
$headers = $mime->headers($headers); 

//Send the message via SMTP 
$mail_obj =& Mail::factory('smtp', array('host' => 'mail.domain.com', 'port' => 25)); 
$mail_obj->send($to, $headers, $body); 
+0

usa PERL? ... PHP può farlo senza usare 2 lingue .. – sv88erik

+0

PEAR non è PERL. PEAR è un framework e un sistema di distribuzione per componenti PHP riutilizzabili. http://pear.php.net/ –

+0

Leggi un po 'veloce. Ad ogni modo, questo sembra un po 'eccessivo per una cosa così semplice. – sv88erik

0

Se si desidera inviare un semplice modulo con un singolo allegato di questo codice è probabilmente la cosa migliore e più semplice per usare è il seguente codice funziona bene.

funzione submitSupportTicket() {

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

    $company = $_POST['company']; 
    $url = $_POST['url']; 
    $issue = $_POST['issue']; 

    $screenshot = basename($_FILES['screenshot']['name']); 

    $fileType = substr($screenshot, strrpos($screenshot, '.') + 1); 

    $fileSize = $_FILES['screenshot']['size']/1024; 

    $allowedFileTypes = array("jpg", "jpeg", "gif", "bmp", 'png'); 

    $allowedExt = false; 

    for($i=0; $i<sizeof($allowedFileTypes); $i++) 
    { 

     if(strcasecmp($allowedFileTypes[$i],$fileType) == 0) 
     { 

      $allowedExt = true; 

     } 

    } 

    if(!$allowedExt) 
    { 

     setMessage('The uploaded file is not supported file type. Only the following file types are supported: '.implode(',',$allowed_extensions), 0); 
     header('Location: '.currentURL()); 
     exit; 

    } 

    $filePath = 'mediaLibrary/attachments'.$screenshot; 

    $tmpPath = $_FILES['screenshot']['tmp_name']; 

    if(is_uploaded_file($tmpPath)) 
    { 

     if(!copy($tmpPath, $filePath)) 
     { 

      echo 'There was an error attaching the file.'; 
      exit; 

     } 

    } 

    $attachment = chunk_split(base64_encode(file_get_contents($_FILES['screenshot']['tmp_name']))); 

    $fileName = $_FILES['screenshot']['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 

Company: $company 
URL: $url 
Issue: $issue 

Submitted from minttwist.com 

--_2_$boundary-- 
--_1_$boundary 
Content-Type: application/octet-stream; name=\"$filename\" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment 

$attachment 
--_1_$boundary--"; 

    $to = '[email protected]'; 

    $subject = 'Support Request - '.$company; 

    mail($to, $subject, $message, $headers); 

    echo 'We have received your support request.'; 

    header('Location: '.currentURL()); 

} 

} 
-1

non ho visto la risposta alla tua domanda ovunque sopra, così cercherò di fornire un po 'più di informazioni che potrebbero aiutare.

Ho avuto lo stesso problema esatto proprio oggi. Ho creato una serie di file PDF, che poi sono stati convertiti in un singolo file tar.gz e questo pacchetto di file che volevo inviare via email a un agente di elaborazione umana che avrebbe risposto a questi documenti in natura. Tuttavia, quando ho usato i vari script per generare il formato del messaggio MIME corretto, ho finito per l'invio di un allegato che era 0 kB nella dimensione totale con il nome "noname".

Con così tante persone tutte che forniscono la stessa risposta, ho pensato a me stesso che le risposte devono essere corrette e che il problema deve essere altrove. La risposta al problema non è la formattazione del contenuto del messaggio, né lo è nelle intestazioni. Tutto ciò che è corretto. Il problema si trova nelle applicazioni di posta esistenti tra l'applicazione e l'indirizzo e-mail del destinatario.

Ho spostato il mio codice su un server di produzione e il messaggio inviato senza problemi e lo stesso file precedentemente inviato come "noname 0kb" ora è stato inviato come "MikeyPoochigian_2013_05_10__16_28_27.tar.gz 241kb".

Io non so ancora che cosa provoca questo particolare fallimento, ma immagino che è una risposta simile a quella che ho imparato all'inizio di quest'anno quando la mia applicazione di posta elettronica è stato l'invio a Gmail, ma non per l'invio di altri server di posta. In quel caso particolare, le applicazioni di posta stavano filtrando il contenuto per SPAM tra il mio laptop di sviluppo (che aveva il dominio interno di DevelopmentLaptop.local) e l'indirizzo di posta elettronica finale. Perché il mio server di origine inviato dal dominio "DovelopmentLaptop.locale "e poiché questo dominio non è stato registrato con alcun DNS come indirizzo conosciuto, quei server di posta interpretavano i miei messaggi di prova come spam.So sospettando che lo stesso problema interferisca ora con i messaggi inviati

Risposta lunga ora breve (se possibile), prova a trasferire il tuo codice su un server di produzione con un dominio pubblico registrato e verifica se funziona. Se lo fa, allora non è il tuo codice che deve essere corretto.