【问题标题】:Using MemoryStream Send .txt attachment with email?使用 MemoryStream 通过电子邮件发送 .txt 附件?
【发布时间】:2018-03-27 14:46:23
【问题描述】:

我已经查看了很多关于此的答案,但我似乎不太明白该怎么做,即使它非常明显。

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

错误很简单“无法从 'System.IO.MemoryStream' 转换为 'string'

我尝试的解决方案是基于此处提出的问题。 AddAttachment from MemoryStream

【问题讨论】:

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


    【解决方案1】:

    这里有两个问题。

    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))
      

    所有其他选项都需要 base64content 字符串。您也可以阅读上面 API 链接中的方法代码,了解如何将该流转换为 base64 的一个很好的示例。

    【讨论】:

      猜你喜欢
      • 2015-10-23
      • 1970-01-01
      • 2020-11-20
      • 2015-09-30
      • 2015-07-23
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 2015-08-03
      相关资源
      最近更新 更多