phpmailer and fpdf output file - php

i am using phpmailer and fpdf, to create pdf and send it by email.
I am using this lines for output and attach the file.
$pdfdoc = $pdf->Output('', 'S');
...
$mail->addStringAttachment($pdfdoc, 'my-doc.pdf');
I would like to ask if it is possible to attach file without saving it first to disk?

Related

Send pdf output as stringAttachment using PHPMailer

I am trying to attach a file using the PHPMailer's addStringAttachment method.
I generated the pdf from TCPDF using:
$b64_enc_doc = $pdf->Output($file_name, 'E');
Then inside of the script to send the email, I have
...
$mail->addStringAttachment($b64_enc_doc, $file_name)
However, the PDF attachment is corrupted when I try opening it.
I tried debugging the output of the PDF generated from TCPDF and it looks something similar to this:
Content-Type: application/pdf;
name="file.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="file.pdf"
JVBERi0xLjcKJeLjz9MKMjEgMCBvYmoKPDwgL1R5cGUgL1BhZ2UgL1BhcmVudCAxIDAgUiAvTGFz
dE1vZGlmaWVkIChEOjIwMjIwMTA0MTMwODQ2KzAwJzAwJykgL1Jlc291cmNlcyAyIDAgUiAvTWVk
aWFCb3ggWzAuMDAwMDAwIDAuMDAwMDAwIDU5NS4yNzYwMDAgODQxLjg5MDAwMF0gL0Nyb3BCb3gg
WzAuMDAwMDAwIDAuMDAwMDAwIDU5NS4yNzYwMDAgODQxLjg5MDAwMF0gL0JsZWVkQm94IFswLjAw
MDAwMCAwLjAwMDAwMCA1OTUuMjc2MDAwIDg0MS44OTAwMDBdIC9UcmltQm94IFswLjAwMDAwMCAw
LjAwMDAwMCA1OTUuMjc2MDAwIDg0MS44OTAwMDBdIC9BcnRCb3ggWzAuMDAwMDAwIDAuMDAwMDAw
IDU5NS4yNzYwMDAgODQxL...
Please I do not want to save the file to the server but send the file straight to the user's email. Please help.
Thanks!
You don't show the code you're using, but that string is a fragment of an email message, not a PDF binary PDF string as it should be.
Your code should be along the lines of (I don't remember tcpdf's syntax offhand):
//Render the PDF to a string in memory
$pdf = $tcpdf->output('S');
$mail->addStringAttachment($pdf, 'file.pdf');
PHPMailer will take care of the rest.

Get a json from an external url, save it as a pdf and mail it using php

I have successfully implemented a form where I receive a JSON base64 encoded string from an external URL using curl. After which I decode the string and save the file as a pdf using php and then email the pdf to the user's email using swiftmailer.
The main section of the code after retrieving the JSON value stream
$jsonvalue = $json['value'];
$dcode = (base64_decode($jsonvalue));
file_put_contents($file, $dcode);
//Swift mailer email attachment code
After this I use php swiftmailer to email this file as an attachment.
Is this correct and the most efficient way of doing this?
Thanks for your time
1). Not sure you can directly save the content as a .pdf file. As far I know, you need to use a thirdparty library called tcpdf http://www.tcpdf.org/ for saving the file as PDF file.
2). You can use swift mailer to send the attachment with email.

PHP - tcpdf and wamp server

I'm having really a hard time with TCPDF, in what I am seeing from my searching here in Stack Overflow, I can't find any help in understanding on how to use TCPDF. I can't figure out on how to include tcpdf in my website unlike FPDF, I'll just have to copy paste required folders and files inside the folder of the website then place a require(fpdf.php); in the pages. How do I do that in TCPDF?
I can't even figure out how to connect to my database unlike FPDF.
I want to know the basics in understanding TCPDF.
Can someone guide me in understanding TCPDF?
I have used this DOMPDF tutorial to convert my HTML file into PDF. You can send this PDF file to user mail also. It is very easy to understand. Try this and please let me know whether it help you or not. You can see demo here
EDIT :- If you don't want to send a mail then just remove the following code from form.php
// Load the SwiftMailer files
require_once($dir.'/swift/swift_required.php');
$mailer = new Swift_Mailer(new Swift_MailTransport()); // Create new instance of SwiftMailer
$message = Swift_Message::newInstance()
->setSubject('How To Create and Send An HTML Email w/ a PDF Attachment') // Message subject
->setTo(array($post->email => $post->name)) // Array of people to send to
->setFrom(array('no-reply#net.tutsplus.com' => 'Nettuts+')) // From:
->setBody($html_message, 'text/html') // Attach that HTML message from earlier
->attach(Swift_Attachment::newInstance($pdf_content, 'nettuts.pdf', 'application/pdf')); // Attach the generated PDF from earlier
// Send the email, and show user message
if ($mailer->send($message))
$success = true;
else
$error = true;

How to send pdf generated by TCPDF as Swiftmailer attachment

