【问题标题】:Sending PDF data via email using PHPMailer and html2pdf使用 PHPMailer 和 html2pdf 通过电子邮件发送 PDF 数据
【发布时间】:2020-04-25 22:08:59
【问题描述】:

我试图通过电子邮件发送 PDF 或 PNG,但似乎没有任何效果。下面是我的最后一次尝试,我已经阅读了关于 SO 的每一篇文章,但没有看到任何建议的工作,有人可以帮忙吗? 我正在使用 PHPMailer、html2pdf 和 html2canvas,它们都在单击时生成正确的文档,只是将它们发送到 php mailer 不起作用。 我收到无法打开的文件...以下是我最后的尝试... 使用 file_get_contents 方法,我得到 0 大小的数据。

PDF 尝试:

var element = document.getElementById('printableArea');
// var opt = {  
//      filename:     'nalog.pdf'
// };   
html2pdf().from(element).toPdf().output('datauristring').then(function (pdfAsString) {
    pdfcontent = pdfAsString.replace(/&/,"%26").replace(/=/,"%3D");
     var x = new XMLHttpRequest();
     var url = "xxx/mail.php";
     x.open("POST", url, true);
     x.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
     x.send("data="+pdfcontent);
console.log(pdfcontent);
        });

PHP:

$mail->AddStringAttachment($_POST['data'],"nalog.pdf"); 

PNG 尝试:

html2canvas($('#printableArea')[0], {
  width: 1200
}).then(function(canvas) {
    var data = canvas.toDataURL("image/png");
    pdfcontent = data.replace(/&/,"%26").replace(/=/,"%3D");
    var x = new XMLHttpRequest();
    var url = "xxx/mail.php";
    x.open("POST", url, true);
    x.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    x.send("data="+pdfcontent);
    console.log(pdfcontent);
});

PHP:

$mail->AddStringAttachment($_POST['data'],"nalog.png"); 

编辑: 为了更新我的问题,我从 anwser 提出了建议并尝试对其进行调试,但没有任何帮助。我制作了 PHP file_put_contents() 并与控制台日志进行了比较,它是相同的数据。

还有其他建议吗?

【问题讨论】:

  • 一次测试一件事:在您尝试通过电子邮件发送之前检查 PDF 或 PNG 是否有效。目前你无法判断问题出在哪里。
  • @Synchro 感谢您的输入,我尝试调试它并找到源代码。
  • 请不要将[solved] 之类的虚假标签编辑到问题的标题中。要将问题标记为已解决,请接受答案。
  • @meagar 没问题,我第一次这样做,想想看,从来没有像这样播种标签,我现在明白为什么了。但为什么要删除其余部分?
  • 我回滚了你的编辑;如果您想更新标题以使其更清晰,请随时这样做。

标签: javascript php phpmailer html2canvas html2pdf


【解决方案1】:

我的猜测是问题出现在传输过程中,因为 URI 不能很好地处理二进制数据 - 可能有 NUL 字符,谁知道那里还有什么,这会截断或弄乱数据。 尝试像这样发送这些数据(作为原始文本,而不是 URL 编码的):

    var x = new XMLHttpRequest();
    x.open("POST", "xxx/mail.php", true);
    x.setRequestHeader("Content-type", "text/plain; charset=utf-8");
    x.send( new Uint8Array(pdfcontent) );

然后,在服务器端,您需要像这样提取这些原始数据:

   $data = file_get_contents('php://input');

使用 $_POST 不起作用,它应该是空的。

如果这仍然产生一个坏文件,那么问题可能不在传输中。 尝试将 console.log 打印的任何内容复制并粘贴到文件中,看看它是否可以打开(即使数据有效,它也可能无法工作,因为正在处理二进制数据,但如果它确实有效,那就太好了 - 在至少我们可以从源头上排除问题)。 然后尝试使用 file-put-contents (https://www.php.net/manual/en/function.file-put-contents.php) 将数据保存在服务器端,并查看是否生成有效文件。如果是这样,则问题发生在发送电子邮件期间。

在任何情况下,您都应该真正在服务器端生成文件 - 所有这些来回都是非常低效且非常不安全的。例如,您可以使用 FPDF (http://www.fpdf.org/) 使用 PHP 从头开始​​创建 PDF 文件,并在此处通过电子邮件发送。是的,它使您的输出工作加倍,因为您需要分别生成 HTML 和 PDF,但从长远来看,这是非常值得的。或者您可能根本不需要在此设置中生成 HTML?您生成 HTML 的唯一目的是通过电子邮件发送它,还是真的需要将它呈现给用户?

【讨论】:

  • 感谢您的意见,我会尝试所有建议的内容,并且回答一下,我的主机中没有包含 FPDF 库,我的 hooters 看不到,或者我可以自己包含它。是的,我明白你在说什么,这只是因为特定的商业目的,是的,它应该像我实现它一样生成。问题是有些人没有电子邮件,而且它不是表单中的必填字段(所有者要求)。
  • 所以它需要在表单提交时生成,并带有打印/下载/另存为 pdf/pic 的选项,如果提供了电子邮件,我想立即邮寄。我知道,但这是要求。疼痛...
  • 编辑:我知道我可以包含 FPDF,但在尝试完成这项工作后我看不到它*
  • file_get_contents('php://input');建议的方法产生 0 个文件大小的文件。
  • 我制作了 PHP file_put_contents() 并与控制台日志进行了比较,它是相同的数据:(
【解决方案2】:

在几乎放弃之后,终于让它工作了。它结合了这里链接和建议的几件事。 github html2pdf 上的这篇文章也有所帮助。

我将其发布在这里,因为没有一个示例对我有用,我花了两天时间才找到对我和我的葬礼有用的东西。希望它可以帮助某人。

window.onload = function pdfDivload (){
let el = document.getElementById('printableArea');
let opt = {
    margin:       1,
    filename:     'myfile.pdf',
    image:        { type: 'jpeg', quality: 0.98 },
    html2canvas:  { scale: 2 },
    jsPDF:        { unit: 'in', format: 'A4', orientation: 'portrait' }
};

html2pdf().set( opt ).from( el ).toPdf().output('datauristring').then(function( pdfAsString ) {
    let data = {
        'fileDataURI': pdfAsString,
    };
    $.post( "../prog/mail.php", data);
    console.log( data );
} );
};

PHP:

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

                $pdfdoc         = $_POST['fileDataURI'];

            $b64file        = trim( str_replace( 'data:application/pdf;base64,', '', $pdfdoc ) );
            $b64file        = str_replace( ' ', '+', $b64file );
            $decoded_pdf    = base64_decode( $b64file );
            //file_put_contents( $attachment, $decoded_pdf );

            $mail = new PHPMailer;
            $mail->setFrom( 'xxx@xxx.hr', 'website' );
            $mail->addAddress( 'xxx@gxxx.com', 'OdedTa' );
            $mail->Subject  = 'First PHPMailer Message';
            $mail->Body     = 'Hi! This is my first e-mail sent through PHPMailer.';
            $mail->addStringAttachment($decoded_pdf, "nalog.pdf");
            $mail->isHTML( true );
            $mail->send();

【讨论】:

    猜你喜欢
    • 2021-03-23
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 2018-09-29
    • 1970-01-01
    相关资源
    最近更新 更多