Отправьте html2pdf pdf или html2canvas изображение на электронную почту - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть две 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 post . В этом последнем html2pdf сообщении о github говорится, что следующий код можно отправить на электронную почту или на сервер, но я не знаю, как его отправить. Он успешно преобразует 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 ИЛИ ИЗОБРАЖЕНИЕ через этот код У меня уже есть. Имейте в виду, что это все на одной странице, и это должно быть сделано на этой же странице загрузки.

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

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

Полное рабочее решение здесь: { ссылка }

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

ОК, поэтому я предполагаю, что вам нужны оба шага:

Шаг 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 или любой другой функции, создающей содержимое файла. Конечно, это всего лишь скелетный код - настоящая программа должна включать проверку ошибок, защиту от различных атак и т. Д. c, но это совсем другая история. Также возможно, что вам нужно будет отформатировать 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 для этой цели - слишком опасно.

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

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

...