I already tried several solutions, the closest (for me) should look like this:
$file = $pdf->Output('', 'E');
$message->attach(Swift_Attachment::newInstance($file, 'name.pdf', 'application/pdf'));
$pdf is an instance of TCPDF and $message is an instance of Swift_Message.
Using above the email is being sent ok, file is attached but when I try to open it I get the error message that file is corrupted or badly encoded.
My question is: how to send pdf generated by TCPDF as Swiftmailer attachment without saving the file to server and deleting it after sending the email. Here is the link to the TCPDF output method documentation, maybe somebody can see something I have missed.
I am using something like this and it is working. For the PDF content I am using one of the simplest examples on the PDF library.
[...]
$pdf_as_string = $pdf->Output('', 'S'); // $pdf is a TCPDF instance
[...]
$transport = Swift_MailTransport::newInstance(); // using php mail function
$message->setTo(array(
"client#customdomain.com" => "Main Email",
"client#publicdomain.com" => "Secondary Email"
));
$message->setSubject("This email is sent using Swift Mailer");
$message->setBody("You're our best client ever.");
$message->setFrom("developers#mydomain.com", "Developers United");
$attachment = Swift_Attachment::newInstance($pdf_as_string, 'my-file.pdf', 'application/pdf');
$message->attach($attachment);
[...]
Maybe this answer comes a little late since I am using swiftmailer v4_3_0 and TCPDF v6_0_002. But just in case is worth to someone.
I have had no problems attaching TCPDFs on the fly.
I call a function which eventually returns the PDF using the Output type 'S':
return $pdf->Output('TE_Invoice.pdf', 'S');
I attach the file using:
$message->attach(Swift_Attachment::newInstance()
->setFilename('TE_Invoice.pdf')
->setContentType('application/pdf')
->setBody($val['file']));
Where $val['file'] is the returned value from above.
I am using TCPDF Version: 5.9.134 and Swift Mailer Version: 4.1.3
You can use outputmode 'E' to get base64String.
$base64PdfString = $pdf->Output('', 'E');
Beware: Maybe you have to cut the first 5-6 lines, because of
Content-Type: application/pdf; name=""
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename=""
Base64StringStartsHere....
cut
$base64PdfArray = explode("\r\n", $base64PdfString);
$base64 = '';
for($i = 5; $i < count($base64PdfArray); $i++) {
$base64 .= $base64PdfArray[$i];
}
Now you have the Email as base64String.
Before sending you have to decode it.
$mail->attach(new \Swift_Attachment(base64_decode($base64), 'Pdf.pdf', 'application/pdf'));
Did you try this?
$file = $pdf->Output('', 'S');
I'm doing this with another mail backend in PHP, and this does work. I guess the mail backend takes care of encoding the attachment, so there is no need to encode it as base64 manually.

DOMPDF - attach created PDF to email

What is the easiest way to attach a PDF to an email via DOMPDF?
The end of my script I am using (part of it) is below:
$dompdf = new DOMPDF();
$dompdf->load_html($html);
$dompdf->render();
//below to save the pdf file - not needed if emailing pdf
file_put_contents('/home/ststrave/public_html/pdf/STS_Brochure.pdf', $dompdf->output());
//below to open pdf in browser - required
$dompdf->stream("STS_Brochure_".rand(10,1000).".pdf", array("Attachment" => false));
jexit();
Just for clarification - this is being used in Joomla.
Appreciate the simplest/quickest way using standard PHP mail function.
Cheers ;-)
Ok. You already accepted an answer, but for anyone else coming here, I think there is an easier way, but it's also not PHP's standard mail function, which really isn't going to work. If you can get the pear packages Mail and Mail_mime, it's really easy to send emails with attachments. You can also directly attach the DomPDF output without creating a file, like so:
$dompdf = new DOMPDF();
$dompdf->load_html($html);
$dompdf->set_paper("letter", "portrait" );
$dompdf->render();
$output = $dompdf->output();
$mm = new Mail_mime("\n");
$mm->setTxtBody($body);
$mm->addAttachment($output,'application/pdf','output.pdf', false);
$body = $mm->get();
$headers = $mm->headers(array('From'=>$from,'Subject'=>$subject));
$mail =& Mail::factory('mail');
if($mail->send($to,$headers,$body)){
echo "Your message has been sent.";
}
Here is the solution I was looking for when I came here:
Instead of:
$dompdf->stream();
do this:
$fileatt = $dompdf->output();
And than send mail using PHPMailer and attach the pdf to mail like so:
$filename = 'MyDocument.pdf';
$encoding = 'base64';
$type = 'application/pdf';
$mail->AddStringAttachment($fileatt,$filename,$encoding,$type);
In this way you don't have to deal with saving the file on the server.
PHP's mail function has no "standard" file attachment method. It's an extremely barebones interface to the SMTP system that forces you to do ALL the work of attaching a file yourself.
I strongly suggest using PHPMailer or Swiftmailer to do the email for you - it reduces the heavy grunt work of generating your own MIME email and inserting the attachment (many many lines of code) does to maybe 5 lines total.
Note that neither of them will handle a streamed PDF from DOMPDF. You'll have to save the PDF to a temporary file and attach that,
Raw Data Attachments
The attachData method may be used to attach a raw string of bytes as an attachment. For example, you might use this method if you have generated a PDF in memory and want to attach it to the email without writing it to disk. The attachData method accepts the raw data bytes as its first argument, the name of the file as its second argument, and an array of options as its third argument:
/**
* Build the message.
*
* #return $this
*/
public function build()
{
return $this->view('emails.orders.shipped')
->attachData($this->pdf, 'name.pdf', [
'mime' => 'application/pdf',
]);
}

Categories