7
votes

Envoyer un e-mail un PDF créé de manière dynamique via php

J'ai récemment créé un modèle en ligne pour créer des offres d'emploi pour notre site Web. Tout est terminé, cela formate correctement dans un navigateur, publie automatiquement sur notre site Web, bla bla bla.

La dernière pièce que je crée est de donner à l'administrateur quelques options pour la distribution de la publication à divers endroits (par courrier électronique ) de manière cohérente et commode. J'ai créé une page PHP qui crée un document PDF à la volée, à l'aide de la bibliothèque TCPDF. Lors du chargement de pdf.php? Id = x, la page affiche un PDF avec le contenu de l'emploi d'emploi X. Cela signifie que je ne sauvegarde jamais le fichier PDF sur le serveur, ce qui la crée à la volée à chaque appel.

Mais je veux attacher ce fichier PDF à un courrier électronique et l'envoyer à divers collèges, ainsi que des listes de diffusion internes, etc. Si je joins le pdf.php? Id = x sur l'e-mail, il ne joint pas Le PDF, il attache ce qui semble être un fichier vierge, avec le nom ci-dessus.

est-il possible de l'attacher à l'e-mail sans l'enregistrer sur le serveur?


Ci-dessous ajouté en fonction de la réponse de JM4 pour de nouvelles heures de prise de vue. J'ai placé la création de fichier PDF dans une fonction et je l'ai placée dans un fichier incluant, juste pour maintenir les choses plus faciles à gérer. xxx

voici une version supprimée du PDF .php: xxx


6 commentaires

Montrez-nous le code (ou de préférence un squelette très coupé). Il ressemble à la méthode que vous utilisez pour activer l'URL en une pièce jointe est fausse. Pourquoi es-tu si préoccupé par ne pas écrire un fichier même temporairement?


API.Joomla.org/com-tecnick-tcpdf/tcpdf.html# MéthodeOutput J'utilise l'option 'i' pour DEST. Je me demande si l'option S est ce que je devrais utiliser.


Est-ce que l'une des réponses ici vous aident?


@ALEX, non, je n'ai pas été hors de ce projet depuis plusieurs années maintenant. Je crois que je viens de le stocker dans le dossier Temp, puis de la joindre.


Je l'ai réussi moi-même entre-temps, merci pour la réponse;)


@Alex sont l'une des réponses ci-dessous correctes? Pouvez-vous ajouter la solution correcte afin que nous puissions la fermer?


6 Réponses :


0
votes

Jetez un coup d'œil à cette page qui traite d'un courrier électronique avancé dans PHP.

http://articles.sitepoint.com/article/advanced-Email -PL / 5

Ils prennent un fichier téléchargé et chargent les données binaires en $ données, mais vous pouvez simplement commencer à partir de là.


0 commentaires

0
votes

Vous pouvez également vouloir regarder l'envoi comme une pièce jointe via PEAR Mail_Mime . Il peut accepter une pièce jointe en tant que chaîne de données.

Le package Rmail semble également comme s'il ferait la même chose via la classe StringTatachment. Vous aurez à Google pour cela, car je suis un nouvel utilisateur et je peux donc publier un seul lien à la fois.


0 commentaires

6
votes

Si je comprends complètement ce que vous demandez que cela est assez simple. Je suppose que vous avez déjà le PDF généré en utilisant quelque chose comme FDPF ou TCPDF. Dans ce cas - utilisez simplement le code suivant:

<?php
    // random hash necessary to send mixed content
    $separator = md5(time());

    $eol = PHP_EOL;

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

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

    ///////////HEADERS INFORMATION////////////
    // main header (multipart mandatory) message
    $headers  = "From: Sender_Name<sender@domain.com>".$eol;
    $headers .= "Bcc: email@domain.com".$eol;
    $headers .= "MIME-Version: 1.0".$eol; 
    $headers .= "Content-Type: multipart/mixed; boundary=\"".$separator."\"".$eol.$eol; 
    $headers .= "Content-Transfer-Encoding: 7bit".$eol;
    $headers .= "This is a MIME encoded message.".$eol.$eol;

    // message
    $headers .= "--".$separator.$eol;
    $headers .= "Content-Type: text/html; charset=\"iso-8859-1\"".$eol;
    $headers .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
    $headers .= $message.$eol.$eol;

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


    //Email message
    mail($emailto, $emailsubject, $emailbody, $headers);

    ?>


8 commentaires

