2011-12-12 19 views
7

Ok ragazzi, questo è il mio primo thread e ho cercato online ma senza fortuna. Sto facendo uno stage e sto lavorando a un progetto che richiede la creazione di una pagina Web che genera un file PDF quando un utente invia le sue informazioni. Non appena un cliente fa clic sul pulsante di invio, 3 cose devono accadere:Invio di un messaggio di posta elettronica con un allegato di file PDF tramite PHP

  1. di memorizzare le informazioni nel database (fatto),
  2. Invia il personale una e-mail con le nuove informazioni del cliente (fatto), e
  3. Inviare al cliente un'e-mail di "messaggio di ringraziamento" con un allegato di file pdf (non funzionante).

Voglio dire, il cliente non riceverà un'e-mail, ma quando lui/lei apre il file pdf, ottengo il seguente messaggio di errore:

"Acrobat potrebbe non OEN 'nome_file' perché è o non è un tipo di file supportato o perché il file è stato danneggiato (ad esempio, è stato inviato come allegato e non è stato decodificato correttamente) ... "

Si prega di tenere presente che questa è la mia prima volta fare un progetto sulla creazione di un allegato di file pdf. Se qualcuno potesse aiutarmi a risolvere questo problema, sarebbe fantastico. Grazie!

Ecco il mio codice:

<?php 
// once there are no errors, as soon as the customer hits the submit button, it needs to send an email to the staff with the customer information 
     $msg = "Name: " .$_POST['name'] . "\n" 
      ."Email: " .$_POST['email'] . "\n" 
      ."Phone: " .$_POST['telephone'] . "\n" 
      ."Number Of Guests: " .$_POST['numberOfGuests'] . "\n" 
      ."Date Of Reunion: " .$_POST['date']; 
     $staffEmail = "staffinfo"; 

     mail($staffEmail, "You have a new customer", $msg); // using the mail php function to send the email. mail(to, subject line, message) 

     //once the customer submits his/her information, he/she will receive a thank you message attach with a pdf file. 
     $pdf=new FPDF(); 
     $pdf->AddPage(); 
     $pdf->SetFont("Arial", "B", 16); 
     $pdf->Cell(40, 10, "Hello World!"); 

     // email information 
     $to = $_POST['email']; 
     $from = $staffEmail; 
     $subject = "Thank you for your business"; 
     $message = "Thank you for submitting your information!"; 

     // a random hash will be necessary to send mixed content 
     $separator = md5(time()); 

     // carriage return type (we use a PHP end of line constant) 
     $eol = PHP_EOL; 

     // attachment name 
     $filename = "yourinformation.pdf"; 

     // encode data (puts attachment in proper format) 
     $pdfdoc = $pdf->Output("", "S"); 
     $attachment = chunk_split(base64_encode($pdfdoc)); 

     // encode data (multipart mandatory) 
     $headers = "From: ".$from.$eol; 
     $headers .= "MIME-Version: 1.0".$eol; 
     $headers .= "Content-Type: multipart/mixed; boundary=\"".$separator."\"".$eol.$eol; 
     $headers .= "Content-Transfer-Enconding: 7bit".$eol; 
     $headers .= "This is a MIME encoded message.".$eol.$eol; 

     // message 
     $headers .= "--".$separator.$eol; 
     $headers .= "Content-Type: text/html; charsrt=\"iso-8859-1\"".$eol; 
     $headers .= $message.$eol.$eol; 

     // attachment 
     $headers .= "--".$separator.$eol; 
     //$headers .= "Content-Type: application/octet-stream; name=\"".$filename."\"".$eol; 
     $headers .= "Content-Type: application/zip; name=\"".$filename."\"".$eol; 
     $headers .= "Content-Transfer-Encoding: base64".$eol; 
     $headers .= "Content-Disposition: attachment".$eol.$eol; 
     $headers .= $attachment.$eol.$eol; 
     $headers .= "--".$separator."--"; 

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

    } 
} 
?> 
+0

ho notato che hai application/zip. Prova invece l'applicazione/pdf. – Raisen

+0

L'ho fatto anch'io, ma non funzionerà. –

+0

Non ho ancora pensato correttamente, ma IIRC l'eol per le intestazioni MIME è sempre "\ r \ n" il valore effettivo in 'PHP_EOL' varia a seconda del sistema operativo; che potrebbe mettere una chiave in lavorazione nella tua var $ headers; anche se secondo le specifiche dovrebbe essere tollerante: http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html (19.3) – CD001

risposta

