如何使用 Aspose.Email 从电子邮件中正确删除附件

How to properly remove an attachment from an email using Aspose.Email

在我的应用程序中,用户可以将电子邮件上传到文件服务器,然后应删除这些电子邮件的附件并转换为 PDF 以单独保存。但我在正确删除电子邮件中的附件时遇到问题。
当我转换电子邮件并将其与附件一起保存时,效果很好,但是当我先删除附件然后保存时,它以某种方式破坏了生成的 PDF 文件,使其看起来像 this(这只是一个从 4 行电子邮件生成的 4 页)。谁能解释我做错了什么?

这是我从电子邮件中删除附件的代码:

public static List<(string FileName, Stream Content)> GetEmailAndAttachmentsFromEmail(Stream emailContent)
{
    var email = MailMessage.Load(emailContent);
    var retval = new List<(string, Stream)>
    {
        ($"{email.Subject}.msg", emailContent)
    };

    var attachmentsToRemove = new List<Attachment>();
    foreach (var attachment in email.Attachments)
    {
        retval.Add((attachment.Name, attachment.ContentStream));
        attachmentsToRemove.Add(attachment);
    }

    foreach (var attachment in attachmentsToRemove)
    {
        email.Attachments.Remove(attachment);
    }

    return retval;
}

我已经尝试了此代码的多种排列,但 none 奏效了。
另外,我正在关注这个主题的 official Aspose documentation,但我没有看到我在做什么不同/错误的事情。

原来我对我的流做了一些奇怪的事情,我不得不在返回之前保存没有附件的电子邮件,这是我修改后的代码:

public static List<(string FileName, Stream Content)> GetEmailAndAttachmentsFromEmail(Stream emailContent)
{
    var email = MailMessage.Load(emailContent);
    // I removed the prepending of the email here and moved it to the end
    var retval = new List<(string, Stream)>();

    var attachmentsToRemove = new List<Attachment>();
    foreach (var attachment in email.Attachments)
    {
        retval.Add((attachment.Name, attachment.ContentStream));
        attachmentsToRemove.Add(attachment);
    }

    foreach (var attachment in attachmentsToRemove)
    {
        email.Attachments.Remove(attachment);
    }

    // This part is new
    var newEmailContent = new MemoryStream();
    email.Save(newEmailContent);
    newEmailContent.Seek(0, SeekOrigin.Begin);
    retval = retval.Prepend(($"{email.Subject}.msg", newEmailContent)).ToList();

    return retval;
}

它现在很有魅力