只获取 MIME 电子邮件的“文本/纯文本”部分

Posted

技术标签:

【中文标题】只获取 MIME 电子邮件的“文本/纯文本”部分【英文标题】:Get just the 'text/plain' bit of a MIME email 【发布时间】:2015-12-11 17:11:30 【问题描述】:

我正在为我正在处理的项目解析电子邮件。 到目前为止,我连接到一个 pop3 邮件服务器,下载那里的所有邮件并循环通过它获取发件人、主题和正文。

然后我解码 base64 正文,这给我留下了一个多部分的 MIME 消息,就像我自己发送的以下测试电子邮件...

我需要能够拆分此 Multipart MIME 电子邮件正文,以便我可以拥有一个仅包含邮件纯文本版本的字符串和另一个包含 html 部分的字符串。

我对邮件中可能包含的任何其他内容不感兴趣...附件等都可能被丢弃。

谁能指出我正确的方向?

如果我打算使用 3rd 方控件,有人知道有什么免费软件可以做到这一点吗?我永远不需要编码,只需解码。

【问题讨论】:

假设您可以使用 Exchange 邮件服务器 EWS 。它将电子邮件分解为易于访问的部分。 参见 RFC 1341 和废弃它的 RFC。基本上,从标题中获取边界,通过在VbCrLf & "--" & boundary 上拆分应该很容易得到各个部分。 【参考方案1】:

假设您在电子邮件中提取了标题,以便您可以获取用于识别电子邮件中部分边界的字符串,您可以通过以下代码进行解析:

Imports System.IO
Imports System.Text.RegularExpressions

Module Module1

    Sub Main()
        Dim sampleEmail = File.ReadAllText("C:\temp\SampleEmail.eml")
        Dim getBoundary As New Regex("boundary=(.*?)\r\n")
        Dim possibleBoundary = getBoundary.Matches(sampleEmail)
        Dim boundary = ""
        If possibleBoundary.Count = 0 Then
            Console.WriteLine("Could not find boundary specifier.")
            End
        End If

        ' the boundary string may or may not be surrounded by double-quotes
        boundary = possibleBoundary(0).Groups(1).Value.Trim(CChar(""""))

        Console.WriteLine(boundary)

        boundary = vbCrLf & "--" & boundary
        Dim parts = Regex.Split(sampleEmail, Regex.Escape(boundary))

        Console.WriteLine("Number of parts: " & parts.Count.ToString())

        ' save the parts to one text file for inspection
        Using sw As New StreamWriter("C:\temp\EmailParts.txt")
            For i = 0 To parts.Count - 1
                ' this is where you would find the part with "Content-Type: text/plain;" -
                ' you may also need to look at the charset, e.g. charset="utf-8"
                sw.WriteLine("PART " & i.ToString())
                sw.WriteLine(parts(i))
            Next
        End Using

        Console.ReadLine()

    End Sub

End Module

我用来测试的电子邮件没有涉及任何 base-64 编码。

【讨论】:

【参考方案2】:

我建议使用我的免费/开源 MimeKit 库来完成此任务,而不是使用正则表达式解决方案。

我不太了解 VB.NET,所以下面的代码 sn-p 可能不太正确(我是 C# 人),但它应该让您大致了解如何完成您想要的任务:

Dim message = MimeMessage.Load ("C:\email.msg");
Dim html = message.HtmlBody;
Dim text = message.TextBody;

如您所见,MimeKit 让这类事情变得非常简单。

【讨论】:

【参考方案3】:

A = E1 = 80 =

=B8=E1=80=80=E1=80=BC=E1=80-8A=E1=80=BA; = 50 = 61 = 74 = 69 = 65 = 6E = 74;;

-PRINTABLE: = 50 = 61 = 74 = 69 = 65-6 E = 74 = 20 = E1 = 80 = 99 = E1 = 80 = 81 = E1 = 80 = 84 = E1 = 80 = BA =

E1 = 81 = 80 =

= E1=80=84=E1=80=BA=E1=80=B8=E1=80=80=E1=80=BC=E1=80=8A=E1=80=BA

B = E1 = 80 = AD = E1 = 80 = AF; = 50 = 61 = 74 = 69 = 65 =

6E = 74 ;;

E1 = 80 = AF =

结束:VCARD

【讨论】:

请解释一下这应该代表什么。

以上是关于只获取 MIME 电子邮件的“文本/纯文本”部分的主要内容,如果未能解决你的问题,请参考以下文章

带有文本和日历的多部分电子邮件:Outlook 无法识别 ics

Chrome 说“资源解释为脚本,但使用 MIME 类型文本/纯文本传输。”,啥给出?

mime_content_type 仅返回 css 和 js 文件的文本/纯文本

在电子邮件中添加页脚文本的最佳方法是啥?

.svg 文件的 Gitlab(rails)“原始”文件 mime 类型是“文本/纯文本”。是不是可以将其配置为输出为“image/svg+xml”?

在 SMTP 中对用户隐藏文本/纯文本