我正在使用 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
不起作用?
问题很可能是因为在将内容复制到 MemoryStream 后,您没有将 MemoryStream 的 Position 属性设置回 0。
从流中读取的任何代码都将从流中的 current 位置开始,这不一定是流的开头。
通过将位置设置回开头,从流中读取的代码将从头开始读取。