使用MemoryStream使用电子邮件发送.txt附件?

时间:2018-03-27 14:46:24

标签: c# asp.net-core asp.net-core-2.0 sendgrid

我一直在寻找许多答案,但我似乎很难理解如何做到这一点,即使它非常明显。

我想将数据库中的值写入文本文件,并将文本文件附加到电子邮件中,而不将其存储在本地。我正在使用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

1 个答案:

答案 0 :(得分:2)

这里有两个问题。

  1. 第一个示例中的using块将在返回流之前调用streamWriter.Dispose()Dispose()操作将关闭您的MemoryStream,使其无法使用。
  2. 您的链接中的示例代码似乎使用的是SendGrid API的另一个可能较旧的版本。查看the current APIAddAttachment()系列接受流的唯一重载如下:

    public async Task AddAttachmentAsync(string filename, Stream contentStream, string type = null, string disposition = null, string content_id = null, CancellationToken cancellationToken = default(CancellationToken))
    
  3. 所有其他选项都需要base64content字符串。您还可以在上面的API链接中阅读该方法的代码,以获得有关如何将该流转换为base64的一个很好的示例。