使用Node解析EML文件

2023-11-14

什么是EML文件

通过的说,电子邮件导出后的文件格式就是.eml文件,比如使用outlook163邮箱等等电子邮件程序将电子邮件导出后,就可以得到.eml文件,EML文件应该符合RFC 5322规范,这样EML文件就可以在不同的邮件客户端之间流通。

也就是说,使用163邮箱客户端导出的eml文件,完全可以在Ooutlook中『基本一致』的打开

之所以说基本一致,因为还是有很多兼容性问题要处理,而且很多邮箱客户端还有独有的私有协议内容,对应的样式在其他邮箱客户端只能以基本的样式进行展示

以163邮箱为例,如下图,将邮件导出,就得到了预约直播,听专家分享《面向大规模数据的云端管理,百度沧海·存储产品解析》.eml文件
在这里插入图片描述
使用邮箱大师,就可以将这个文件导入,并进行展示:
在这里插入图片描述
展示与原邮件基本是一致的
在这里插入图片描述

实现EML导入

在我们的灵犀办公客户端上,也要实现这个导入EML文件的功能,这个功能有现成的库来支持,可选择的有三个库:

三个工具使用的解析的结果大同小异,我们选用的是MailParser(额外说一句,NodeMailer功能非常强大,可以用它构建一个自己的邮件收发系统)

按照文档很容易就能实现一个简单的EML解析器:

const fse = require('fs-extra');
const simpleParser = require('mailparser').simpleParser;

function parseEml(filePath) {
   
  return fse.stat(filePath).then(() => {
   
    return fse.readFile(filePath).then((file) => {
   
      return simpleParser(file);
    });
  });
}

解析的结果包含了下面的字段:
在这里插入图片描述
在我们的系统中,根据这些属性,可以构造出一个完整的MailEntitiy结构,用于完成常规的服务端返回的邮件数据解析流程。到此解析就流程就完了。

就这?

当然不是,为了提高解析性能,我们还在客户端本地的数据库,使用文件地址和文件名称组合为key,在本地数据库记录了结果。当然这都是小优化,直到功能上线后,QA报了一个线上问题,有一封邮件,我们的客户端打开后,样式乱了,结果如下:
在这里插入图片描述
导入导服务端之后却是正常的
在这里插入图片描述
用邮箱大师也是正常的,那我们出了什么问题呢?

用MailParser解析之后,发现解析的结果里面,attachments是有值的,而htmlfalsetext里面就是我们的客户端解析后的数据,并没有相应的内联样式:
在这里插入图片描述
一开始以为是参数的问题,一通调试后发现然并卵,后来以为是编码的问题,因为这封邮件的charsetgb2312,结果发现也没有用(虽然后面编码还是要处理的)

咨询了服务端的同学,他给出的答案一针见血,邮件的附件里面是不是有一个dat附件,需要对dat附件进行二次解析才可以

winmail.dat

winmai.dat是Microsoft Outlook是特殊格式附件,如果Outlook寄出富文本格式的信件,其他邮件客户端收到的时候,就会产生这个文件。真正的内容和样式实际上都是在这个附件中。
在这里插入图片描述

所以需要对这个文件进行二次解析,在NPM上找到了node-tnef这个工具,使用它就可以解析winmai.dat附件。由于我们在解析eml文件时,附件已经是Buffer格式的数据了,所以直接使用tnef.parseBuffer这个方法就可以,得到的content里面包含了BodyHTML数据,把这个带有样式的富文本数据格式赋值给eml解析后的html字段(原本是false)就可以解析出正确的数据了

