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邮箱,否则该网站对这个邮箱不识别


  • 2018-02-17 18:51:26

    Context都没弄明白,还怎么做Android开发?

    作为Android开发者,不知道你有没有思考过这个问题,Activity可以new吗?Android的应用程序开发采用JAVA语言,Activity本质上也是一个对象,那上面的写法有什么问题呢?估计很多人说不清道不明。

  • 2018-02-17 23:33:20

    NestedScrollView+Recyclerview下滑卡顿解决方法

    大家在进行安卓开发用到NestedScrollView+Recyclerview的时候,经常出现的情况就是加载下滑的时候没有任何问题,很流畅,但是在下滑以后明显出现了卡顿的情况,小编根绝这个问题,给大家再来的解决方法,一起来学习下。

  • 2018-02-23 14:15:42

    mysql的取整函数

    ROUND(X) -- 表示将值 X 四舍五入为整数,无小数位 ROUND(X,D) -- 表示将值 X 四舍五入为小数点后 D 位的数值,D为小数点后小数位数。若要保留 X 值小数点左边的 D 位,可将 D 设为负值。

  • 2018-02-23 14:22:50

    mysql的yearweek 和 weekofyear函数

    例如 2010-3-14 ,礼拜天 SELECT YEARWEEK('2010-3-14') 返回 11 SELECT YEARWEEK('2010-3-14',1) 返回 10 其中第二个参数是 mode ,具体指的意思如下: Mode First day of week Range Week 1 is the first week … 0 Sunday 0-53 with a Sunday in this year 1 Monday 0-53 with more than 3 days this year 2 Sunday 1-53 with a Sunday in this year 3 Monday 1-53 with more than 3 days this year 4 Sunday 0-53 with more than 3 days this year 5 Monday 0-53 with a Monday in this year 6 Sunday 1-53 with more than 3 days this year 7 Monday 1-53 with a Monday in this year 2.

  • 2018-02-23 17:20:44

    Mysql数据库If语句的使用

    MySQL的if既可以作为表达式用,也可在存储过程中作为流程控制语句使用,如下是做为表达式使用:

  • 2018-02-24 10:16:36

    Java工具类之Apache的Commons Lang和BeanUtils

    Apache Commons包估计是Java中使用最广发的工具包了,很多框架都依赖于这组工具包中的一部分,它提供了我们常用的一些编程需要,但是JDK没能提供的机能,最大化的减少重复代码的编写。