2017-01-05 8 views
0

Я работаю с Microsoft Visual Studio 2015, и я пытаюсь преобразовать что-то из формы списка в строку. Я нашел некоторые решения для подобных проблем, но не в частности.Получите текст из вложений электронной почты и напишите в файл

Я хотел бы, чтобы в конечном счете, этот код работает:

Dim info As Byte() = New UTF8Encoding(True).GetBytes(Utilities.GetEmailInfo(msg.Message).Attachments) 

Мой конец игры, чтобы взять текст с вложениями и записать его в файл. Если я использую некоторые другие типы данных, перечисленные ниже, такие как ToData, файл получается правильно, но я сталкиваюсь с ошибкой с указанным выше кодом, потому что GetBytes не может получить текст из списка. Есть ли другая функция, которую я мог бы использовать, чтобы получить текст из списка?

Класс, который нужно преобразовать содержит следующее:

Public Class EmailInfo 
    Public FromData As String = vbNullString       'FROM: 
    Public ToData As String = vbNullString        'TO: 
    Public DateData As String = vbNullString       'DATE: 
    Public SubjectData As String = vbNullString       'SUBJECT: 
    Public MessageBody As EmailItem          'contents of message body 
    Public AlternateViews As New Collections.Generic.List(Of EmailItem) 'list of alternate views 
    Public Attachments As New Collections.Generic.List(Of EmailItem) 'list of attachments 
End Class 

ресурс, который я хочу, чтобы получить доступ в EmailInfo.Attachments. Этот ресурс хранится как список типа EmailItem. Код для этого типа заключается в следующем:

Public Class EmailItem 
    Public ContentType As String = vbNullString   'CONTENT-TYPE data 
    Public ContentTypeData As String = vbNullString  'filename or text encoding 
    Public ContentTypeDataIsFilename As Boolean = False 'True if ContentTypeData specifies a filename 
    Public ContentEncoding As String = vbNullString  'CONTENT-TRANSFER-ENCODING data 
    Public ContentBody As String = vbNullString   'raw data of block 
End Class 

Я попытался с помощью какой-то код, такой как string.join, но я в конечном итоге с пустой строкой.

Прошу простить мое невежество, поскольку я новичок в VB.

Спасибо всем за вашу помощь!

Ryan

+1

Не уверен, что вы делаете, но 'Attachments' представляет собой коллекцию, поэтому, пытаясь записать ее, как куча байтов, не даст способа узнать, где находится один элемент заканчивается, а другой начинается. Это будет просто капля. * Может быть, вы хотите сериализовать его? – Plutonix

+0

Ryan на каждом цикле 'File.AppendAllText' сообщения электронной почты и вложения, чтобы вы знали, где заканчивается один элемент, а другой начинается.Я лично использовал бы базу данных вместо текстового файла, текстовый файл будет расти очень, очень большой, и после его более 5 МБ или около того потребуется много времени для открытия. –

+0

Спасибо @Plutonix, сериализация его работала отлично. Я нахожусь на пути к тому, где я должен быть. Если кому-то интересно, я разрабатываю почтовый клиент, который отображается аналогично IM-клиенту. – user6086585

ответ

0

Это не обычная задача. Вложения могут быть любыми числами проприетарными форматами: .pdf "," .doc "," .xls "," .ppt "," .csv "," .vsd "," .zip "," .rar " , ".txt", ".html", ".proj" и т. д. и т. д.

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

Generically read any file format and convert it to .txt format

Убедитесь, что вы читали информация, чтобы установить его пункт.

Так что давайте рассмотрим TikaOnDotnet & TikaOnDotnet.TextExtractor для вашего проекта с помощью NuGet (меню «Сервис»> «Менеджер пакетов NuGet»).

Я предполагаю, что вы написали код для извлечения вложения электронной почты, используя надстройки Outlook MSDN How to: Programmatically Save Attachments from Outlook E-Mail Items или just an app, который использует Outlook, через Interop, например:

В C#:

private TextExtractor _textExtractor; 
private string _attachmentTextFilepath = @"c:\temp\EmailAttachmentText.txt"; 
static void IterateMessages(Outlook.Folder folder) 
{ 
    var fi = folder.Items; 
    if (fi != null) 
    { 
     foreach (Object item in fi) 
     { 
      Outlook.MailItem mi = (Outlook.MailItem)item; 
      var attachments = mi.Attachments; 
      if (attachments.Count != 0) 
      { 
       for (int i = 1; i <= mi.Attachments.Count; i++) 
       { 
        //Save email attachments 
        mi.Attachments[i].SaveAsFile(@"C:\temp\" + mi.Attachments[i].FileName); 

        //Use TIKA to read the contents of the file 
        TextExtractionResult textExtractionResult = _textExtractor.Extract(@"C:\temp\" + mi.Attachments[i].FileName); 

        //Save attachment text to a txt file 
        File.AppendAllText(_attachmentTextFilepath, textExtractionResult.Text); 
       } 
      } 
     } 
    } 
} 

В VB .Net:

Private _textExtractor As TextExtractor 
Private _attachmentTextFilepath As String = "c:\temp\EmailAttachmentText.txt" 
Private Shared Sub IterateMessages(folder As Outlook.Folder) 
    Dim fi = folder.Items 
    If fi IsNot Nothing Then 
     For Each item As [Object] In fi 
      Dim mi As Outlook.MailItem = DirectCast(item, Outlook.MailItem) 
      Dim attachments = mi.Attachments 
      If attachments.Count <> 0 Then 
       For i As Integer = 1 To mi.Attachments.Count 
        'Save email attachments 
        mi.Attachments(i).SaveAsFile("C:\temp\" + mi.Attachments(i).FileName) 

        'Use TIKA to read the contents of the file 
        Dim textExtractionResult As TextExtractionResult = _textExtractor.Extract("C:\temp\" + mi.Attachments(i).FileName) 

        'Save attachment text to a txt file 
        File.AppendAllText(_attachmentTextFilepath, textExtractionResult.Text) 
       Next 
      End If 
     Next 
    End If 
End Sub 

 Смежные вопросы

  • Нет связанных вопросов^_^