Отправить изображение html2pdf pdf или html2canvas по электронной почте

У меня две страницы PHP. Первая - это форма, в которой пользователь вводит данные, при отправке вторая страница создается с помощью div, который выставляет счет. На этой странице есть опции для сохранения этого счета в формате PDF или IMG. Эту страницу он также автоматически отправляет по электронной почте с подтверждением.

Я хотел бы отправить в этом электронном письме также PDF-файл или изображение в виде вложения.

html2canvas.js .png:

function picDiv() { 
html2canvas($('#printableArea')[0], {
  width: 1200
}).then(function(canvas) {
  var a = document.createElement('a');
  a.href = canvas.toDataURL("image/png");
  a.download = 'nalog.png';
  a.click();
});
};

И html2pdf.js для создания pdf:

function pdfDiv() { 
var element = document.getElementById('printableArea');
var opt = { 
    filename:     'nalog.pdf'
};
html2pdf().set(opt).from(element).save();
};

Я прочитал, среди прочего, Отправить изображение на сервер, используя тип ввода файла, html2canvas и jsPDF: отправить сгенерированный PDF-файл как вложение электронной почты < / а>. Также за пределами таких статей: Отправить холст HTML5 как изображение на Сервер и html2pdf сообщение на github. В этом последнем сообщении github html2pdf говорится, что следующий код можно отправить по электронной почте или на сервер, но я не знаю, как отправить его по электронной почте. Он успешно преобразует PDF в строку.

    html2pdf().from(element).toPdf().output('datauristring').then(function (pdfAsString) {
//send via email.
        });

Моя отправка электронной почты php:

$user = "some email";
$usersubject = "Initium - Vaš online radni nalog";
$userheaders = "From: some email";
$usermessage = "

//some content with php variables and text.

";    
mail($user,$usersubject,$usermessage,$userheaders);

Я был бы рад, если бы кто-нибудь объяснил, как отправить PDF ИЛИ ИЗОБРАЖЕНИЕ с помощью этого кода, который у меня уже есть. Имейте в виду, что все это находится на одной странице, и это нужно делать при той же загрузке страницы.

Я перепробовал множество вещей и способов сделать это и заблудился, так как это новая территория для меня. Любая помощь приветствуется.

РЕДАКТИРОВАТЬ:

Полное рабочее решение находится здесь: https://stackoverflow.com/a/61418366/7158959


person ikiK    schedule 24.04.2020    source источник


Ответы (2)


Хорошо, я предполагаю, что вам понадобятся оба шага:

Шаг 1. Отправьте содержимое файла из внешнего интерфейса на сервер. Используйте в своем JavaScript следующее сразу после того, как вы получите содержимое файла в виде строки (скажем, переменную с именем «pdfcontent»):

    var x = new XMLHttpRequest();
    var url = "<your domain>/mail.php";
    x.open("POST", url, true);
    x.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    x.send("data="+pdfcontent);

Не нужно помещать это в какой-либо элемент HTML или что-то еще - просто выполните его сразу после pdfDiv или какой-либо другой функции, создающей содержимое файла. Конечно, это всего лишь скелет кода - настоящая программа должна включать в себя проверку ошибок, защиту от различных атак и т. Д., Но это совсем другая история. Также возможно, что вам нужно будет отформатировать pdfcontent, чтобы его можно было использовать как параметр URI, подобный этому.

