php - 发送带有图表的报告邮件

标签 php email charts

我要问的问题是从代码架构的角度来看的。我正在用 php 准备一份报告,该报告是用字符串 $message 构建的然后通过 php mail 发送功能。

例如,报告是在这样的 php 文件中构建的(基本上连接字符串):

$message .= <<<HTML
    </td>
</tr>
</tbody>
</table>
HTML;

此外,我想附上一张图表。但是,尝试以下示例并按邮件发送它时,我没有得到任何图表和一个空的 <div style="width:900px;min-height:500px"></div> ==$0值(value)。

$message.=<<<HTML
        <tr valign="top" align="center">
              <script type="text/javascript">
                google.charts.load("current", {packages:['corechart']});
                google.charts.setOnLoadCallback(drawChart);
                function drawChart() {

                  var data = google.visualization.arrayToDataTable([
                    ['Element', 'Density', { role: 'style' }],
                    ['Copper', 8.94, '#b87333', ],
                    ['Silver', 10.49, 'silver'],
                    ['Gold', 19.30, 'gold'],
                    ['Platinum', 21.45, 'color: #e5e4e2' ]
                  ]);

                  var options = {
                    title: "Density of Precious Metals, in g/cm^3",
                    bar: {groupWidth: '95%'},
                    legend: 'none',
                  };

                  var chart_div = document.getElementById('chart_div');
                  var chart = new google.visualization.ColumnChart(chart_div);

                  // Wait for the chart to finish drawing before calling the getImageURI() method.
                  google.visualization.events.addListener(chart, 'ready', function () {
                    chart_div.innerHTML = '<img src="' + chart.getImageURI() + '">';
                    console.log(chart_div.innerHTML);
                  });

                  chart.draw(data, options);

              }
              </script>
              <div id='chart_div'></div>
        </tr>
HTML;

我的猜测是 f.ex 不接受 javascript。电子邮件。因此,我试图预先创建一个 png,然后将其包含在报告中。

我的首选方式是 google charts library ,但是,它不支持 php,完全基于 JavaScript。

因此,我的问题是:

  1. 如何在我的代码中使用 google 图表库?
  2. 如果上述方法不起作用,还有其他建议吗?

如果你能提供一个例子,我将不胜感激!

提前致谢!

最佳答案

电子邮件客户端去除了 Javascript、SVG 和其他格式,因此您不能直接在电子邮件中使用图表库。

您的选择包括:

  • 使用getImageURI生成图表的 PNG 并将其发送到服务器以通过电子邮件发送。如果您知道客户会在需要通过电子邮件发送图表之前加载每个图表,这可能是最佳解决方案。
  • 使用类似 wkhtmltoimage 的工具“ headless 地”呈现一个显示图表的网页并将其另存为图像。
  • 使用类似 QuickChart 的图表图像呈现网络服务生成图表图像(仅供引用:这是我启动的一个开源项目)。

QuickChart 特别是建立在 Chart.js 之上的,因此您必须将 Chart.js 图表定义创建为字符串:

$chartConfig = "{
  type: 'bar',
  data: {
    labels: ['Copper', 'Silver', 'Gold', 'Platinum'],
    datasets: [{
      data: [8.94, 10.49, 19.30, 21.45],
      backgroundColor: ['#b87333', 'silver', 'gold', '#e5e4e2'],
    }]
  },
  options: {
    title: {
      display: true,
      text: 'Density of Precious Metals, in g/cm^3',
    },
    legend: {
      display: false    
    }
  }
}";

我使用静态字符串来匹配您的示例,但您可以像在任何其他 PHP 字符串中一样包含动态变量。

然后将这个字符串编码成一个URL:

$chartUrl = 'https://quickchart.io/chart?c=' . urlencode($chartConfig);

此 URL 返回如下所示的图表: Chart.js chart rendered in PHP

最后,将图表作为 HTML 图像标签添加到您的电子邮件正文中:

$message .= "<img src=\"$chartUrl\"/>";

关于php - 发送带有图表的报告邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38577556/

相关文章:

php - 代码点火器 | .htaccess 从 url 中删除 index.php

javascript - 至少 1000000 div 的大网格

php电子邮件脚本不发送电子邮件

javascript - 如何从 ajax 数据绘制 highstock 单线系列图

c# - .NET 饼图 : how to add text to slices and rotate chart

php - mysql 表字段 - 资源 ID #7

php - `while (true)` 与 `while (\true)` 有什么区别?

c# - 如何在 C# 中发送多部分 MIME 消息?

wordpress - 如何在wp_mail 函数中的消息部分显示图像?

r - R中没有标题/标签的图