【问题标题】:Get the text from Email Attachments and write to a file从电子邮件附件中获取文本并写入文件
【发布时间】:2017-01-05 00:03:24
【问题描述】:

我正在使用 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 新手。

感谢大家的帮助!

瑞恩

【问题讨论】:

  • 不确定你在做什么,但Attachments 是一个集合,所以试图将它写成一堆字节不会提供一种方法来知道一个项目在哪里结束,另一个在哪里开始。它只是一个斑点。 也许你想序列化它?
  • Ryan 在每个循环File.AppendAllText 电子邮件和附件详细信息,以便您知道一个项目结束和另一个开始的位置。我个人会使用数据库而不是文本文件,文本文件会变得非常非常大,一旦超过 5MB 左右就需要很长时间才能打开。
  • 谢谢@Plutonix,序列化它工作得很好。我正在前往我需要去的地方的路上。如果有人想知道我正在设计一个显示类似于 IM 客户端的电子邮件客户端。

标签: c# vb.net email-attachments data-manipulation


【解决方案1】:

这绝非易事。附件可以是任意数量的专有格式:“.pdf”、“.doc”、“.xls”、“.ppt”、“.csv”、“.vsd”、“.zip” , ".rar", ".txt", ".html", ".proj" 等等等等等等。

好消息是所有工作都已为您完成,我将向您展示如何通用地读取几乎任何文件格式并提取此答案中的文本:

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

确保您阅读了信息以进行设置段落。

所以继续使用 NuGet(工具菜单 > NuGet 包管理器)将 TikaOnDotnet 和 TikaOnDotnet.TextExtractor 引用到您的项目。

我假设您已经编写了代码来提取电子邮件附件,使用 Outlook 插件 MSDN How to: Programmatically Save Attachments from Outlook E-Mail Items 或 just an app 通过互操作使用 Outlook,例如:

在 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

【讨论】:

    猜你喜欢
    • 2011-08-20
    • 2013-04-24
    • 2016-11-01
    • 2020-11-06
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    相关资源
    最近更新 更多