来自MemoryStream的AddAttachment

SendGrid API文档指定您可以从Stream添加附件。 它给出的示例使用FileStream对象 。

我在Azure存储中有一些blob,我想将其作为附件发送电子邮件。 要实现这一点,我正在尝试使用MemoryStream

 var getBlob = blobContainer.GetBlobReferenceFromServer(fileUploadLink.Name); if(getBlob != null) { // Get file as a stream MemoryStream memoryStream = new MemoryStream(); getBlob.DownloadToStream(memoryStream); emailMessage.AddAttachment(memoryStream, fileUploadLink.Name); } emailTransport.Deliver(emailMessage); 

它发送正常,但当电子邮件到达时,附件似乎在那里,但它实际上是空的。 查看电子邮件来源,附件没有内容。

在使用SendGrid C#API发送附件时,使用MemoryStream是一个已知的限制吗? 或者我应该以其他方式接近这个?

您可能只需要在调用DownloadToStream后将流位置重置为0:

 var getBlob = blobContainer.GetBlobReferenceFromServer(fileUploadLink.Name); if (getBlob != null) { var memoryStream = new MemoryStream(); getBlob.DownloadToStream(memoryStream); memoryStream.Seek(0,SeekOrigin.Begin); // Reset stream back to beginning emailMessage.AddAttachment(memoryStream, fileUploadLink.Name); } emailTransport.Deliver(emailMessage); 

您可能想要检查清理流的人员,如果他们不清理,您应该在调用Deliver()之后将其丢弃。

根据他们的API,他们已经实现了void AddAttachment(Stream stream, String name) 。 你可能正在使用之前写过的MemoryStream 。 我建议将流中的位置重置为开头,如:

 memoryStream.Seek(0, SeekOrigin.Begin); 

我最终得到了以下问题,为我解决了这个问题:

 fileByteArray = new byte[getBlob.Properties.Length]; getBlob.DownloadToByteArray(fileByteArray, 0); attachmentFileStream = new MemoryStream(fileByteArray); emailMessage.AddAttachment(attachmentFileStream, fileUploadLink.Name); 

线程有点旧,但我使用带有NReco PDF转换器的varient:

  private async Task SendGridasyncBid(string from, string to, string displayName, string subject, **byte[] PDFBody**, string TxtBody, string HtmlBody) { ... var myStream = new System.IO.MemoryStream(**PDFBody**); myStream.Seek(0, SeekOrigin.Begin); myMessage.AddAttachment(myStream, "NewBid.pdf"); ... } 

将html转换为pdf并将其返回,而不是将其写入下载…

  private byte[] getHTML(newBidViewModel model) { string strHtml = ...; HtmlToPdfConverter pdfConverter = new HtmlToPdfConverter(); pdfConverter.CustomWkHtmlArgs = "--page-size Letter"; var pdfBytes = pdfConverter.GeneratePdf(strHtml); return **pdfBytes**; } 

我不确定这是多么有效,但它对我有用,我希望它可以帮助别人找到他们的附件。