背景

后台问我能不能前端直接解析 eml 文件,项目是 Vue , 首先想到能不能 npm 找个包解析


过程

  1. 首先上 npmjs 直接搜 eml , 找到了一个 eml-format
  2. 了解 quoted-printable 编码,随后发现我从QQ邮箱导出的 eml 文件是 GB2312 编码,因为之前对编码不熟悉, JS 也没有直接对它解码的方法,想用 JS 原生的编解码方法也没弄好
  3. 最后找到一个 js对中文进行gb2312/gbk编码解码 , 确定从里面下载的 js 文件确实可以解码 GB2312 编码,于是稍作修改之后放到项目中引用,解析如下:

    
    // 这里的 attachments 是我直接用 eml-format  对字符串解析得到的对象里获取到的内容属性
    // 但是使用请求工具, 如 axios , 其get方法直接获取服务器上的 eml 文件,返回的字符串保险起见再 .toString() 一下,再用 eml-format 解析,这时格式会发生变化,内容属性不一定是 attachments , 甚至不一定是数组, 具体情况具体分析
    temp.attachments.map(item => {let tempData = item.data;tempData = tempData.slice(tempData.indexOf('Transfer-Encoding: quoted-printable') + 'Transfer-Encoding: quoted-printable'.length); // 去掉多余数据tempData = tempData.replace(/=\r\n/g, ''); // 去除 quoted-printable 行末等号,以免影响汉字匹配let reg = /((=[0-9|A-F]{2}){2})/g; // GB2312 汉字检测,连续两个 '=xx' 才能解析为一个汉字tempData = tempData.replace(reg, function (str, a) {return gbDecode.decode(a.replace(/=/g, '%'));}); // 转换汉字tempData = tempData.replace(/(=[0-9|A-F]{2})/g, function (str, a) {return gbDecode.decode(a.replace(/=/g, '%'));}); // 转换符号(剩余的单个 '=xx')item.data = tempData;
    });
  4. 但是之后我在搜索 GB2312 时发现了一个更好的包, emailjs-mime-codec ,于是新的解析代码如下:

    
    // 引入
    import * as emlFormat from 'eml-format';
    import * as Codec from 'emailjs-mime-codec';// 项目里用的 axios ,这里就跟着用了
    // this.emlData 是 vue 的用法, 用它之前我已在 vue 定义了这个变量
    axios.get('服务器请求url').then(response => {this.emlData = response.data.toString(); // 不 .toString() 可能有些稀奇古怪的问题this.emlData = this.emlData.replace(/(=\?[\s\S]*?\?=)/g, function (str, a) { // 正则替换一些地方(目前只发现了 subject 邮件主题是这样)的 =?...?= return escape(Codec.mimeWordsDecode(a)); // 返回解码后又被 escape 编码的字符串,另外大家都说 escape 弃用了,那看要不要换成 encodeURI 吧  });
    });// 这个 parsedEmlData 是在 vue 的 computed 定义的计算属性,可以根据 this.emlData 的变化而动态调用 下面的 getter 函数,函数返回新值
    parsedEmlData: function () {let temp = this.emlData;temp = Codec.quotedPrintableDecode(temp, 'GB2312'); // 整体解码,替换原来的手动正则匹配let returnValue = {};emlFormat.read(temp, (err, data) => {if (err) {console.log(err);} else {data.subject = unescape(data.subject); // 把之前的 escape 编码的数据解码回中文,不走这一步整体解码后这里很可能不会被解码,还有些其他原因,有兴趣的可以试试,同理,之前用 encodeURI 的话这里就用 decodeURIreturnValue = data;}});return returnValue;
    }
    

后续

后台说这个只是储备,他们有接口可以返回后台解析的数据……


其他

escape,encodeURI,encodeURIComponent有什么区别? - 水乙的回答 - 知乎

