专栏首页马洪彪C#操作EML邮件文件实例(含HTML格式化邮件正文和附件)

C#操作EML邮件文件实例(含HTML格式化邮件正文和附件)

使用QQ邮箱、163邮箱等导出的EML邮件,包含了邮件的发件人、主题、内容、附件等所有信息,该实例就如何解析这些信息,并在编辑后保存做个Demo。

如下图所示,EML文件是编码后的文本文件,可以使用正则表达式识别其中的关键字,例如Received、Sender、Cc、Bcc、From等。

 但解析后的内容是经过编码后的,例如Sender的内容X-QQ-FEAT……,这个时候需要对内容进行解码,一般使用Base64进行编码。

EML源文件包含了很多信息,除了使用邮箱客户端看到的收件人、发件人、主题、正文、附件等之外,还可以查看到发件人使用的PC主机名称、邮箱客户端,发送的IP地址,发送的SMTP协议配置情况等信息。

EML邮件内容可以带格式,带格式的EML邮件内容其实质是HTML标记字符串,因此可以使用HTML处理库对格式化的邮件内容进行处理。

如下图所示的是TXT文本字符串:

下图所示的是HTML格式化的文本字符串:

如果我们希望修改邮件内容,并保留原格式,则需要修改HTML格式化的邮件内容,此时需要将HTML解析出来,如下图所示:

为了便于编辑邮件内容,可以将HTML中的文本内容提取出来,修改后,将源文本的格式化标签应用到新文本上。下图所示的为修改内容界面:

附件内容是直接嵌入到EML文件中的,可以从中解析出来,包括文件名称、传输编码格式、文件类型,并可以将文件内容提取出后保存到本地磁盘中。

信息提出出后,可以进行编辑,包括发件人、收件人这些基本信息,也可以套用源格式编辑邮件正文内容,添加、删除邮件附件。

解析HTML格式化的邮件正文,使用HtmlAgilityPack库处理,此外可以使用Winista.HtmlParser。

 Lexer lexer = new Lexer(html);
 Parser parser = new Parser(lexer);
 NodeList htmlNodes = parser.Parse(null);
if (htmlNode is ITag)//html节点
            {
                ITag tag = (htmlNode as ITag);
                if (!tag.IsEndTag())
                {
                    string nodeString = tag.TagName;
                    if (tag.Attributes != null && tag.Attributes.Count > 0)
                    {
                        if (tag.Attributes["ID"] != null)
                        {
                            nodeString = nodeString + " { id=\"" + tag.Attributes["ID"].ToString() + "\" }";
                        }
                        if (tag.Attributes["HREF"] != null)
                        {
                            nodeString = nodeString + " { href=\"" + tag.Attributes["HREF"].ToString() + "\" }";
                        }
                    }
                    current = new TreeNode(nodeString);
                    treeNode.Nodes.Add(current);
                }
            }

另,

有需要办公辅助等工具开发的朋友,可以联系我,探讨工作中遇到问题的解决方案。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用NOPI读取Word、Excel文档内容

    使用NOPI读取Excel的例子很多,读取Word的例子不多。 Excel的解析方式有多中,可以使用ODBC查询,把Excel作为一个数据集对待。也可以使用文档...

    用户1637609
  • Fortify Audit Workbench 笔记 Dynamic Code Evaluation: Code Injection

    许多现代编程语言都允许动态解析源代码指令。 这使得程序员可以执行基于用户输入的动态指令。 当程序员错误地认为由用户直接提供的指令仅会执行一些无害的操作时(如对当...

    用户1637609
  • Ora-03113\Ora-03114与Oracle In 拼接字符串的问题

    刚深入接触Oracle不久(大学里以及刚参加工作时学到的Oracle知识只能算是皮毛),因为之前使用SqlServer有将近两年的时间,对SqlServer相对...

    用户1637609
  • Ubuntu中开启ssh允许root远程ssh登录的方法

    飞奔去旅行
  • 无需 sendmail:巧用 LD_PRELOAD 突破 disable_functions

    *本文原创作者:yangyangwithgnu,本文属FreeBuf原创奖励计划,未经许可禁止转载

    FB客服
  • 一步步实施 DevOps (五)

    本章节重点谈自动化部署,每个人对自动化部署都有自己的理解,每个企业对自动化部署的需求也不同。

    netkiller
  • 一步步实施 DevOps (五)

    本章节重点谈自动化部署,每个人对自动化部署都有自己的理解,每个企业对自动化部署的需求也不同。

    netkiller
  • go语言数据结构 环形队列

    队列是一种常用的数据结构,这种结构保证了数据是按照“先进先出”的原则进行操作的,即最先进去的元素也是最先出来的元素.环形队列是一种特殊的队列结构,保证了元素也是...

    李海彬
  • 20181202_ARTS_week23

    ES6: Understanding the destructuring assignment syntax in Javascript

    Bob.Chen
  • 超高清论坛(UHD Forum)技术指南V2.0

    本文将对UHD-Forum Guidelines v2.0的主要内容做一个综述,在文末会附上文档的目录,具体的文件细节,可以参见上方的链接。

    用户1324186

扫码关注云+社区

领取腾讯云代金券