【问题标题】:Send html2pdf pdf or html2canvas image to email将 html2pdf pdf 或 html2canvas 图像发送到电子邮件
【发布时间】:2020-04-25 22:29:05
【问题描述】:

我有两个 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();
};

我已经阅读了Send Image to server using File input typehtml2canvas and jsPDF : send generated pdf as email attachment 等内容。还有这样的文章:Send HTML5 Canvas as Image to Serverhtml2pdf 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 或图像,我会很高兴。 请记住,这一切都在同一页面上,并且需要在同一页面加载时完成。

我尝试了很多事情和方法,但迷失了方向,因为这对我来说是新的领域。任何帮助表示赞赏。

编辑:

完整的工作解决方案在这里:https://stackoverflow.com/a/61418366/7158959

【问题讨论】:

    标签: javascript php html2canvas html2pdf


    【解决方案1】:

    好的,所以我猜你需要这两个步骤:

    第 1 步:将文件内容从前端发送到服务器。 在您将文件内容作为字符串(例如,一个名为“pdfcontent”的变量)之后,在您的 JavaScript 中使用以下内容:

        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 - 太危险了。

    【讨论】:

    • 写得很好,非常感谢。我们正在做一些事情,这非常有帮助。我已经设法安装了所有东西,并且发出了 POST 并且正在发送邮件,只是我的应用程序无法识别内容。我无法打开 PDF,它们不是空的,它们有大小。在控制台日志中,我可以看到 pdfAsString 已填充。也尝试使用图像,我可以在日志中找到:data:image/png;base64,iVBORw0KGgo.... 并将邮件代码中的文件更改为 .png 但同样的东西,无法打开它。
    • 也感谢您的提示和指导,我将致力于我的安全性并改变一些事情,当时只需一步:),该应用程序已经旧了一周并且正在制作中。但是需要这个紧急...
    • 听起来内容在途中的某个地方被损坏了。尝试在每个步骤中以字节为单位测量此内容的大小 - 我猜它在某些时候会被截断。如果您确实在使用 AJAX,那么您需要确保“pdfcontent”不包含任何非法或特殊字符(它可能包含)。 "&" 和 "=" 在 URI 中具有特殊含义,因此在使用 'pdfcontent' 变量之前应分别将它们替换为 "%26" 和 "%3D",例如:pdfcontent = pdfcontent.replace(/&/,"% 26").replace(/=/,"%3D");
    • 无论如何,很高兴我能帮上忙。如果你真的觉得我的回答很有用,请考虑点赞:-)
    • 哦,是的,我本来打算这样做的;)是的,我知道这是其自身的问题,请参阅此处的一些帖子以了解它,希望我能开始工作。现在我知道它应该可以工作,多亏了你。感谢您的宝贵时间!
    【解决方案2】:

    如果您在客户端已经有一个字符串,那么最简单的方法是使用 AJAX 将它发送到服务器。 您可以直接创建 XMLHttpRequest 对象(查找它,它非常简单),或者 JQuery(您显然正在使用)有一个更简单的方法,不确定,多年来没有使用它。 无论如何,使用 AJAX,您只需将文件内容作为字符串发送到具有“邮件”命令的 PHP 脚本,就应该这样。 如果您需要详细的代码示例,请告诉我。

    【讨论】:

    • 感谢您的重播,我将不胜感激一两个链接示例。甚至是详细的代码示例,我在过去 24 小时内阅读了他的相关信息,但我失去了如何连接我所拥有的所有这些。我有一个字符串 yes,但它是在与上面显示的 PHP 邮件代码相同的页面上生成的。我如何将其附加到相同的邮件代码中。我所发现的只是用于发送附件的巨大 PHP 邮件脚本,但我不知道如何将我的字符串添加到它。就像我说我迷路了。而且我不知道 Ajax 将如何提供帮助,因为我已经通过 php 发送邮件。
    • 我知道如何通过 XMLHttpRequest 发送它,所以我需要将它发送到隐藏的 html 输入字段并将其作为常规 php 变量附加到电子邮件?不知何故,我确定这不会起作用;(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 2018-06-20
    • 2016-07-23
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多