获取附件并保存在s3 bucket mailkit imap

Get attachment and save in s3 bucket mailkit imap

我需要获取电子邮件中的附件进行保存,我会根据需要完成阅读电子邮件和保存的整个过程,但是当我尝试获取要保存在 AWS S3 存储桶中的附件时它在尝试读取内容类型时出错。 基本上我需要做的是。

  1. 获取附件。
  2. 为我的S3 保存功能创建一个FormFile 来保存附件(S3 保存功能已经可用)。 我在构建 FormFile 时遇到问题。
.
.
.
var attachmentsToS3 = new FormFileCollection();
foreach (var attachment in message.Attachments)
{
    var part = attachment as MimePart;
    var stream = new MemoryStream();
    await part.Content.DecodeToAsync(stream);
    var fileLength = stream.Length;
    var formFile = new FormFile(stream, 0, fileLength, "file[]", attachment.ContentDisposition.FileName);
    attachmentsToS3.Add(formFile);
}

await _atendimentoServices.SaveAnexoAtendimentoToS3( attachmentsToS3, idAcompanhamento, requestApi);
.
.
.

更新

根据布鲁诺的回答所做的更改,现在可以正常使用了。

var attachmentsToS3 = new FormFileCollection();
foreach (MimeEntity attachment in message.Attachments)
{
    var memory = new MemoryStream();
    if (attachment is MimePart part)
        await part.Content.DecodeToAsync(memory);
    else
        await ((MessagePart)attachment).Message.WriteToAsync(memory);
    var bytes = memory.ToArray();
    var contentType = MimeTypes.GetMimeType(attachment.ContentType.MimeType);
    var formFile = new FormFile(memory, 0, bytes.Length, "file[]", attachment.ContentDisposition.FileName)
    {
        Headers = new HeaderDictionary(),
        ContentType = contentType
    };
    attachmentsToS3.Add(formFile);
}
await _atendimentoServices.SaveAnexoAtendimentoToS3(attachmentsToS3, idAcompanhamento, requestApi);```

下午好,Gabriel,在分析您的代码时,我发现缺少部分代码。

首先你需要这样评价你的依恋:

if (attachment is MimePart part) await part.Content.DecodeToAsync(memory);
else await ((MessagePart)attachment).Message.WriteToAsync(memory);

这样你就可以保证你的流将被正确填充为 mimeType 或不是。

缺少的另一部分是 header 和 FormFile 构造函数中的内容类型,试试看。

var formFile = new FormFile(memory, 0, bytes.Length, "file[]", attachment.ContentDisposition.FileName)
                            {
                                Headers = new HeaderDictionary(),
                                ContentType = MimeTypes.GetMimeType(attachment.ContentType.MimeType);
                            };