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

时间:2020-03-18 08:58:19

标签: c# aspose

在我的应用程序中,用户可以将电子邮件上传到文件服务器,然后应删除这些电子邮件的附件,并将其转换为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;
}

我已经尝试了此代码的多个排列,但没有一个起作用。
另外,我正在关注official Aspose documentation,但我看不出自己在做什么/做错了。

1 个答案:

答案 0 :(得分:0)

事实证明,我对流进行了一些时髦处理,在返回之前必须保存没有附件的电子邮件,这是我的修改后的代码:

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;
}

它现在就像一种魅力