使用 PHPMailer 和 html2pdf 通过电子邮件发送 PDF 数据
Sending PDF data via email using PHPMailer and html2pdf
我正在尝试通过电子邮件发送 PDF 或 PNG,但似乎没有任何效果。下面是我的最后一次尝试,我已经阅读了这里关于 SO 的每一篇文章,但没有看到任何建议的工作,有人可以帮忙吗?
我正在使用 PHPMailer、html2pdf 和 html2canvas,它们都可以在点击时生成正确的文档,只是将它们发送到 php 邮件程序是行不通的。
我收到无法打开的文件...以下是我最后的尝试...
使用 file_get_contents 方法我得到 0 大小的数据。
PDF 尝试:
var element = document.getElementById('printableArea');
// var opt = {
// filename: 'nalog.pdf'
// };
html2pdf().from(element).toPdf().output('datauristring').then(function (pdfAsString) {
pdfcontent = pdfAsString.replace(/&/,"%26").replace(/=/,"%3D");
var x = new XMLHttpRequest();
var url = "xxx/mail.php";
x.open("POST", url, true);
x.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
x.send("data="+pdfcontent);
console.log(pdfcontent);
});
PHP:
$mail->AddStringAttachment($_POST['data'],"nalog.pdf");
PNG 尝试:
html2canvas($('#printableArea')[0], {
width: 1200
}).then(function(canvas) {
var data = canvas.toDataURL("image/png");
pdfcontent = data.replace(/&/,"%26").replace(/=/,"%3D");
var x = new XMLHttpRequest();
var url = "xxx/mail.php";
x.open("POST", url, true);
x.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
x.send("data="+pdfcontent);
console.log(pdfcontent);
});
PHP:
$mail->AddStringAttachment($_POST['data'],"nalog.png");
编辑:
为了更新我的问题,我从 anwser 提出了一些建议并尝试调试它但没有任何帮助。我制作了 PHP file_put_contents() 并将其与控制台日志进行比较,它是相同的数据。
还有其他建议吗?
我的猜测是问题发生在传输过程中,因为 URI 不能很好地处理二进制数据 - 可能有 NUL 字符,谁知道那里还有什么,t运行cate 或 mess-上数据。
尝试像这样发送此数据(作为原始文本,而不是 URL 编码的文本):
var x = new XMLHttpRequest();
x.open("POST", "xxx/mail.php", true);
x.setRequestHeader("Content-type", "text/plain; charset=utf-8");
x.send( new Uint8Array(pdfcontent) );
然后,在服务器端,您需要像这样提取原始数据:
$data = file_get_contents('php://input');
使用 $_POST 无效,它应该是空的。
如果仍然生成错误文件,则问题可能不在传输中。
尝试将 console.log 打印出来的任何内容复制并粘贴到一个文件中,看看它是否可以打开(即使数据有效,它也可能无法工作,因为我们使用的是二进制数据,但如果它确实有效,那就太好了- 至少我们可以从源头上排除问题)。
然后尝试使用 file-put-contents (https://www.php.net/manual/en/function.file-put-contents.php) 在服务器端保存数据,并查看是否生成有效文件。如果是,则在发送电子邮件时出现问题。
无论如何,你真的应该在服务器端生成文件——所有这些来回都是非常低效和非常不安全的。例如,您可以使用 FPDF (http://www.fpdf.org/) 使用 PHP 从头开始创建一个 PDF 文件并直接通过电子邮件发送。是的,它会使您的输出工作加倍,因为您需要分别生成 HTML 和 PDF,但在 运行 长的时间里这是非常值得的。或者也许您根本不需要在此设置中生成 HTML?您制作 HTML 的唯一目的是通过电子邮件发送,还是您真的需要将其呈现给用户?
在几乎要放弃之后,终于开始工作了。它结合了此处链接和建议的一些内容。
github html2pdf 上的 post 也有所帮助。
我将其 post 放在这里,因为 none 示例对我有用,我花了两天时间才找到对我和我的安葬有用的东西。希望它能帮助别人。
window.onload = function pdfDivload (){
let el = document.getElementById('printableArea');
let opt = {
margin: 1,
filename: 'myfile.pdf',
image: { type: 'jpeg', quality: 0.98 },
html2canvas: { scale: 2 },
jsPDF: { unit: 'in', format: 'A4', orientation: 'portrait' }
};
html2pdf().set( opt ).from( el ).toPdf().output('datauristring').then(function( pdfAsString ) {
let data = {
'fileDataURI': pdfAsString,
};
$.post( "../prog/mail.php", data);
console.log( data );
} );
};
PHP:
if (isset($_POST['fileDataURI'])) {
$pdfdoc = $_POST['fileDataURI'];
$b64file = trim( str_replace( 'data:application/pdf;base64,', '', $pdfdoc ) );
$b64file = str_replace( ' ', '+', $b64file );
$decoded_pdf = base64_decode( $b64file );
//file_put_contents( $attachment, $decoded_pdf );
$mail = new PHPMailer;
$mail->setFrom( 'xxx@xxx.hr', 'website' );
$mail->addAddress( 'xxx@gxxx.com', 'OdedTa' );
$mail->Subject = 'First PHPMailer Message';
$mail->Body = 'Hi! This is my first e-mail sent through PHPMailer.';
$mail->addStringAttachment($decoded_pdf, "nalog.pdf");
$mail->isHTML( true );
$mail->send();
我正在尝试通过电子邮件发送 PDF 或 PNG,但似乎没有任何效果。下面是我的最后一次尝试,我已经阅读了这里关于 SO 的每一篇文章,但没有看到任何建议的工作,有人可以帮忙吗? 我正在使用 PHPMailer、html2pdf 和 html2canvas,它们都可以在点击时生成正确的文档,只是将它们发送到 php 邮件程序是行不通的。 我收到无法打开的文件...以下是我最后的尝试... 使用 file_get_contents 方法我得到 0 大小的数据。
PDF 尝试:
var element = document.getElementById('printableArea');
// var opt = {
// filename: 'nalog.pdf'
// };
html2pdf().from(element).toPdf().output('datauristring').then(function (pdfAsString) {
pdfcontent = pdfAsString.replace(/&/,"%26").replace(/=/,"%3D");
var x = new XMLHttpRequest();
var url = "xxx/mail.php";
x.open("POST", url, true);
x.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
x.send("data="+pdfcontent);
console.log(pdfcontent);
});
PHP:
$mail->AddStringAttachment($_POST['data'],"nalog.pdf");
PNG 尝试:
html2canvas($('#printableArea')[0], {
width: 1200
}).then(function(canvas) {
var data = canvas.toDataURL("image/png");
pdfcontent = data.replace(/&/,"%26").replace(/=/,"%3D");
var x = new XMLHttpRequest();
var url = "xxx/mail.php";
x.open("POST", url, true);
x.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
x.send("data="+pdfcontent);
console.log(pdfcontent);
});
PHP:
$mail->AddStringAttachment($_POST['data'],"nalog.png");
编辑: 为了更新我的问题,我从 anwser 提出了一些建议并尝试调试它但没有任何帮助。我制作了 PHP file_put_contents() 并将其与控制台日志进行比较,它是相同的数据。
还有其他建议吗?
我的猜测是问题发生在传输过程中,因为 URI 不能很好地处理二进制数据 - 可能有 NUL 字符,谁知道那里还有什么,t运行cate 或 mess-上数据。 尝试像这样发送此数据(作为原始文本,而不是 URL 编码的文本):
var x = new XMLHttpRequest();
x.open("POST", "xxx/mail.php", true);
x.setRequestHeader("Content-type", "text/plain; charset=utf-8");
x.send( new Uint8Array(pdfcontent) );
然后,在服务器端,您需要像这样提取原始数据:
$data = file_get_contents('php://input');
使用 $_POST 无效,它应该是空的。
如果仍然生成错误文件,则问题可能不在传输中。 尝试将 console.log 打印出来的任何内容复制并粘贴到一个文件中,看看它是否可以打开(即使数据有效,它也可能无法工作,因为我们使用的是二进制数据,但如果它确实有效,那就太好了- 至少我们可以从源头上排除问题)。 然后尝试使用 file-put-contents (https://www.php.net/manual/en/function.file-put-contents.php) 在服务器端保存数据,并查看是否生成有效文件。如果是,则在发送电子邮件时出现问题。
无论如何,你真的应该在服务器端生成文件——所有这些来回都是非常低效和非常不安全的。例如,您可以使用 FPDF (http://www.fpdf.org/) 使用 PHP 从头开始创建一个 PDF 文件并直接通过电子邮件发送。是的,它会使您的输出工作加倍,因为您需要分别生成 HTML 和 PDF,但在 运行 长的时间里这是非常值得的。或者也许您根本不需要在此设置中生成 HTML?您制作 HTML 的唯一目的是通过电子邮件发送,还是您真的需要将其呈现给用户?
在几乎要放弃之后,终于开始工作了。它结合了此处链接和建议的一些内容。 github html2pdf 上的 post 也有所帮助。
我将其 post 放在这里,因为 none 示例对我有用,我花了两天时间才找到对我和我的安葬有用的东西。希望它能帮助别人。
window.onload = function pdfDivload (){
let el = document.getElementById('printableArea');
let opt = {
margin: 1,
filename: 'myfile.pdf',
image: { type: 'jpeg', quality: 0.98 },
html2canvas: { scale: 2 },
jsPDF: { unit: 'in', format: 'A4', orientation: 'portrait' }
};
html2pdf().set( opt ).from( el ).toPdf().output('datauristring').then(function( pdfAsString ) {
let data = {
'fileDataURI': pdfAsString,
};
$.post( "../prog/mail.php", data);
console.log( data );
} );
};
PHP:
if (isset($_POST['fileDataURI'])) {
$pdfdoc = $_POST['fileDataURI'];
$b64file = trim( str_replace( 'data:application/pdf;base64,', '', $pdfdoc ) );
$b64file = str_replace( ' ', '+', $b64file );
$decoded_pdf = base64_decode( $b64file );
//file_put_contents( $attachment, $decoded_pdf );
$mail = new PHPMailer;
$mail->setFrom( 'xxx@xxx.hr', 'website' );
$mail->addAddress( 'xxx@gxxx.com', 'OdedTa' );
$mail->Subject = 'First PHPMailer Message';
$mail->Body = 'Hi! This is my first e-mail sent through PHPMailer.';
$mail->addStringAttachment($decoded_pdf, "nalog.pdf");
$mail->isHTML( true );
$mail->send();