Vous avez la bonne idée. Tout est ici fonctionne, mais quand il arrive à la ligne d'envoyer le courrier électronique, il semble suspendre indéfiniment. Pas d'erreur, non rien. Y a-t-il une limite aux en-têtes qui peuvent être transmis? Ceci est un peu plus de 810 000 caractères (mais c'est juste une page PDF).


@Cory - Mon script fonctionne. S'il est suspendu, il y a quelque chose de mal ou de votre script PDF. J'ai utilisé ce qui précède pour 100 pdfs de pages sans problème. Il n'y a pas de limite au nombre d'en-têtes que de pouvoir être passés. Postez votre code actuel dans une édition afin que nous puissions regarder.


Merci JM4, j'ai ajouté dans le code dans le message d'origine. Comme je l'ai dit, cela fera tout sauf l'appel de courrier (). Donc, je peux produire des en-têtes $ via Echo sans problème.


@Cory Dee - Vous pouvez donc confirmer que le PDF est créé cependant (sortie de sortie, D ou I)? Quelle version de PHP utilisez-vous et quel client courrier dans vos paramètres PHP.INI?


Apache / 2.2.11 (Win32) PHP / 5.2.8. Les paramètres de messagerie dans PHP.ini sont définis sur la bonne adresse IP et Port (je peux envoyer d'autres courriels). Si je commencez la ligne avec des en-têtes $. = $ Pièce jointe. $ EOL. $ EOL; Il enverra un courrier électronique avec un PDF vierge ci-joint. Donc, le courrier fonctionne.


Oh, et oui, il génère un fichier PDF pouvant être chargé par un navigateur sans problèmes.


800k est grand dans les conditions de courriel. Cela ressemble à un problème de limite de taille. soit l'envoi ou la réception.


@Talvi - 800k est le nombre de caractères, pas la taille du fichier. Cory Dee - Que se passe-t-il lorsque vous changez la dernière ligne dans pdf.php vers: retour $ pdf-> sortie ("", "i");



1
votes

Je devais juste comprendre cela et mes globes oculaires étaient définitivement douloureux à la fin ...

1) Vous devez installer PHPMailer sur le serveur PHP. P>

2) Inclure la classe PHPMailer dans votre script TCPDF, comme (votre chemin peut varier): P>

$filename = "custompdf_$name_$time.pdf";

$pdf->Output($filename, 'F'); // save the pdf under filename

$mail = new PHPMailer(); $mail->IsSMTP();

$mail->Host = "mail.yourhost.com";
$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->Port       = 26;                    // set the SMTP port for the GMAIL server
$mail->Username   = "user+yourhost.com"; // SMTP account username
$mail->Password   = "topsecret";        // SMTP account password

$mail->From = "noreply@yourhost.com";
$mail->FromName = "Stack Overflower";
$mail->AddAddress( $email, $name );  //  in this case the variable has been passed
$mail->AddCC( "person@somehost.net", "Johnny Person"); // in this case we just hard code it
$mail->SMTPDebug = 0;  // use 2 for debugging the email send

$pdf_content = file_get_contents($filename);

$mail->WordWrap = 50;
$mail->AddStringAttachment($pdf_content, "custompdf_for_$name_$time.pdf", "base64", "application/pdf");  // note second item is name of emailed pdf
$mail->IsHTML(true);
$mail->Subject = "Your pdf is here";
$mail->Body = "Dear $name,<br>
Here is your custom generated pdf generated at $t.<br><br>
Thank you";
if(!$mail->Send()) {
     echo "Sorry ... EMAIL FAILED"; 
     } else {  echo "Done. . .  Email sent to $email at $t."; }

unlink($filename); // this will delete the file off of server


2 commentaires

Votre solution implique qu'il doit télécharger les scripts PHP Mailer à son répertoire qui n'est pas le cas. Les commandes Simple PHP Mail () enverront un email. Vous n'avez pas non plus besoin de sauvegarder le fichier PDF lorsque vous impliquez, cela fonctionne simplement comme $ PDF-> Sortie ($ FileName, 's');


Merci, bien que le courrier fonctionne, phpmailer est bien meilleur, c'est-à-dire que j'avais besoin des fonctions SMTP authentifiées. Je suppose que l'option "S" garderait le travail TEMP en mémoire et non comme un fichier réel sur disque ... Si vous pouvez fournir un exemple de travail ... J'ai reçu une erreur d'ouverture de flux.



0
votes

Je suis d'accord sur l'utilisation d'une bibliothèque de messagerie à la place de messages MIME de construction à la main avec la fonction Mail () par défaut. SwiftMailer est une autre bonne bonne bibliothèque PHP PHP Source. Voici le exemple de code pour utiliser du contenu dynamique comme pièce jointe sans avoir à le sauvegarder sur le système de fichiers Premièrement.


0 commentaires

0
votes

Vos en-tête semblent être un peu dehors:

  • application / octet-flux code> devrait devenir application / octetstream code> p> l> li>

  • disposition de contenu: pièce jointe .. code> devrait devenir disposition de contenu: pièce jointe; Nom de fichier = "'. basename ($ fichier fichier).'" code> p> li> ul>

    heres ce que doivent ressembler les en-têtes de fixation: P>

    foreach ($this->attachments as $attachment) { 
         if (file_exists($attachment['file'])) {
            $handle = fopen($attachment['file'], 'r');
            $content = fread($handle, filesize($attachment['file']));
    
            fclose($handle); 
    
            $message .= '--' . $boundary . $this->newline;
            $message .= 'Content-Type: application/octetstream' . $this->newline;   
            $message .= 'Content-Transfer-Encoding: base64' . $this->newline;
            $message .= 'Content-Disposition: attachment; filename="' . basename($attachment['filename']) . '"' . $this->newline;
            $message .= 'Content-ID: <' . basename($attachment['filename']) . '>' . $this->newline . $this->newline;
            $message .= chunk_split(base64_encode($content));
        }
    }
    $message .= '--' . $boundary . '--' . $this->newline; 
    


1 commentaires

Comment feriez-vous que si le PDF n'existe pas sur le serveur, mais via URL avec TCPDF?