C# получить имя файла из почтовых вложений

У меня есть простое приложение c#, которое отправляет SMTP-письма (используя систему.Сеть.Почтовые классы). После отправки (отправки по электронной почте) объекта MailMessage я хочу перебрать список вложений и удалить исходные файлы, связанные с этими вложениями... но мне трудно найти полный путь к файлу, связанный с каждым вложением-без сохранения моей собственной коллекции файлов вложений. Должен быть хороший способ извлечь полный путь к файлу из вложения объект.

Я знаю, что это должно быть простой, но я трачу много времени на это..время спросить других.

3 ответов


вы можете

  • читать вложение.ContentStream
  • Если у вас теперь есть StreamReader или аналогичный, используйте BaseStream свойство, чтобы попытаться найти внутренний FileStream
  • читать FileStream.Имя

но имейте в виду, что почтовое сообщение (и, следовательно, вложения и их потоки) не могут быть собраны или очищены немедленно, поэтому вы не сможете удалить файл сразу. Вы можете сделать лучшее вложение подкласса и записать имя файла и подкласс Dispose (для выполнения после базового dispose), чтобы удалить, если вам действительно нужно сделать это таким образом.


если вы добавляете свои вложения через Attachment конструктор filePath аргумент, эти вложения могут быть получены через ContentStream свойство и будет типа FileStream. Вот как вы можете получить имена файлов прикрепленных файлов:

var fileNames = message.Attachments
    .Select(a => a.ContentStream)
    .OfType<FileStream>()
    .Select(fs => fs.Name);

но не забудьте избавиться MailMessage сначала объект, иначе вы не сможете удалить эти вложения:

IEnumerable<string> attachments = null;
using (var message = new MailMessage())
{
    ...
    attachments = message.Attachments
        .Select(a => a.ContentStream)
        .OfType<FileStream>()
        .Select(fs => fs.Name);
}

foreach (var attachment in attachments )
{
    File.Delete(attachment);
}

обычно проще всего взять немного другой ТЭК и прикрепить через memorystream, а не файл. Таким образом, вы избегаете всех проблем вокруг сохранения файлов на диск и очистки их после этого.

короткая статья здесь об этом.