返回

C# ASP.NET 使用 jsPDF 生成PDF并作为邮件附件发送

javascript

使用jsPDF生成的PDF作为邮件附件发送

在ASP.NET C#中,将客户端使用jsPDF生成的PDF作为邮件附件发送,需要一个桥梁将客户端数据传递到服务器端。这里提供两种常用的解决方案:

解决方案一:通过Base64编码传输PDF数据

这种方案将客户端生成的PDF转换为Base64字符串,通过AJAX或表单提交到服务器。服务器端再将Base64字符串解码为字节数组,最终作为邮件附件发送。

客户端(JavaScript):

function sendPDFToServer() {
  var doc = new jsPDF();
  doc.text(20, 20, '测试信息');
  doc.addPage();

  var pdfBase64 = doc.output('datauristring');

  // 使用AJAX发送数据
  $.ajax({
    url: 'SavePDF.aspx', // 服务器端处理程序
    type: 'POST',
    data: { pdfData: pdfBase64 },
    success: function (response) {
      // 处理服务器返回的信息,例如发送邮件成功提示
      alert(response); 
    },
    error: function (error) {
      console.error("PDF发送失败:", error);
      alert("PDF发送失败");
    }
  });
}

服务器端(C#):

// SavePDF.aspx.cs
using System;
using System.IO;
using System.Net.Mail;
using System.Web;

public partial class SavePDF : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.HttpMethod == "POST")
        {
            string pdfBase64 = Request["pdfData"];
            if (!string.IsNullOrEmpty(pdfBase64))
            {
                string base64Data = pdfBase64.Split(',')[1]; // 去除data:application/pdf;base64,前缀
                byte[] pdfBytes = Convert.FromBase64String(base64Data);

                // 将PDF字节数组作为附件添加到邮件中
                MailMessage message = new MailMessage("from@example.com", "to@example.com");
                message.Subject = "PDF附件";
                message.Body = "邮件正文";
                message.Attachments.Add(new Attachment(new MemoryStream(pdfBytes), "generated.pdf"));


                SmtpClient smtp = new SmtpClient("your_smtp_server");
                //配置SMTP客户端 (例如,设置端口、凭据等)
                smtp.Port = 587;
                smtp.Credentials = new System.Net.NetworkCredential("your_email@example.com", "your_password");
                smtp.EnableSsl = true;
                try {
                    smtp.Send(message);
                    Response.Write("PDF发送成功");
                }
                catch(Exception ex){
                    Response.Write("PDF发送失败: " + ex.Message);
                }



            }
        }

    }
}

操作步骤:

  1. 客户端调用 sendPDFToServer 函数生成PDF并转换为Base64字符串。
  2. 通过AJAX将Base64字符串发送到服务器端的 SavePDF.aspx 处理程序。
  3. 服务器端解码Base64字符串,创建 MemoryStream,并将其作为附件添加到 MailMessage 对象。
  4. 使用 SmtpClient 发送邮件。

解决方案二:将PDF保存到临时文件

此方案将PDF文件先保存到服务器端的临时目录,然后作为附件发送。最后删除临时文件。

客户端(JavaScript):

与方案一客户端代码一致。

服务器端 (C#):

// SavePDF.aspx.cs
using System;
using System.IO;
using System.Net.Mail;
using System.Web;


// ...(与方案一相同的using语句和命名空间)

    // ... (其他代码)
               string tempFilePath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString() + ".pdf");
               File.WriteAllBytes(tempFilePath, pdfBytes);

               MailMessage message = new MailMessage("from@example.com", "to@example.com");
               // ... (设置邮件主题和正文)

               message.Attachments.Add(new Attachment(tempFilePath));

               try {
                   smtp.Send(message);
                   File.Delete(tempFilePath); //发送成功后删除临时文件
                   Response.Write("PDF发送成功");
               } catch(Exception ex) {
                    //尝试删除临时文件,即使发送失败也要清理。
                    try {
                       File.Delete(tempFilePath);
                    } catch {}
                    Response.Write("PDF发送失败:" + ex.Message);
               }


    // ... (其他代码)

操作步骤:

  1. 客户端与方案一相同。
  2. 服务器端解码Base64字符串,将PDF保存到临时文件。
  3. 将临时文件作为附件添加到邮件中。
  4. 发送邮件后删除临时文件。

安全性建议:

  • 确保服务器端对上传的文件进行必要的验证,防止恶意文件上传。
  • 使用 HTTPS 加密传输数据,保护数据的安全性。
  • 配置合适的SMTP服务器身份验证,避免邮件账户被盗用。
  • 确保临时文件目录的访问权限设置正确,防止未授权访问。

通过以上两种方案,可以选择适合自己项目的方式实现 jsPDF 生成的 PDF 作为邮件附件发送。 合理选择方案,并关注安全性,可以确保功能的稳定性和数据的安全。 根据实际情况配置 SMTP 服务器信息。