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-09-28 00:03:21

    shiro的session共享,持久化

     shiro的session创建与session的查询、更新、过期、删除中,shiro对session的操作基本都讲到了,但还缺一个session共享没有讲解;session共享的原理其实在自定义session管理一文已经讲过了,本文不讲原理,只看看shiro的session共享的实现。

  • 2019-09-28 08:00:30

    Java.io.tmpdir介绍

    System.getproperty(“java.io.tmpdir”)是获取操作系统缓存的临时目录,不同操作系统的缓存临时目录不一样,

  • 2019-09-28 08:36:43

    Ehcache配置持久化到硬盘,只存储到硬盘

    Ehcache默认配置的话 为了提高效率,所以有一部分缓存是在内存中,然后达到配置的内存对象总量,则才根据策略持久化到硬盘中,这里是有一个问题的,假如系统突然中断运行 那内存中的那些缓存,直接被释放掉了,不能持久化到硬盘;这种数据丢失,对于一般项目是不会有影响的,但是对于我们的爬虫系统,我们是用来判断重复Url的,所以数据不能丢失;

  • 2019-09-28 09:33:18

    put与putIfAbsent区别

    put在放入数据时,如果放入数据的key已经存在与Map中,最后放入的数据会覆盖之前存在的数据, 而putIfAbsent在放入数据时,如果存在重复的key,那么putIfAbsent不会放入值。