node开发邮件系统总结

2020-12-07 15:04:03

node 开发一个邮件系统需要用到的东西

参考连接 利用electron-vue技术实现一个邮箱客户端应用的项目总结


1.electron-vue是利用Chromium浏览器、vue-cli脚手架和nodejs来实现跨平台的桌面应用程序
    使用electron-packager或electron-builder打包应用程序,electron-packager打包方式比较简单,想为哪个平台打包,
    执行相应命令即可;electron-builder,自动化部署,持续集成,只要监测github上绑定的代码仓库发生了变化,即可打包发布。

2.读取邮件的方式

    smtp协议:是一种基于文本的电子邮件传输协议,只能用于邮件服务器之间交换邮件。
    pop3协议:允许电子邮件客户端下载服务器上的邮件,但不是一个同步的操作,它只是下载了服务器邮件的一个副本,因此服务器上邮件有其他操作时,不会同步到客户端。
    imap协议:与pop3协议类似,都允许客户端来下载,但它是一个同步的过程,服务器端有了更改,同时客户端也会有相应的改变。
   smtp用来发送邮件,pop3和imap都用来接收邮件

3.接收邮件 --- node-imap是一个 node.js版本的IMAP客户端模块

    详情请查看网址:http://www.8dou5che.com/2018/03/23/node-imap/

4.解析邮件的编码方式:

   (1)、iconv-lite实现编码的转换,因为node只支持utf-8,没有提供原生转码的方式,故必须利用该模块,
           转换为GBK编码
 (2)、content-type的分类:
       i、text,主要有text/html和text/plain,内容需要用Content-Transfer-Encoding解码,常见传输编码为base64和quoted-printable
       ii、multipart,又分为mixed、alternative和related。
             mixed是有附件的类型
             alternative是纯文本和超文本同时存在的类型
             related是资源内嵌类型,如内容为html,但html里有图片,把图片提取出来以附件形式发送

          因为multipart这种形式比较复杂,因此要利用boundary分割符,将邮件体分割成不同段来进行解析,boundary分为父段和子段,父段一般出现0次或1次,出现在末尾,每个子段中也有content-type和boundary,需要在进行解析,如果遇到i,iii里面的情况可直接解析,如果遇到ii中的情况,再按ii中的步骤进行解析
        iii、image、application,一般是出现在附件中的格式
    (3)、quoted-printable可译为"可打印字符引用编码",其编码方法为:
          i、任何一个8位的字节值都可以编码为3个字符:=后跟随两个十六进制数字(0-9或A-F)
          ii、所有可打印ASCII字符(十进制范围为33到126)都可用ASCII字符编码来直接表示,但'='只能表示为'=3D'
          iii、tab与空格符的十进制为9和32,如果不出现在行尾则可以用其ASCII编码直接表示,如果这两个字符出现在行尾,则必须按照QP的编码要求,表示为'=09'和'=20'
          iv、QP的编码数据每行长度不能超过76个字符,因此在每行末尾加上一个'='表示结束
     (4)、base64编码方式:
         i、base64利用64个可打印字符来表示二进制数据(A-Za-z0-9+/)
         ii、将索引转换为对应的二进制数据需要6个bit,而ASCII码需要8个bit来表示,但是4*6个bit可以存储3*8个bit,将其转换为对应的6个bit
         iii、在6个bit的高位补0,变成8个bit,转换成对应的base64字符
         iv、如果不是对应的倍数时,就用0补齐,变成8个bit,表示成对应的base64编码,如果8个bit都为0则表示为=

5.发送邮件 --- nodemailer

   详情请查看网址:https://segmentfault.com/a/1190000011045384

6.注意事项

  在登录时必须在邮箱中开启pop3或imap服务,使用授权码登录,而不是使用你的邮箱密码登录

  使用qq邮箱时直接使用授权码登录即可,但是用网易邮箱有限制。使用网易邮箱登录第三方客户端时,由于网易邮箱的限制,无法登录第三方客户端,只能使用如下网址:http://config.mail.163.com/settings/imap/login.jsp?uid=lw140912@163.com,且使用该网址时要先先注册一个带字母的163邮箱,不能使用手机号注册的163邮箱,否则该网站对这个邮箱不识别


  • 2019-12-23 23:38:59

    vue-apollo的多客户端的用法

    vue-apollo的多客户端的用法以及apollo.js的配置 关于如何安装和如何使用,这篇文章就先暂时不介绍了,如果不清楚就看我另一篇关于vue-apollo的用法 在做项目中,有时候后端的接口是按模块功能去划分的,那么请求的地址就会不同,关于vue-apollo的多客户端配置如下

  • 2019-12-27 08:40:55

    align-self和align-items的区别

    align-items在伸缩容器上使用它,伸缩容器内部所有的元素都一致地受制于align-items的值。 但是有些时候,我们希望伸缩容器内部某个元素在侧轴上的排列方式有所差异。此时就不能使用 align-items,因为align-items作用于整体。我们希望作用于部分。这就是align-self的发挥场地。

  • 2019-12-29 15:01:37

    修改laravel分页的样式

    首先获取到数据,paginate方法 能够自动判定当前页面正确的数量限制和偏移数。默认情况下,当前页数由HTTP 请求所带的 ?page 参数来决定。当然,该值由 Laravel 自动检测,并自动插入由分页器生成的链接。

  • 2019-12-29 15:05:57

    php 数组分页 array_slice()函数用法

    今天用到一个函数,非常好用,分享给大家 array_slice() -从数组中取出一段 也就是说用这个函数可以和sql语句一样实现分页,原理是将查询出的数组,取出从指定下标开始到指定长度的数组

  • 2019-12-30 10:17:21

    router-link传递参数,query

    在vue-router中,有两大对象被挂载到了实例this; $route(只读、具备信息的对象); $router(具备功能的函数) 查询字符串: 去哪里 ? <router-link :to="{name:'detail',query:{id:1}}"> xxx </router-link>

  • 2019-12-30 16:48:41

    vue provide/inject详解和用法

    父子组件交互方式多种,props、vuex、 、 emit、localStorage还有就是这个provide/inject了。它适合层级比较深的组件,比如子,子孙,子孙后代的组件有好几个用到父组件的某个属性,就可以用到这个provide/inject,它可以避免写大量繁琐的传值代码 我这里为什么要使用它? 我一个知识库详情父组件中包含了大量的子组件,每个子组件都需要父组件的知识库ID,这时候我不想写大量props,就用到provide/inject进行传值了