我一直在寻找许多答案,但我似乎很难理解如何做到这一点,即使它非常明显。
我想将数据库中的值写入文本文件,并将文本文件附加到电子邮件中,而不将其存储在本地。我正在使用Sendgrid API管理发送电子邮件,我试图使用MemoryStream来存储数据。
以下是我的尝试
private MemoryStream WriteToTextFile(IEnumerable<Location> locations)
{
MemoryStream memoryStream = new MemoryStream();
using (StreamWriter streamWriter = new StreamWriter(memoryStream))
{
foreach (var location in locations)
{
streamWriter.WriteLine($"{location.Time},{location.Location},{ location.LocationAccuracy},{ location.IsAlertRaised}");
}
streamWriter.Flush();
}
return memoryStream;
}
然后我尝试将其附加到电子邮件
memoryStream.Seek(0, SeekOrigin.Begin);
var message = MailHelper.CreateSingleEmail(from, to, subject, plainTextContent, htmlContent);
message.AddAttachment(memoryStream, fileName);
var response = await _client.SendEmailAsync(message);
memoryStream.Dispose();
错误很简单&#34;无法从&#39; System.IO.MemoryStream&#39; 转换为&#39; string&#39;
我尝试的解决方案是基于这里提出的问题。 AddAttachment from MemoryStream
答案 0 :(得分:2)
这里有两个问题。
using
块将在返回流之前调用streamWriter.Dispose()
。 Dispose()
操作将关闭您的MemoryStream,使其无法使用。您的链接中的示例代码似乎使用的是SendGrid API的另一个可能较旧的版本。查看the current API,AddAttachment()
系列接受流的唯一重载如下:
public async Task AddAttachmentAsync(string filename, Stream contentStream, string type = null, string disposition = null, string content_id = null, CancellationToken cancellationToken = default(CancellationToken))
所有其他选项都需要base64content
字符串。您还可以在上面的API链接中阅读该方法的代码,以获得有关如何将该流转换为base64的一个很好的示例。