为什么Memory Stream不能与FluentEMail.Core.Model.Attachment一起使用来发送文件?

问题描述 投票:0回答:1

我正在使用 FluentEmail 创建一个用于在 asp.net web api 中发送电子邮件的操作方法。 我想通过我的电子邮件发送多个附件。

我首先使用

Memory Stream
将文件复制到
FluentEmail.Core.Models.Attachment
类中。

        using FluentEmail.Core.Models;
        public async Task<IActionResult> SendMail(IFormFileCollection files)
        {
            var attachmentList = new List<Attachment>();
            foreach (var file in files)
            {
                var attachment = new Attachment()
                {
                    Data = new MemoryStream(),
                    ContentType = file.ContentType,
                    Filename = file.FileName
                };
                await file.CopyToAsync(attachment.Data);
                attachmentList.Add(attachment);
            }

            var response = await _fluentEmail
                .To(_senderEmail)
                .Subject("SUBJECT")
                .Body("MESSAGE")
                .ReplyTo(_receiverEmail)
                .Attach(attachmentList)
                .SendAsync();

            return Ok();
        }

电子邮件被触发,但附加的文件是空的(大小只有几个字节,可能是因为只传递了文件头而不是文件内容)。

虽然调试后我发现文件内容被完美地传递到了

.Attach()
方法中。

我也尝试过让方法同步,但都是徒劳的。

所以我更新了我的代码并使用

OpenReadStream
代替。

                var attachment = new FluentEmail.Core.Model.Attachment()
                {
                    Data = file.OpenReadStream(),
                    ContentType = file.ContentType,
                    Filename = file.FileName
                };
                attachmentList.Add(attachment);

这样我就可以完美地获取电子邮件中的文件及其内容。

我认为这可能是因为

MemoryStream
的范围被处理掉了(因为我之前遇到过类似的问题),但我不确定。

谁能解释一下为什么

MemoryStream
不起作用?

asp.net-web-api email-attachments memorystream mailkit
1个回答
0
投票

问题很可能是因为在将内容复制到 MemoryStream 后,您没有将 MemoryStream 的 Position 属性设置回 0。

从流中读取的任何代码都将从流中的 current 位置开始,这不一定是流的开头。

通过将位置设置回开头,从流中读取的代码将从头开始读取。

© www.soinside.com 2019 - 2024. All rights reserved.