html2canvas и jsPDF: отправить сгенерированный PDF-файл как вложение электронной почты

Я создал функцию для создания снимка экрана текущей веб-страницы и сохранения ее в формате PDF с помощью html2canvas и jsPDF. Вот мой код для этого:

<script>
 function downloadpdf(){
    html2canvas(document.body,
        {
            onrendered: function(canvas){
                var imgData = canvas.toDataURL("image/jpeg");
                var a = document.createElement('a');
                var doc = new jsPDF('p','mm');
                doc.addImage(imgData, 'JPEG', 15, 40, 180, 160);
                doc.save($.now()+'.pdf');

        }
    });
}
</script>

Используя приведенный выше код, я могу загрузить файл и сохранить его локально. Но я хочу напрямую отправить сгенерированный PDF-файл по электронной почте с помощью скрипта php.

Ниже приведен код для публикации изображения в скрипте php, куда оно будет отправлено по электронной почте:

var imgData = canvas.toDataURL("image/jpeg");
                $.post("sendimage.php", 
                {
                    data: imgData
                }, function (response,status) {
                    console.log(response);
                });

Но как разместить сгенерированный pdf в параметре data?

Пожалуйста, порекомендуйте любое решение для этого.


person Liz.    schedule 30.11.2015    source источник


Ответы (1)


Пожалуйста, проверьте код PHP -

function MailWithAttachment($to, $subject, $message, $senderMail, $senderName, $files){

    $from = $senderName." <".$senderMail.">"; 
    $headers = "From: $from";

    // boundary 
    $semi_rand = md5(time()); 
    $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; 

    // headers for attachment 
    $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\""; 

    // multipart boundary 
    $message = "--{$mime_boundary}\n" . "Content-Type: text/html; charset=\"UTF-8\"\n" .
    "Content-Transfer-Encoding: 7bit\n\n" . $message . "\n\n"; 

    // preparing attachments
    if(count($files) > 0){
        for($i=0;$i<count($files);$i++){
            if(is_file($files[$i])){
                $message .= "--{$mime_boundary}\n";
                $fp =    @fopen($files[$i],"rb");
                $data =  @fread($fp,filesize($files[$i]));
                @fclose($fp);
                $data = chunk_split(base64_encode($data));
                $message .= "Content-Type: application/octet-stream; name=\"".basename($files[$i])."\"\n" . 
                "Content-Description: ".basename($files[$i])."\n" .
                "Content-Disposition: attachment;\n" . " filename=\"".basename($files[$i])."\"; size=".filesize($files[$i]).";\n" . 
                "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
            }
        }
    }
    $message .= "--{$mime_boundary}--";
    $returnpath = "-f" . $senderMail;

    //send email
    $mail = @mail($to, $subject, $message, $headers, $returnpath); 

    //function return true, if email sent, otherwise return fasle
    if($mail){ return TRUE; } else { return FALSE; }
}


if(!empty($_POST['data'])){

    //email variables
    $to = '[email protected]';
    $from = '[email protected]';
    $from_name = 'PDF FIle';

    //attachment files path array
    $file = base64_decode($_POST['data']);

    $subject = 'PHP Email with attachment'; 
    $html_content = '<h1>PHP Email with attachment</h1>';

    //call MailWithAttachment() function and pass the required arguments
    $send_email = MailWithAttachment($to,$subject,$html_content,$from,$from_name,$file);

    //print message after email sent
    echo $send_email?"<h1> Mail Sent</h1>":"<h1> Mail not SEND</h1>";

} else {
    echo "No Data Found";
} 

Надеюсь, у вас это сработает :)

person Joomler    schedule 30.11.2015
comment
Спасибо Спасибо спасибо! :) Это сработало для меня отлично. Но мне нужно было немного изменить мою функцию: var doc = new jsPDF('p','mm'); doc.addImage(imgData, 'JPEG', 15, 40, 180, 160); var pdf = btoa(doc.output()); $.post("sendmail.php", { data: pdf }, function (response,status) { console.log(response); }); - person Liz.; 30.11.2015