发送带有图表的报告邮件

Ann*_*lee 3 php email charts

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

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

$message .= <<<HTML
    </td>
</tr>
</tbody>
</table>
HTML;
Run Code Online (Sandbox Code Playgroud)

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

$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;
Run Code Online (Sandbox Code Playgroud)

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

我的首选方法是使用google charts library,但是,它不支持 php 并且完全基于 JavaScript。

因此,我的问题是:

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

如果你能提供一个例子,我很感激!

提前谢谢!

ty.*_*ty. 5

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

您的选择包括:

  • 使用getImageURI生成图表的 PNG 并将其发送到您的服务器以通过电子邮件发送。如果您知道客户会在需要通过电子邮件发送之前加载每个图表,这可能是最好的解决方案。
  • 使用wkhtmltoimage 之类的工具“无头”渲染显示图表的网页并将其另存为图像。
  • 使用像QuickChart这样的图表图像渲染 Web 服务来生成图表图像(仅供参考:这是我开始的一个开源项目)。

特别是 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    
    }
  }
}";
Run Code Online (Sandbox Code Playgroud)

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

然后将此字符串编码为 URL:

$chartUrl = 'https://quickchart.io/chart?c=' . urlencode($chartConfig);
Run Code Online (Sandbox Code Playgroud)

此 URL 返回一个如下所示的图表: 用 PHP 呈现的 Chart.js 图表

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

$message .= "<img src=\"$chartUrl\"/>";
Run Code Online (Sandbox Code Playgroud)