Отправка данных PDF по электронной почте с использованием PHPMailer и html2pdf - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь отправить 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 () и сопоставил его с консольным журналом, и это те же данные.

Есть другие предложения?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

После того, как почти сдался, наконец-то получил его на работу. Это сочетание нескольких вещей, связанных здесь и предложенных. Этот пост на 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();
0 голосов
/ 24 апреля 2020

Я предполагаю, что проблема возникает во время передачи, поскольку 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/), чтобы создать файл PDF с нуля, используя PHP, и сразу же отправить его по электронной почте. Да, это удваивает ваши усилия по выводу, так как вам нужно производить HTML и PDF отдельно, но в конечном итоге это того стоит. Или, возможно, вам вообще не нужно производить HTML в этой настройке? Вы производите HTML с единственной целью - отправить его по электронной почте или вам действительно нужно представить его пользователю?

...