从 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**;
}
我不确定这有多有效,但它对我有用,我希望它能帮助其他人弄清楚他们的附件。
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**;
}
我不确定这有多有效,但它对我有用,我希望它能帮助其他人弄清楚他们的附件。