Как правильно удалить вложение из электронного письма, используя Aspose.Email - PullRequest
1 голос
/ 18 марта 2020

В моем приложении пользователи могут загружать электронные письма на файловый сервер, после чего эти электронные письма должны быть удалены из их вложений и преобразованы в 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;
}

Я уже пробовал несколько перестановок этого кода, но ни один сработало.
Кроме того, я следую официальной документации Aspose по этому вопросу и не вижу, что я делаю по-другому / неправильно.

1 Ответ

0 голосов
/ 18 марта 2020

Оказывается, я сделал что-то интересное с моими потоками, и мне пришлось сохранить свою электронную почту без вложений, прежде чем возвращать ее, вот мой пересмотренный код:

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

Теперь он работает как шарм

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...