Отправка скриншота элемента div по электронной почте

Вопрос или проблема

Сначала извиняюсь за любые опечатки и тому подобное, так как я имею нарушения зрения.

У меня есть страница, которая позволяет пользователю создать диаграмму с помощью ползунков. Идея состоит в том, что они затем могут скачать диаграмму в виде изображения PNG или отправить по электронной почте себе.

Мне удалось сделать, чтобы опция загрузки работала, как показано в коде ниже (извиняюсь за его состояние, так как это еще в процессе разработки).

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу отправить это по электронной почте. Я пробовал использовать html-опцию mailto в качестве временного решения, но это не сработало, а также использую плагин (в настоящее время Forminator), который, к сожалению, не взаимодействует с кодом.

Я довольно новичок в этом, обычно занимаюсь только CSS, поэтому это вызывает небольшую головную боль.

<div class="sliders">
    <div class="slidecontainer">
        <div class="slideLabel">Конец бедности</div>
        <div><input type="range" min="0" max="100" value="1" class="slider light" id="slider1" style="width:75%"></div>
    </div>
    <div class="slidecontainer" <div="">Образование</div>
        <div><input type="range" min="0" max="100" value="1" class="slider light" id="slider2" style="width:75%"></div>
    <div class="slidecontainer">
        <div class="slideLabel">Здоровье</div>
        <div><input type="range" min="0" max="100" value="1" class="slider light" id="slider3" style="width:75%"></div>
    </div>
    <div class="slidecontainer">
        <div class="slideLabel">Гуманность и сообщества</div>
        <div><input type="range" min="0" max="100" value="1" class="slider light" id="slider4" style="width:75%"></div>
    </div>
    <div class="slidecontainer">
        <div class="slideLabel">Искусство, культура, наследие, наука</div>
        <div><input type="range" min="0" max="100" value="1" class="slider light" id="slider5" style="width:75%"></div>
    </div>
    <div class="slidecontainer">
        <div class="slideLabel">Любительский спорт</div>
        <div><input type="range" min="0" max="100" value="1" class="slider light" id="slider6" style="width:75%"></div>
    </div>
    <div class="slidecontainer">
        <div class="slideLabel">Конец смертельного конфликта</div>
        <div><input type="range" min="0" max="100" value="1" class="slider light" id="slider7" style="width:75%"></div>
    </div>
    <div class="slidecontainer">
        <div class="slideLabel">Забота об окружающей среде</div>
        <div><input type="range" min="0" max="100" value="1" class="slider light" id="slider8" style="width:75%"></div>
    </div>
    <div class="slidecontainer">
        <div class="slideLabel">Старшие/Молодежь, Инвалиды, Затруднения</div>
        <div><input type="range" min="0" max="100" value="1" class="slider dark" id="slider9" style="width:75%"></div>
    </div>
    <div class="slidecontainer">
        <div class="slideLabel">Вооруженные силы, службы экстренной помощи</div>
        <div><input type="range" min="0" max="100" value="1" class="slider dark" id="slider10" style="width:75%"></div>
    </div>
    <div class="slidecontainer">
        <div class="slideLabel">Благополучие животных</div>
        <div><input type="range" min="0" max="100" value="1" class="slider light" id="slider11" style="width:75%"></div>
    </div>
    <div class="slidecontainer">
        <div class="slideLabel">Религия</div>
        <div><input type="range" min="0" max="100" value="1" class="slider light" id="slider12" style="width:75%"></div>
    </div>      
    </div>
    
            <div id="piechart"></div>
            <div id="chart_img"></div>
    <!-- Вкладки -->
    <div class="tab" style="display:none">
      <button class="tablinks" onclick="openChart(event, 'Pie')">Круговая</button>
      <button class="tablinks" onclick="openChart(event, 'Bar')">Столбчатая</button>
    </div>
    <!-- Содержимое вкладок -->
    <div id="Pie" class="tabcontent active">
        <div id="piechartxxx"></div>
    </div>
    <div id="Bar" class="tabcontent">
        <div id="barchart"></div>
    </div>  

И javascript:

$(document).ready(function() {
    $(".slider").change(function () {
        drawChart();
    });

    // Загрузка google charts
    google.charts.load('current', {'packages':['corechart']});
    google.charts.setOnLoadCallback(drawChart);

    // Нарисуйте диаграмму и установите значения диаграммы
    function drawChart() {        
        var dataChart = new google.visualization.DataTable();
        dataChart.addColumn('string', 'Мера'); // Имплицитный столбец меток домена.
        dataChart.addColumn('number', 'Оценка'); // Имплицитный столбец данных серии 1.
        dataChart.addRows([

        ['Предотвращение или устранение бедности',parseInt($("#slider1").val())],
        ['Образование',parseInt($("#slider2").val())],
        ['Здоровье и спасение жизней',parseInt($("#slider3").val())],
        ['Гражданство, развитие сообщества',parseInt($("#slider4").val())],
        ['Искусство, культура, наследие, наука',parseInt($("#slider5").val())],
        ['Любительский спорт',parseInt($("#slider6").val())],
        ['Права человека, урегулирование конфликтов, религиозная или расовая гармония, равенство, разнообразие',parseInt($("#slider7").val())],
        ['Охрана окружающей среды или её улучшение',parseInt($("#slider8").val())],
        ['Помощь нуждающимся: молодость, возраст, плохое здоровье, инвалидность, финансовые трудности',parseInt($("#slider9").val())],
        ['Вооруженные силы, полиция, скорая помощь, пожарные и спасательные службы',parseInt($("#slider10").val())],
        ['Благополучие животных',parseInt($("#slider11").val())],
        ['Религия',parseInt($("#slider12").val())]
    ]);    

      // Опционально; добавьте заголовок и установите ширину и высоту диаграммы
      var pieOptions = {'title':'Ваши приоритетные предпочтения', 'width':900, 'height':700,
                        colors: ['#FFFF00','#FF86C1','#C71585','#0000FF','#800080','#EE82EE','#FF0000','#7FFF00','#FFDAB9','#EEE8AA','#DDA0DD','#FFA500']};

      // Отобразите диаграмму внутри элемента <div> с id="piechart"
      var my_img = document.getElementById('chart_img');
      var my_chart = new google.visualization.PieChart(document.getElementById('piechart'));      

      google.visualization.events.addListener(my_chart, 'ready', function () {
        my_img.innerHTML = '<a href="' + my_chart.getImageURI() +
            '" Title="Скачать круговую диаграмму" download="MyPieChart.png">Скачать диаграмму</a>';
      });

      var barOptions = {
        height: 1000,
        colors: ['red', 'green'],
        title: 'Насколько Вы заботитесь',
        chartArea: {width: '80%'},
        hAxis: {
          title: 'Процент 100',
          minValue: 0,
          maxValue: 100
        },
        vAxis: {
          title: 'Тема'
        }
      };

      var barChart = new google.visualization.BarChart(document.getElementById('barchart'));
      my_chart.draw(dataChart, pieOptions);
      barChart.draw(dataChart, barOptions);
    }
});

