使用 SelectPdf .NET 在电子邮件中附加 pdf 而不保存 PDF

Posted

技术标签:

【中文标题】使用 SelectPdf .NET 在电子邮件中附加 pdf 而不保存 PDF【英文标题】:attach a pdf in an email using SelectPdf .NET without saving PDF 【发布时间】:2016-06-16 12:46:58 【问题描述】:

我正在使用 SelectPdf 将 html 转换为 PDF 并在电子邮件中发送 PDF 而不保存它并放入 MemoryStream,但电子邮件从未发送过

如果我创建电子邮件而不附加 PDF,则始终发送。

这是我的代码:

 public void SendEmail(string htmlBody, string email, string emailBody, string subject)
    
        PdfDocument doc = null;
        try
        
            //Reading the html and converting it to Pdf

            HtmlToPdf pdf = new HtmlToPdf();
            doc = pdf.ConvertHtmlString(htmlBodyReservaPasajeros);
            var streamPdf = new MemoryStream(doc.Save()); 

            //creating the message

            message.From = new MailAddress(ConfigurationManager.AppSettings[url + "Email"]);
            message.To.Add(new MailAddress(email));
            message.Subject = subject;
            message.Body = HtmlBody;
            message.IsBodyHtml = true;
            if (doc != null)
            
                 message.Attachments.Add(new Attachment(streamPdf , "Prueba.pdf", "application/pdf"));
            
            //Sending the email
            ...

            //Closing
            streamPdf.Close();
            doc.Close(); 
                    
        catch (Exception e)
        
        
    

更新

我有两个问题:

首先:gmail 将电子邮件识别为跨度,但是...

第二:即便如此,由于 pdf 已损坏,我不得不编写 doc.DetachStream()。 此函数从 PdfDocument 中分离对象 memoryStream 并将其释放。

最后的代码是下一个:

public void SendEmail(string htmlBody, string email, string emailBody, string subject)
    
        PdfDocument doc = null;
        try
        
            //Reading the html and converting it to Pdf

            HtmlToPdf pdf = new HtmlToPdf();
            doc = pdf.ConvertHtmlString(htmlBodyReservaPasajeros);
            var streamPdf = new MemoryStream(doc.Save()); 
            **doc.DetachStream();**
            //creating the message

            message.From = new MailAddress(ConfigurationManager.AppSettings[url + "Email"]);
            message.To.Add(new MailAddress(email));
            message.Subject = subject;
            message.Body = HtmlBody;
            message.IsBodyHtml = true;
            if (doc != null)
            
                 message.Attachments.Add(new Attachment(streamPdf , "Prueba.pdf", "application/pdf"));
            
            //Sending the email
            ...

            //Closing
            streamPdf.Close();
            doc.Close(); 
                    
        catch (Exception e)
        
        
    

【问题讨论】:

我不确定,但电子邮件可能不知道doc 的扩展名,并且它不会发送未知类型的附件,因为它认为这是一个“坏文件”。跨度> 另外,如果附件存在,附件可以工作,msdn.microsoft.com/en-us/library/…你有什么异常吗? 不,它没有捕获任何异常 很奇怪,因为你说可以不带附件发送。只尝试message.Attachments.Add(new Attachment(doc) 并运行它。 不可能是因为 Attachment(Stream streamObject) 没有退出 【参考方案1】:

此代码对我有用..!

public void SendEmail(string htmlBody, string email, string emailBody, string subject)

  try
  

    //Reading the html and converting it to Pdf
    HtmlToPdf pdf = new HtmlToPdf();
    PdfDocument doc = pdf.ConvertHtmlString(htmlBodyReservaPasajeros);

    using (MemoryStream memoryStream = new MemoryStream())
     
      doc.Save(memoryStream);

      byte[] bytes = memoryStream.ToArray();

      memoryStream.Close();

      MailMessage message= new MailMessage();
      message.From = new MailAddress(
        ConfigurationManager.AppSettings[url + "Email"]
      );
      message.To.Add(new MailAddress(email));
      message.Subject = subject;
      message.Body = htmlBody;
      message.IsBodyHtml = true;
      message.Attachments.Add(new Attachment(
        new MemoryStream(bytes),
        "Prueba.pdf"
      ));

      //Sending the email
      . . .
    

    doc.Close(); 
              
  catch (Exception e)
  
    // handle Exception
    . . .
  


【讨论】:

请在您的答案中添加一些要点,而不是仅发布代码。【参考方案2】:

查看生成的内存流是否有当前位置的开头。您可能需要设置如下内容:

streamPdf.Position = 0;

【讨论】:

以上是关于使用 SelectPdf .NET 在电子邮件中附加 pdf 而不保存 PDF的主要内容,如果未能解决你的问题,请参考以下文章

在python中发送电子邮件(MIMEmultipart)

在 ASP.net core 3.1 Razor Pages 中打印 PDF

C# 使用 WebBrowser 实现 HTML 转图片功能

效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中附源代码下载) 转

在 Asp.Net 中使用电子邮件发送忘记密码

使用 Asp.Net 发送异步电子邮件但 Page 仍在等待?