npm 包解析 eml 文件
背景
后台问我能不能前端直接解析 eml
文件,项目是 Vue
, 首先想到能不能 npm
找个包解析
过程
- 首先上 npmjs 直接搜
eml
, 找到了一个eml-format
包 - 了解
quoted-printable
编码,随后发现我从QQ邮箱导出的eml
文件是GB2312
编码,因为之前对编码不熟悉, JS 也没有直接对它解码的方法,想用 JS 原生的编解码方法也没弄好 最后找到一个 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; });
但是之后我在搜索
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 文件相关推荐
- 使用Node解析EML文件
文章目录 什么是EML文件 实现EML导入 就这? winmail.dat 编码 什么是EML文件 通过的说,电子邮件导出后的文件格式就是.eml文件,比如使用outlook.163邮箱等等电子邮件程 ...
- Java解析eml文件工具类
依赖 <!-- https://mvnrepository.com/artifact/javax.mail/mail --><dependency><groupId> ...
- java解析eml文件_使用JavaMail解析EML文件
Java 当我们在outlook中保存一个邮件是可以存成eml格式,这种格式是标准的邮件格式. 这种文件可以用JavaMail来解析. import java.util.*; import java. ...
- python 解析 eml文件
#-*- encoding: gb2312 -*- import email fp = open('xxxx.eml', "r") msg = email.message_from ...
- java eml解析_javamail 收邮件 解析eml文件
内容来自:http://www.oschina.net/bbs/thread/528 以下代码经过测试了的能通过 我在用javaMail做收邮件时怎么邮件内容重复(一种文本格式的,一种html格式的) ...
- Java实现eml文件的解析
最近在做邮件归档,然后需要解析邮件导出的eml,记录每封邮件的归档时间,发件人.标题.发件时间.归档的目录 以下是一个demo示例:待完成此功能后再优化后续代码 import java.io.File ...
- 从零开始发布自己的NPM包
大家好,我是若川.持续组织了6个月源码共读活动,感兴趣的可以点此加我微信 ruochuan02 参与,每周大家一起学习200行左右的源码,共同进步.同时极力推荐订阅我写的<学习源码整体架构系列& ...
- C# 操作.eml文件
前段时间做了个关于邮件的东西,记录一下如何解析和保存eml文件的. /// <summary> /// 解析eml /// </summary> ...
- 从 vue-cli 源码中,我发现了27行读取 json 文件有趣的 npm 包
1. 前言 大家好,我是若川.最近组织了源码共读活动,感兴趣的可以加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步.已进行四个月了,很多小伙伴表示收获颇丰. 想学源码 ...
- 编程模板-R语言脚本写作:最简单的统计与绘图,包安装、命令行参数解析、文件读取、表格和矢量图输出
写在前面 个人认为:是否能熟悉使用Shell(项目流程搭建)+R(数据统计与可视化)+Perl/Python等(胶水语言,数据格式转换,软件间衔接)三门语言是一位合格生物信息工程师的标准. 之前分享过 ...
最新文章
- 2.爬虫的Python基础
- 4.IE故障[网页打不开]的解决方法:
- IOS学习动画二之 Core Animation (3)
- Android APP破解利器Frida之反调试对抗
- Redis中的可用性保证之Sentinel的Ratf 算法
- Angular 内容投影 content projection 关于条件渲染问题的单步调试
- [Qt入门]QTreeWidget控件创建
- Windows10 64位 安装 Postgresql 数据库
- DataBase 之 数据库设计六大范式
- 计算机网络之TCP报文
- 22000字深入研究消费电子光学传感器行业
- 使用bat注册ocx
- linux服务源码安装ruby
- Android面试准备复习之Android知识点大扫描 .
- LeetCode_1905_连续子数组的最大和
- 来自2018年最后的瞎扯——从“空间”到“强人工智能”
- 操作iOS模拟器命令(xcrun simctl)
- 人人商城,资金转账功能开发,让余额可以在会员中心自由流通
- java pdf添加透明水印_如何使用PDF编辑工具在PDF文件中添加透明水印
- 2021年第十二届蓝桥杯模拟赛(第四期)题目和解析
热门文章
- 上海小伙三次成功创业,资产达上十亿被称为“创业神童”
- 三级等保 MySQL8.0.24审计日志功能开启
- 嘉应大学黄林鑫计算机学院,林鑫-中国科学院大学-UCAS
- Spring bean销毁的过程
- Greenplum小把戏 - 简单函数实现URL解码(URL Decode)- 同样适用于Deepgreen和PostgreSQL...
- php 图片效果代码,php实用图片水印效果代码
- mmdetection源码笔记(一):train.py解读
- 云服务器如何创建快照?
- 培根芦笋卷+蚝油家常豆腐+春笋甜椒拌饭
- mysql 错误 1548_mysql报错1548-Cannot load from mysql.proc. The table is probably corrupted