function openChart(evt, chartName) {
  var i, tabcontent, tablinks;
  tabcontent = document.getElementsByClassName("tabcontent");
  for (i = 0; i < tabcontent.length; i++) {
    tabcontent[i].style.display = "none";
  }
  tablinks = document.getElementsByClassName("tablinks");
  for (i = 0; i < tablinks.length; i++) {
    tablinks[i].className = tablinks[i].className.replace(" active", " active");
  }
  document.getElementById(chartName).style.display = "block";
  evt.currentTarget.className += " active";
}

Ответ или решение

Отправка скриншота div элемента по электронной почте — это распространенная задача, с которой часто сталкиваются разработчики веб-приложений. Давайте рассмотрим, как можно решить эту задачу, используя технологии, которые могут быть интегрированы в ваш проект.

Теория

Чтобы отправить скриншот div элемента по электронной почте, необходимо выполнить несколько ключевых шагов:

  1. Создание изображения из div элемента: первоочередная задача — преобразовать содержимое div элемента в изображение. Это можно сделать с помощью библиотек JavaScript, например, html2canvas или dom-to-image. Эти библиотеки позволяют визуализировать HTML содержимое в виде изображений, а затем извлечь данные изображения.

  2. Отправка изображения по электронной почте: после создания изображения его необходимо отправить по электронной почте. Для отправки почты может использоваться серверная технология, например, Node.js, PHP или Python. В большинстве случаев надо использовать SMTP сервер или сервисы, такие как SendGrid, Mailgun или другие, для отправки писем.

Пример

Рассмотрим пример, как можно реализовать данную функциональность на клиентской и серверной стороне.

Шаг 1: Генерация изображения из div элемента

Вы можете использовать библиотеку html2canvas для создания изображения. Вот как это можно сделать:

<!-- HTML -->
<button id="capture">Создать изображение и отправить по почте</button>
// JavaScript
document.getElementById('capture').addEventListener('click', function() {
    html2canvas(document.querySelector("#chart")).then(canvas => {
        var imgData = canvas.toDataURL('image/png');
        // Теперь вам нужно отправить это изображение на сервер
        sendEmailWithImage(imgData);
    });
});

Шаг 2: Отправка изображения по электронной почте

На серверной стороне вам нужен скрипт, который будет принимать ваш запрос и отправлять изображение по почте. Приведем пример с использованием Node.js и библиотеки nodemailer для отправки изображений по электронной почте:

// Серверная часть на Node.js
const nodemailer = require('nodemailer');
const express = require('express');
const bodyParser = require('body-parser');

const app = express();
app.use(bodyParser.json({limit: '10mb'}));

app.post('/send-email', (req, res) => {
    let imgData = req.body.img;
    let email = req.body.email;

    // Настройки вашего почтового сервиса
    let transporter = nodemailer.createTransport({
        service: 'gmail',
        auth: {
            user: 'your-email@gmail.com',
            pass: 'your-email-password'
        }
    });

    let mailOptions = {
        from: 'your-email@gmail.com',
        to: email,
        subject: 'Скриншот диаграммы',
        html: '<h1>Ваша диаграмма</h1><img src="' + imgData + '"/>'
    };

    transporter.sendMail(mailOptions, function(error, info){
        if (error) {
            res.status(500).send('Error while sending mail: ' + error);
        } else {
            res.status(200).send('Email sent: ' + info.response);
        }
    });
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});

Шаг 3: Связывание клиентского и серверного кода

Обратимся к клиентскому JavaScript коду для отправки изображения на сервер:

function sendEmailWithImage(imgData) {
    fetch('/send-email', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({
            img: imgData,
            email: 'recipient@example.com'
        })
    }).then(response => {
        if (response.ok) {
            alert('Email отправлено успешно!');
        } else {
            alert('Ошибка при отправке email.');
        }
    });
}

Применение

Использование библиотеки html2canvas позволяет создавать скриншоты любых HTML элементов в формате изображения. Вы можете использовать полученные изображения в различных приложениях: для создания отчетов, препроцессинга графических данных, усиления визуальной составляющей веб-документов или просто для предоставления пользователям возможности сохранять визуализированные данные.

Особого внимания требует аспект безопасности при отправке данных, связанных с использованием пользовательских учетных данных почтовых серверов. Рекомендуется применять проверенные механизмы аутентификации и защищенные соединения.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...