Шаг 2: Теперь ваш сценарий "mail.php" (или как вы его называете - сценарий с командой "mail") получил содержимое файла в строке $ _POST ['data']. Или, возможно, у вас уже есть содержимое файла (PDF или что-то еще) в виде двоичной строки на стороне сервера (ваш вопрос об этом не ясен). В любом случае, вам просто нужно прикрепить его к письму и отправить. Бинарные вложения действительно являются проблемой, поэтому я предлагаю загрузить и установить PHPMailer (https://github.com/PHPMailer/PHPMailer) - он довольно удобный, простой в установке и использовании. После его установки используйте в сценарии PHP вместо команды «mail» следующее:

    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;
    require_once "PHPMailer/src/Exception.php";  // directory may be different on your server
    require_once "PHPMailer/src/PHPMailer.php";  // directory may be different on your server

    $mail = new PHPMailer;
    $mail->addAddress(...);   // specify "To" address
    $mail->setFrom(...);   // specify "From" address
    $mail->Subject = ...;   // specify subject line
    $mail->Body    = ...;   // specify email content
    $mail->addStringAttachment(<binary string with file content>, "nalog.pdf");
    $mail->send();

Отправка электронных писем - это нечто большее, чем это, если вы хотите убедиться, что ваша электронная почта доходит до места назначения и не застревает в папке для спама или что-то в этом роде, но это совсем другая история. Кроме того, если вы получаете эти данные через $ _POST, вы должны проверить их должным образом, иначе это просто бомба замедленного действия. Вы также должны убедиться, что ваш скрипт нельзя использовать напрямую, иначе кто-либо может рассылать спам от вашего имени, и у вас будут проблемы. хотя я не уверен, как защититься от такой атаки при такой настройке. Возможно, вам придется переосмыслить всю свою архитектуру и генерировать содержимое файла только на сервере и вообще не использовать AJAX для этой цели - слишком опасно.

person Dimitry Rotstein    schedule 24.04.2020
comment
Очень хорошо напишите, я очень ценю это. Мы кое-что знаем, это очень помогает. Мне удалось все установить, и POST выполняется, и почта отправляется, просто мои приложения не распознают контент. Я не могу открывать PDF-файлы, они не пустые, но имеют размер. И в журнале консоли я вижу, что pdfAsString заполнен. Также пробовал с изображением, и я могу войти в журнал: data: image / png; base64, iVBORw0KGgo .... И изменил файл в почтовом коде на .png, но то же самое, не могу его открыть. - person ikiK; 24.04.2020
comment
Также спасибо за советы и рекомендации, и я буду работать над своей безопасностью и менять вещи, только шаг за шагом :), приложение старое неделю и находится в стадии разработки. Однако нужно это срочно ... - person ikiK; 24.04.2020
comment
Похоже, что контент где-то повредился. Попытайтесь измерить размер этого контента в байтах на каждом шаге - я предполагаю, что в какой-то момент он будет усечен. Если вы действительно используете AJAX, вам необходимо убедиться, что pdfcontent не содержит запрещенных или специальных символов (вероятно, это так). & и = имеют особое значение в URI, поэтому вы должны заменить их на% 26 и% 3D соответственно перед использованием переменной pdfcontent, например: pdfcontent = pdfcontent.replace (/ & /,% 26) .replace (/ = /, % 3D); - person Dimitry Rotstein; 24.04.2020
comment
В любом случае, я рад, что смог помочь. Если вы действительно нашли мой ответ полезным, подумайте о том, чтобы проголосовать за него :-) - person Dimitry Rotstein; 24.04.2020
comment
О да, я собирался;) да, я вижу, что это проблема сама по себе, см. Несколько сообщений здесь, чтобы прочитать об этом, надеюсь, я заставлю меня работать. Теперь я знаю, что это должно сработать благодаря тебе. Спасибо за уделенное время! - person ikiK; 24.04.2020
comment
У меня ничего не работает :( stackoverflow.com/questions/61401519 / Если у вас есть идеи, задайте здесь новый вопрос ... - person ikiK; 24.04.2020

Если у вас уже есть строка на стороне клиента, то самый простой способ - использовать AJAX для ее отправки на сервер. Вы можете просто создать объект XMLHttpRequest напрямую (найдите его, это довольно просто), или, возможно, JQuery (который вы, по-видимому, используете) имеет еще более простой способ, не уверен, не использовал его годами. В любом случае, с помощью AJAX вы просто отправляете содержимое файла в виде строки в тот PHP-скрипт, который имеет команду mail, и это должно быть. Подскажите, нужен ли вам подробный пример кода.

person Dimitry Rotstein    schedule 24.04.2020
comment
Спасибо за повтор, я был бы признателен за пару ссылок с примерами. Или даже подробный пример кода, я читал о нем в течение последних 24 часов, и я потерял, как связать все это, что у меня есть. У меня есть строка yes, но она создается на той же странице, что и мой почтовый код PHP, показанный выше. Как я могу прикрепить это к тому же почтовому коду. Все, что я нахожу, - это огромные почтовые скрипты PHP для отправки вложений, но я не знаю, как привязать к нему свою строку. Как я сказал, я потерялся. И я не знаю, как поможет Ajax, так как я уже отправляю почту через php. - person ikiK; 24.04.2020
comment
Я вижу, как отправить это через XMLHttpRequest, поэтому мне нужно отправить его в скрытое поле ввода html и прикрепить к электронной почте как обычную переменную php? Почему-то я уверен, что это не сработает; ( - person ikiK; 24.04.2020