npm 包解析 eml 文件相关推荐

  1. 使用Node解析EML文件

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

  2. Java解析eml文件工具类

    依赖 <!-- https://mvnrepository.com/artifact/javax.mail/mail --><dependency><groupId> ...

  3. java解析eml文件_使用JavaMail解析EML文件

    Java 当我们在outlook中保存一个邮件是可以存成eml格式,这种格式是标准的邮件格式. 这种文件可以用JavaMail来解析. import java.util.*; import java. ...

  4. python 解析 eml文件

    #-*- encoding: gb2312 -*- import email fp = open('xxxx.eml', "r") msg = email.message_from ...

  5. java eml解析_javamail 收邮件 解析eml文件

    内容来自:http://www.oschina.net/bbs/thread/528 以下代码经过测试了的能通过 我在用javaMail做收邮件时怎么邮件内容重复(一种文本格式的,一种html格式的) ...

  6. Java实现eml文件的解析

    最近在做邮件归档,然后需要解析邮件导出的eml,记录每封邮件的归档时间,发件人.标题.发件时间.归档的目录 以下是一个demo示例:待完成此功能后再优化后续代码 import java.io.File ...

  7. 从零开始发布自己的NPM包

    大家好,我是若川.持续组织了6个月源码共读活动,感兴趣的可以点此加我微信 ruochuan02 参与,每周大家一起学习200行左右的源码,共同进步.同时极力推荐订阅我写的<学习源码整体架构系列& ...

  8. C# 操作.eml文件

    前段时间做了个关于邮件的东西,记录一下如何解析和保存eml文件的. /// <summary>         /// 解析eml         /// </summary> ...

  9. 从 vue-cli 源码中,我发现了27行读取 json 文件有趣的 npm 包

    1. 前言 大家好,我是若川.最近组织了源码共读活动,感兴趣的可以加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步.已进行四个月了,很多小伙伴表示收获颇丰. 想学源码 ...

  10. 编程模板-R语言脚本写作:最简单的统计与绘图,包安装、命令行参数解析、文件读取、表格和矢量图输出

    写在前面 个人认为:是否能熟悉使用Shell(项目流程搭建)+R(数据统计与可视化)+Perl/Python等(胶水语言,数据格式转换,软件间衔接)三门语言是一位合格生物信息工程师的标准. 之前分享过 ...

最新文章

  1. 2.爬虫的Python基础
  2. 4.IE故障[网页打不开]的解决方法:
  3. IOS学习动画二之 Core Animation (3)
  4. Android APP破解利器Frida之反调试对抗
  5. Redis中的可用性保证之Sentinel的Ratf 算法
  6. Angular 内容投影 content projection 关于条件渲染问题的单步调试
  7. [Qt入门]QTreeWidget控件创建
  8. Windows10 64位 安装 Postgresql 数据库
  9. DataBase 之 数据库设计六大范式
  10. 计算机网络之TCP报文
  11. 22000字深入研究消费电子光学传感器行业
  12. 使用bat注册ocx
  13. linux服务源码安装ruby
  14. Android面试准备复习之Android知识点大扫描 .
  15. LeetCode_1905_连续子数组的最大和
  16. 来自2018年最后的瞎扯——从“空间”到“强人工智能”
  17. 操作iOS模拟器命令(xcrun simctl)
  18. 人人商城,资金转账功能开发,让余额可以在会员中心自由流通
  19. java pdf添加透明水印_如何使用PDF编辑工具在PDF文件中添加透明水印
  20. 2021年第十二届蓝桥杯模拟赛(第四期)题目和解析

热门文章

  1. 上海小伙三次成功创业,资产达上十亿被称为“创业神童”
  2. 三级等保 MySQL8.0.24审计日志功能开启
  3. 嘉应大学黄林鑫计算机学院,林鑫-中国科学院大学-UCAS
  4. Spring bean销毁的过程
  5. Greenplum小把戏 - 简单函数实现URL解码(URL Decode)- 同样适用于Deepgreen和PostgreSQL...
  6. php 图片效果代码,php实用图片水印效果代码
  7. mmdetection源码笔记(一):train.py解读
  8. 云服务器如何创建快照?
  9. 培根芦笋卷+蚝油家常豆腐+春笋甜椒拌饭
  10. mysql 错误 1548_mysql报错1548-Cannot load from mysql.proc. The table is probably corrupted