从 MemoryStream 添加附件

AddAttachment from MemoryStream

SendGrid API 文档指定您可以从流中添加附件。 The example it gives uses a FileStream object.

我在 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 是否为已知限制?或者我应该以其他方式解决这个问题?

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

memoryStream.Seek(0, SeekOrigin.Begin);

您可能只需要在调用 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() 后将其处理掉。

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

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

线程有点旧,但我使用了 NReco PDF 转换器的变体:

    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 并 return 它而不是编写以供下载...

    private byte[] getHTML(newBidViewModel model)
    {
        string strHtml = ...;

        HtmlToPdfConverter pdfConverter = new HtmlToPdfConverter();
        pdfConverter.CustomWkHtmlArgs = "--page-size Letter";

        var pdfBytes = pdfConverter.GeneratePdf(strHtml);

        return **pdfBytes**;
    }

我不确定这有多有效,但它对我有用,我希望它能帮助其他人弄清楚他们的附件。