使用 PHPMailer 和 html2pdf 通过电子邮件发送 PDF 数据

Sending PDF data via email using PHPMailer and html2pdf

我正在尝试通过电子邮件发送 PDF 或 PNG,但似乎没有任何效果。下面是我的最后一次尝试,我已经阅读了这里关于 SO 的每一篇文章,但没有看到任何建议的工作,有人可以帮忙吗? 我正在使用 PHPMailer、html2pdf 和 html2canvas,它们都可以在点击时生成正确的文档,只是将它们发送到 php 邮件程序是行不通的。 我收到无法打开的文件...以下是我最后的尝试... 使用 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() 并将其与控制台日志进行比较,它是相同的数据。

还有其他建议吗?

我的猜测是问题发生在传输过程中,因为 URI 不能很好地处理二进制数据 - 可能有 NUL 字符,谁知道那里还有什么,t运行cate 或 mess-上数据。 尝试像这样发送此数据(作为原始文本,而不是 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 的唯一目的是通过电子邮件发送,还是您真的需要将其呈现给用户?

在几乎要放弃之后,终于开始工作了。它结合了此处链接和建议的一些内容。 github html2pdf 上的 post 也有所帮助。

我将其 post 放在这里,因为 none 示例对我有用,我花了两天时间才找到对我和我的安葬有用的东西。希望它能帮助别人。

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();