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

问题描述 投票:0回答:2

我试图通过电子邮件发送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);
});

PNG尝试:PHP。

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

EDIT:为了更新我的问题,我做了答案中的建议,并尝试调试它,但没有任何帮助。我做了PHP file_put_contents(),并用控制台日志编译,结果是同样的数据。

有其他建议吗?

javascript php phpmailer html2canvas html2pdf
2个回答
0
投票

我的猜测是问题发生在传输过程中,因为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.netmanualenfunction.file-put-contents.php),看看是否会产生一个有效的文件。如果是,那么问题就发生在发送电子邮件的过程中。

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


0
投票

在几乎放弃之后,终于把它弄好了。其结合了这里链接和建议的一些东西。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( '[email protected]', 'website' );
            $mail->addAddress( '[email protected]', '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();
© www.soinside.com 2019 - 2024. All rights reserved.