3
// once there are no errors, as soon as the customer hits the submit button, it needs to send an email to the staff with the customer information 
     $msg = "Name: " .$_POST['name'] . "\n" 
      ."Email: " .$_POST['email'] . "\n" 
      ."Phone: " .$_POST['telephone'] . "\n" 
      ."Number Of Guests: " .$_POST['numberOfGuests'] . "\n" 
      ."Date Of Reunion: " .$_POST['date']; 
     $staffEmail = "staffemail"; 

     mail($staffEmail, "You have a new customer", $msg); // using the mail php function to send the email. mail(to, subject line, message) 

     //once the customer submits his/her information, he/she will receive a thank you message attach with a pdf file. 
     // creating a pdf file 
     $pdf_filename = tempnam(sys_get_temp_dir(), "pdf"); 
     $pdf=new FPDF(); 
     $pdf->AddPage(); 
     $pdf->SetFont("Arial", "B", 16); 
     $pdf->Cell(40, 10, "Title"); 
     $pdf->Ln(); 
     $pdf->SetFont("Arial", "", 12); 
     $pdf->Cell(15, 10, "Name:"); 
     $pdf->SetFont("Arial", "I", 12); 
     $pdf->Cell(15, 10, $_POST['name']); 
     $pdf->Ln(); 
     $pdf->SetFont("Arial", "", 12); 
     $pdf->Cell(15, 10, "Email:"); 
     $pdf->SetFont("Arial", "I", 12); 
     $pdf->Cell(15, 10, $_POST['email']); 
     $pdf->Ln(); 
     $pdf->SetFont("Arial", "", 12); 
     $pdf->Cell(15, 10, "Phone:"); 
     $pdf->SetFont("Arial", "I", 12); 
     $pdf->Cell(15, 10, $_POST['telephone']); 
     $pdf->Ln(); 
     $pdf->SetFont("Arial", "", 12); 
     $pdf->Cell(40, 10, "Number of Guests:"); 
     $pdf->SetFont("Arial", "I", 12); 
     $pdf->Cell(40, 10, $_POST['numberOfGuests']); 
     $pdf->Ln(); 
     $pdf->SetFont("Arial", "", 12); 
     $pdf->Cell(40, 10, "Date Of Reunion:"); 
     $pdf->SetFont("Arial", "I", 12); 
     $pdf->Cell(40, 10, $_POST['date']); 
     // if file doesn't exists or if it is writable, create and save the file to a specific place 
     if(!file_exists($pdf_filename) || is_writable($pdf_filename)){ 
      $pdf->Output($pdf_filename, "F"); 
     } else { 
      exit("Path Not Writable"); 
     } 

     // using the phpmailer class 
     // create a new instance called $mail and use its properties and methods. 
     $mail = new PHPMailer(); 
     $staffEmail = "staffemail"; 
     $mail->From = $staffEmail; 
     $mail->FromName = "name"; 
     $mail->AddAddress($_POST['email']); 
     $mail->AddReplyTo($staffEmail, "name"); 

     $mail->AddAttachment($pdf_filename); 
     $mail->Subject = "PDF file attachment"; 

     $mail->Body = "message!"; 

     // if mail cannot be sent, diplay error message 
     //if(!$mail->Send()){ 
      //echo "<div id=\"mailerrors\">Message could not be sent</div>"; 
      //echo "<div id=\"mailerrors\">Mailer Error: " . $mail->ErrorInfo . "</div>"; 
     //} else { // else...if mail is sent, diplay sent message 
      //echo "<div id=\"mailerrors\">Message sent</div>"; 
     //} 

     // delete the temp file 
     unlink($pdf_filename); 
    } 
}  
+0

Questo è il mio codice finale e funziona perfettamente! –

+1

Questo è un commento in ritardo, ma probabilmente dovresti usare 'tempnam' per generare un nome di file univoco in modo da non rischiare di avere un problema con due clienti che colpiscono lo script contemporaneamente. – yakatz

0

Prova questa:

<?php 

    // once there are no errors, as soon as the customer hits the submit button, 
    // it needs to send an email to the staff with the customer information 
    $msg = "Name: " .$_POST['name'] . "\n" 
     . "Email: " .$_POST['email'] . "\n" 
     . "Phone: " .$_POST['telephone'] . "\n" 
     . "Number Of Guests: " .$_POST['numberOfGuests'] . "\n" 
     . "Date Of Reunion: " .$_POST['date']; 
    $staffEmail = "staffinfo"; 
    mail($staffEmail, "You have a new customer", $msg); 

    // once the customer submits his/her information, he/she will receive a thank 
    // you message attach with a pdf file. 
    $pdf = new FPDF(); 
    $pdf->AddPage(); 
    $pdf->SetFont("Arial", "B", 16); 
    $pdf->Cell(40, 10, "Hello World!"); 

    // email information 
    $to = $_POST['email']; 
    $from = $staffEmail; 
    $subject = "Thank you for your business"; 
    $message = "Thank you for submitting your information!"; 

    // a random hash will be necessary to send mixed content 
    $separator = '-=-=-'.md5(microtime()).'-=-=-'; 

    // attachment name 
    $filename = "yourinformation.pdf"; 

    // Generate headers 
    $headers = "From: $from\r\n" 
      . "MIME-Version: 1.0\r\n" 
      . "Content-Type: multipart/mixed; boundary=\"$separator\"\r\n" 
      . "X-Mailer: PHP/" . phpversion(); 

    // Generate body 
    $body = "This is a multipart message in MIME format\r\n" 
     . "--$separator\r\n" 
     . "Content-Type: text/html; charset=\"iso-8859-1\"\r\n" 
     . "\r\n" 
     . "$message\r\n" 
     . "--$separator\r\n" 
     . "Content-Type: application/pdf\r\n" 
     . "Content-Transfer-Encoding: base64\r\n" 
     . "Content-Disposition: attachment; filename=\"$filename\"\r\n" 
     . "\r\n" 
     . chunk_split(base64_encode($pdf->Output("", "S")))."\r\n" 
     . "--$separator--"; 

    // send message 
    mail($to, $subject, $body, $headers); 
+0

Ok DaveRandom, ci proverò ora! Grazie! –

+0

Attendo che la posta entri, ma sembra che la funzione di posta php impieghi troppo tempo per inviare il messaggio. La prima e-mail richiede sempre così tanto tempo. Dopo la prima e-mail, occorrono pochi secondi per ricevere l'e-mail. Non appena avrò ricevuto la prima email, confermerò se funziona o meno. Grazie! –

+1

Non ho funzionato per me, quindi ho cambiato tutto e ho finito con l'uso della classe phpmailer. Grazie a tutti per il vostro aiuto !! –

Problemi correlati