function handleDatAttachments(parsedMail, encoding) {
   
  const datAttach = parsedMail.attachments.find(
    (v) => v.contentType === 'application/ms-tnef' && v.filename && v.filename.endsWith('dat')
  );
  if (datAttach) {
   
    return new 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Node解析EML文件 的相关文章

  • engine.io 与 socket.io 有何不同?

    LearnBoost 似乎有一个新项目叫做引擎 io https github com LearnBoost engine io理论上似乎与socket io 类似 1 在什么情况下您会使用其中一种而不是另一种 2 对于需要通过node j
  • 如何对 NestJS 中的控制器应用防护进行单元测试?

    我在 NestJS 中配置了一个控制器 我想检查是否设置了适当的防护 有人有如何完成此操作的示例吗 这个 删节的 示例作为一个应用程序可以正常工作 所以我只是在测试指导之后 您会注意到在用户测试中有一些我正在调用的测试Reflect get
  • Express JS:请求的资源上不存在“Access-Control-Allow-Origin”标头

    我有一个在服务器上运行的 API 和一个连接到它以检索数据的前端客户端 我对跨域问题做了一些研究并使其发挥作用 但我不确定发生了什么变化 我现在在控制台中收到此错误 XMLHttpRequest 无法加载https api mydomain
  • 如何在socket.io Nodejs服务器上列出房间

    在问题取得进展后如何创建socket io多播组 https stackoverflow com questions 6616922 how to create socket io multicast groups 6624604 6624
  • 如何停止 PythonShell

    如何终止 停止 Node js 中 PythonShell 执行的 Python 脚本的执行 我在交互模式下运行 输出通过 socket io 发送到给定的房间 如果没有更多的客户端连接到这个房间 我想停止 python 脚本的执行 这是我
  • 电子邮件模板中的剪贴板功能

    我想在电子邮件模板中发送优惠券代码 一个小按钮 用于复制剪贴板上输入元素的内容 通过电子邮件模板 我的意思是我想发送一封电子邮件 其中包含优惠券代码 并且电子邮件模板中会有一个按钮 允许我将其复制到剪贴板 这可以做到吗 任何帮助将不胜感激
  • 使用 Node.js 访问用 C++ 编写的 SDK

    我有一个用 C 语言编写的 SDK 可以与我的扫描仪设备进行通信 我需要开发一个可以访问扫描仪设备的电子应用程序 我知道有很多库可用于扫描仪 但我想使用这个 SDK 因为它允许我访问设备的完整功能 而且它是由设备制造商提供的 那么 有没有什
  • NPM 如何处理版本冲突?

    由于 NPM 版本 3 节点模块和依赖项都安装在同一根级别 但是 如果我安装两个依赖于同一模块的两个不同版本的模块怎么办 例如 如果我安装异步npm i email protected cdn cgi l email protection
  • AWS Lambda 上的 NodeJS 集群

    是否可以在 lambda 函数中使用 cluster 模块 我试过这个 use strict var cluster require cluster var http require http var os require os var n
  • 阻止 Mongoose 为子文档数组项创建 _id 属性

    如果您有子文档数组 Mongoose 会自动为每个子文档创建 id 例子 id mainId subDocArray id unwantedId field value id unwantedId field value 有没有办法告诉 M
  • MongoDB 中两个集合之间的 Diff()

    我做过研究 如果这是一个重复的问题 我很抱歉 但其他问题的解决方案并不适合我 因此 我提出了一个新问题 使用 Javascript 比较两个集合的最佳方法是什么 我有数千个这样的 Mongo 文档格式的标头 url google com h
  • 对自定义打字稿错误实例实施instanceof检查?

    打字稿有这个instanceof 检查自定义错误 https github com Microsoft TypeScript issues 13965问题 但尚不清楚我们需要做什么才能得到instanceof在职的 例如对于这个异常我们如何
  • 如何执行密集的 Node.js 计算

    我正在开发一个电子商务应用程序 每次产品从服务器发送到客户端时都必须重新计算产品的定价 每次发送多达数千个产品 计算部分本身相当密集 因为它需要多个数据库查询来计算 我的简单解决方案是将计算部分抽象到另一个专门用于计算的 Node js 应
  • 从 Node.js 调用 execl、execle、execlp、execv、execvP 或 execvp 的方法

    POSIX 系统公开了一系列exec函数 允许人们将可能不同的东西加载到当前进程中 保留打开的文件描述符 进程标识符等 可以出于多种原因执行此操作 在我的情况下 这是引导 我想更改我自己的进程的命令行选项 然后在现有进程上重新加载它 这样就
  • Node.js 请求随机开始挂起,直到服务器重新启动后才会清除

    我在我们的网络应用程序上遇到了一个非常奇怪且看似随机的问题 我似乎无法成功调试 它可以正常运行 10 分钟到 6 小时 然后突然无法向服务器发出或从服务器发出远程请求 它们只是挂起 这包括常规的 http 和 Web 套接字请求 奇怪的是
  • react-native-screens:compileDebugKotlin 错误

    失败 构建失败并出现异常 什么地方出了错 任务 react native screens compileDebugKotlin 执行失败 评估任务 react native screens compileDebugKotlin 的属性 fi
  • Node.js - 异步 JSON 查询

    如果这是一个愚蠢的问题 我深表歉意 但我对 Javascript 很陌生 而 Node js 确实让我很头疼 因为它是异步的 我的目标是从 API 查询 JSON 对象并能够使用它 我试图寻找关于我应该做什么的问题和答案 但它们对我来说都没
  • Node.js 进行 rsa 加密的正确方法?

    我正在尝试创建一个 WS 来发出肥皂请求 在消息正文中有一个包含加密文本的字段 我有公钥来加密文本 但我获得的唯一结果是文本无法识别 我使用节点的加密模块来发出请求 并且文本已加密 但我不知道为什么没有正确加密 PS我用 openssl p
  • 不要在查询字符串 stringify 中对 url 进行编码

    有什么选择吗qs stringify那将not对网址进行编码 node gt var qs require querystring undefined gt qs stringify url http domain com url http
  • 对于单主机 Node.js 生产应用程序来说,什么是好的会话存储? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话

随机推荐

  • 一个中年程序员的10年测试人生,进阶测试专家必备5项技能!

    测试架构师成长线路图 第一步 成为互联网时代合格的测试工程师 如果你是入行不满3年的测试工程师 一定对此有迫切需求 此时 你必须迅速掌握被测软件的业务功能与内部架构 并在此基础上运用各种测试方法 尽可能多地发现潜在缺陷 并能够在已知缺陷的基
  • 无符号数 有符号数 与 补码

    无符号数 有符号数 与 补码 本文是深入理解计算机系统这本书里面关于补码有符号数无符号数章节的一个摘要和读书报告 我个人认为这本书关于这一段的表述 要比绝大多数网上的博客甚至是国内教材要深入浅出的多 同时由于markdown的文档表示公式很
  • vue中的动态路由怎么配置

    如何定义动态路由 如何获取传过来的动态参数 一 param方式 配置路由格式 router id 传递的方式 在path后面跟上对应的值 传递后形成的路径 router 123 1 定义路由 在APp vue中
  • 2.2.1 数据结构——矩阵结构、数组结构与数据框

    创建矩阵的函数名为 matrix 其基本语法格式为 matrix data NA nrow 1 ncol 1 byrow TRUE 其中data表示矩阵的元素 nrow和ncol分别表示了矩阵的行数和列数 byrow TRUE表示按行填充
  • Java:Spring、Java、MyBatis常用注解

    Spring 给容器IOC中注入组件 控制层 Controller 业务层 Service 数据访问层 Repository 通用 Component 泛指各种组件 Controller Service Repository都可以称为 Co
  • 第2章 核心技术概览

    运用之妙夺造化 存乎一心胜天工 有人可能会遇到这样的问题 跨境商贸合作中签订的合同 怎么确保对方能严格遵守和及时执行 酒店宣称刚打捞上来的三文鱼 怎么追踪捕捞和运输过程中的时间和卫生 现代数字世界里 怎么证明你是谁 怎么证明某个资产属于你
  • 基于直方图优化的图像增强技术(MATLAB实现)

    前言 直方图均衡是一种图像增强的常用手段 但全局直方均衡经常会给图像带来失真等问题 为了处理相关问题 本文采取了全局直方均衡 局部直方均衡和Retinex算法来对图像进行处理 主函数 img imread img tif In1 Remov
  • 大数加法(C++实现)

    最常规的大数加法 两个数都是非负的整数 思路 用字符串的方式去存储我们需要计算的数 但是要注意的一点就是我们是倒过来存储这个大数的 比如 123456789 我们存储的时候是存成 987654321 为什么要这么干 我觉得是为了便于后面我们
  • C++ :websocket 通讯下的五种 I/O 模型

    目录 I O 多路复用 一种同步 I O 模型 非阻塞与阻塞 select poll epoll 起因 改善 select 与 poll 的差别 I O 模型 阻塞 I O 模型 非阻塞 I O 模型 I O 多路复用模型 信号驱动 I O
  • php curl 返回文件头,php curl请求信息和返回信息设置代码实例,特别是在请求过程中存在重定向的时候获取请求返回头信息...

    在用curl抓取网页内容的时候 经常要知道 网页返回的请求头信息 和请求的相关信息 特别是在请求过程中存在重定向的时候获取请求返回头信息对分析请求内容很有帮助 下面就是一个请求中存在重定向的例子 我们的目的是要获取最终实际请求的url地址
  • linux服务器做游戏服务器配置,详解Linux中搭建常用服务器

    1 搭建telnet服务器 2 搭建DHCP服务器 3 搭建 服务器 4 搭建sendmail服务器 5 搭建FTP服务器 6 搭建web服务器 安装 apache tomcat 7 搭建samba服务器 一 搭建telnet服务器 1 查
  • Sorry, The number you dialed is power off.

    对不起 您所拨打的电话正在通话中 请稍后再拨 Sorry The subscriber you dialed is busy now please redial later 您好 您所拨打的号码是空号 请核对后再拨 Sorry The nu
  • RestTemplate使用HttpClient连接池

    文章目录 RestTemplate使用HttpClient连接池 ClientHttpRequestFactory SimpleClientHttpRequestFactory SimpleClientHttpRequestFactory
  • 基于聚类分析和协同过滤算法的营养膳食分析系统的设计与实现

    1 简介 今天向大家介绍一个帮助往届学生完成的毕业设计项目 基于聚类分析和协同过滤算法的营养膳食分析系统的设计与实现 1 协同过滤的算法思想 1 1 基于内容的推荐中不足之处 基于内容的推荐方法用户易于理解 简单有效 但是它的缺点也十分明显
  • 导入QML文档目录

    Importing QML Document Directories 导入QML文档目录 A local directory of QML files can be imported without any additional setup
  • 【1.查看显卡信息2.解决显卡设置不生效问题】

  • Kafka3.0.0版本——消费者(消费者组初始化流程图解)

    一 消费者组初始化流程图解 每个consumer都发送JoinGroup请求 如下图所示 选出一个consumer作为leader 如下图所示 把要消费的topic情况发送给leader 消费者 如下图所示 leader会负责制定消费方案
  • C++ map下标操作[]和insert区别

    在构建map时候 我们是使用insert和 有什么区别呢 哪个更好呢 哪个效率更高呢 哪个更安全呢 首先需要明确的是 map中不允许存在相同的key Because map containers do not allow for dupli
  • conan包管理工具(1)

    conan包管理工具 Conan 是一个开源的 跨平台的 去中心化的 C 包管理器 通过它可以安装 解决构建依赖 更重要的是可以直接集成到 Build System 中使用 同时它也允许你搭建自己的私有仓库 供私有项目使用 具体到细节 当向
  • 使用Node解析EML文件

    文章目录 什么是EML文件 实现EML导入 就这 winmail dat 编码 什么是EML文件 通过的说 电子邮件导出后的文件格式就是 eml文件 比如使用outlook 163邮箱等等电子邮件程序将电子邮件导出后 就可以得到 eml文件