最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node接收電子郵件的實(shí)例代碼

 更新時(shí)間:2017年07月21日 14:53:57   作者:夢(mèng)想.家  
本篇文章主要介紹了Node接收電子郵件,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

上一篇文章寫(xiě)了如何通過(guò)node發(fā)送電子郵件,有發(fā)送就會(huì)有接收嘛,所以這篇文章來(lái)說(shuō)說(shuō)關(guān)于在node中如何接收電子郵件。

郵件協(xié)議

在開(kāi)始這篇文章之前我們首先了解三個(gè)協(xié)議smtp(Simple Mail Transfer Protocol)簡(jiǎn)單郵件傳輸協(xié)議,pop3(Post Office Protocol 3)郵局協(xié)議第三版本,imap(Internet Mail Access Protocol)internet消息訪問(wèn)協(xié)議。

smtp協(xié)議

簡(jiǎn)單郵件傳輸協(xié)議:是一種基于文本的電子郵件傳輸協(xié)議,用于從源地址到目的地址傳輸郵件的規(guī)范,通過(guò)它來(lái)控制郵件的中轉(zhuǎn)方式,是因特網(wǎng)中用于在郵件服務(wù)器之間交換郵件的協(xié)議。SMTP是一個(gè)“推”的協(xié)議,它不允許根據(jù)需要從遠(yuǎn)程服務(wù)器上“拉”來(lái)消息。要做到這點(diǎn),郵件客戶(hù)端必須使用POP3或IMAP。所以發(fā)送郵件的時(shí)候我們需要簡(jiǎn)單的了解下面的這兩種協(xié)議。

pop3協(xié)議

POP3協(xié)議允許電子郵件客戶(hù)端下載服務(wù)器上的郵件,但是在客戶(hù)端的操作(如移動(dòng)郵件、刪除郵件、標(biāo)記已讀等),不會(huì)反饋到服務(wù)器上,比如通過(guò)客戶(hù)端收取了郵箱中的3封郵件并移動(dòng)到其他文件夾,郵箱服務(wù)器上的這些郵件是沒(méi)有同時(shí)被移動(dòng)的。也就是說(shuō)POP3協(xié)議實(shí)際上是下載了一份郵件的副本到本地郵件客戶(hù)端,而且對(duì)本地郵件副本的操作只會(huì)影響本地?cái)?shù)據(jù)。多個(gè)郵件客戶(hù)端里面的郵件的狀態(tài)可能會(huì)不一致。

imap協(xié)議

IMAP(Internet消息訪問(wèn)協(xié)議)也是提供面向用戶(hù)的郵件收取服務(wù)。常用的版本是IMAP4。與POP3協(xié)議類(lèi)似允許電子郵件客戶(hù)端下載服務(wù)器上的郵件,不同的是,開(kāi)啟了IMAP后,您在電子郵件客戶(hù)端收取的郵件仍然保留在服務(wù)器上,同時(shí)在客戶(hù)端上的操作都會(huì)反饋到服務(wù)器上,如:刪除郵件,標(biāo)記已讀等,服務(wù)器上的郵件也會(huì)做相應(yīng)的動(dòng)作。換句話說(shuō),IMAP把遠(yuǎn)程文件夾當(dāng)成本地文件夾來(lái)操作,它們之間類(lèi)似于雙向同步。這樣的好處是,當(dāng)你在多個(gè)郵件客戶(hù)端看見(jiàn)的郵件的狀態(tài)是一致的。本次接收郵件我們也使用此協(xié)議來(lái)實(shí)現(xiàn)。

接收郵件測(cè)試過(guò)程

接收郵件實(shí)際上做的是一個(gè)郵件客戶(hù)端的東西,對(duì)于底層的實(shí)現(xiàn)在npm上有一個(gè)寫(xiě)好的第三的庫(kù)node-imap(node.js的imap客戶(hù)端模塊)這個(gè)模塊幫助我們封裝了很多的底層操作,但是這個(gè)模塊返回的數(shù)據(jù)像附件、消息、郵件頭等都是未解碼的原始數(shù)據(jù),所以還需要對(duì)數(shù)據(jù)進(jìn)行解碼,解碼的模塊在npm上也找到了一個(gè)寫(xiě)好的庫(kù)Mailparser它是一個(gè)node高級(jí)電子郵件解析器,能夠解析即使非常大的數(shù)據(jù)(100MB+),而且開(kāi)銷(xiāo)相對(duì)比較低。

使用imap接收郵件的過(guò)程可以用下面一張圖表示

 imap接收郵件測(cè)試過(guò)程

本次測(cè)試的大概過(guò)程如下

  1. 在pc上登錄qq郵箱
  2. 通過(guò)qq郵箱發(fā)郵件到gamil(不同郵件服務(wù)器之間發(fā)郵件過(guò)程比較復(fù)雜,過(guò)程略)
  3. 在pc上通過(guò)寫(xiě)好的基于imap的程序去拉取gmail的郵件,同時(shí)本地的修改(標(biāo)記郵件,刪除郵件)會(huì)同步到gmail服務(wù)器

安裝node第三方包

npm install --save imap mailparser

郵件接收服務(wù)器我選擇Gmail,發(fā)送郵件的服務(wù)器使用qq郵箱。

使用qq郵箱發(fā)送一封帶有附件的郵件

通過(guò)程序接收郵件

查看附件保存時(shí)否正確

核心代碼

var Imap = require('imap')
var MailParser = require("mailparser").MailParser
var fs = require("fs")

var imap = new Imap({
  user: 'yourname@gmail.com', //你的郵箱賬號(hào)
  password: 'yourpassword', //你的郵箱密碼
  host: 'imap.gmail.com', //郵箱服務(wù)器的主機(jī)地址
  port: 993, //郵箱服務(wù)器的端口地址
  tls: true, //使用安全傳輸協(xié)議
  tlsOptions: { rejectUnauthorized: false } //禁用對(duì)證書(shū)有效性的檢查
});

function openInbox(cb) {
  imap.openBox('INBOX', true, cb);
}

imap.once('ready', function() {

  openInbox(function(err, box) {

    console.log("打開(kāi)郵箱")

    if (err) throw err;

    imap.search(['UNSEEN', ['SINCE', 'May 20, 2017']], function(err, results) {//搜尋2017-05-20以后未讀的郵件

      if (err) throw err;

      var f = imap.fetch(results, { bodies: '' });//抓取郵件(默認(rèn)情況下郵件服務(wù)器的郵件是未讀狀態(tài))

      f.on('message', function(msg, seqno) {

        var mailparser = new MailParser();

        msg.on('body', function(stream, info) {

          stream.pipe(mailparser);//將為解析的數(shù)據(jù)流pipe到mailparser

          //郵件頭內(nèi)容
          mailparser.on("headers", function(headers) {
            console.log("郵件頭信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
            console.log("郵件主題: " + headers.get('subject'));
            console.log("發(fā)件人: " + headers.get('from').text);
            console.log("收件人: " + headers.get('to').text);
          });

          //郵件內(nèi)容

          mailparser.on("data", function(data) {
            if (data.type === 'text') {//郵件正文
              console.log("郵件內(nèi)容信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
              console.log("郵件內(nèi)容: " + data.html);
            }
            if (data.type === 'attachment') {//附件
              console.log("郵件附件信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
              console.log("附件名稱(chēng):"+data.filename);//打印附件的名稱(chēng)
              data.content.pipe(fs.createWriteStream(data.filename));//保存附件到當(dāng)前目錄下
              data.release();
            }
          });

        });
        msg.once('end', function() {
          console.log(seqno + '完成');
        });
      });
      f.once('error', function(err) {
        console.log('抓取出現(xiàn)錯(cuò)誤: ' + err);
      });
      f.once('end', function() {
        console.log('所有郵件抓取完成!');
        imap.end();
      });
    });
  });
});

imap.once('error', function(err) {
  console.log(err);
});

imap.once('end', function() {
  console.log('關(guān)閉郵箱');
});

imap.connect();

默認(rèn)情況下抓取郵件后郵件服務(wù)器的郵件狀態(tài)為未讀,如果要在抓取后讓郵箱服務(wù)器中的郵件狀態(tài)變?yōu)橐炎x,可以修改

var f = imap.fetch(results, { bodies: '' });

var f = imap.fetch(results, { bodies: '', markSeen: true });

參考文檔

查看node-imap詳細(xì)文檔和api請(qǐng)點(diǎn)擊這里

查看Mailparser詳細(xì)文檔請(qǐng)點(diǎn)擊這里

后記

如果google郵箱如果開(kāi)啟了二次認(rèn)證,那么你需要在google后臺(tái)生成一個(gè)專(zhuān)用密碼來(lái)登錄google郵箱拉取郵件。

通過(guò)一個(gè)簡(jiǎn)單的例子實(shí)現(xiàn)了如何使用node和imap協(xié)議來(lái)接收郵件,結(jié)合上篇node發(fā)送電子郵件文章的內(nèi)容,一個(gè)簡(jiǎn)單的郵件客戶(hù)端的基本收信發(fā)信功能就有了,但是想實(shí)現(xiàn)一個(gè)功能完善用戶(hù)體驗(yàn)好的郵件客戶(hù)端就需要不斷揣摩它,設(shè)計(jì)它,完善它,希望這篇文章能帶給你啟發(fā),可以實(shí)現(xiàn)一個(gè)屬于你自己的郵件客戶(hù)端。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • node版本與node-sass版本不兼容時(shí)的問(wèn)題及解決

    node版本與node-sass版本不兼容時(shí)的問(wèn)題及解決

    這篇文章主要介紹了node版本與node-sass版本不兼容時(shí)的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 學(xué)習(xí)Node.js模塊機(jī)制

    學(xué)習(xí)Node.js模塊機(jī)制

    這篇文章主要為大家詳細(xì)介紹了Node.js模塊機(jī)制,一篇關(guān)于Node.js模塊機(jī)制的學(xué)習(xí)筆記,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Node.js中對(duì)通用模塊的封裝方法

    Node.js中對(duì)通用模塊的封裝方法

    這篇文章主要介紹了Node.js中對(duì)通用模塊的封裝方法,封裝方法參考了Underscore.js的實(shí)現(xiàn),需要的朋友可以參考下
    2014-06-06
  • node版本切換與版本升級(jí)降級(jí)教程(win)

    node版本切換與版本升級(jí)降級(jí)教程(win)

    nvm是一個(gè)node的版本管理工具,可以簡(jiǎn)單操作node版本的切換、安裝、查看,下面這篇文章主要給大家介紹了關(guān)于node版本切換與版本升級(jí)降級(jí)教程的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Node.js處理I/O數(shù)據(jù)之使用Buffer模塊緩沖數(shù)據(jù)

    Node.js處理I/O數(shù)據(jù)之使用Buffer模塊緩沖數(shù)據(jù)

    這篇文章介紹了Node.js使用Buffer模塊緩沖數(shù)據(jù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Node.js中MongoDB查詢(xún)數(shù)據(jù)的方法

    Node.js中MongoDB查詢(xún)數(shù)據(jù)的方法

    在Node.js中,可以使用MongoDB驅(qū)動(dòng)程序和Mongoose庫(kù)來(lái)進(jìn)行MongoDB的查詢(xún)操作,本文就來(lái)介紹一下Node.js中MongoDB查詢(xún)數(shù)據(jù)的方法,感興趣的可以了解一下
    2023-12-12
  • Node異步和事件循環(huán)的深入講解

    Node異步和事件循環(huán)的深入講解

    異步對(duì)于前端來(lái)說(shuō)是老生常談的話題,同樣學(xué)習(xí)node也離不開(kāi)異步IO與事件循環(huán),下面這篇文章主要給大家介紹了關(guān)于Node異步和事件循環(huán)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • Linux下為Node.js程序配置MySQL或Oracle數(shù)據(jù)庫(kù)的方法

    Linux下為Node.js程序配置MySQL或Oracle數(shù)據(jù)庫(kù)的方法

    這篇文章主要介紹了Linux下為Node.js程序配置MySQL或Oracle數(shù)據(jù)庫(kù)的方法,這里默認(rèn)已經(jīng)裝配好了Node環(huán)境然后我們利用npm包管理工具來(lái)進(jìn)行配置,需要的朋友可以參考下
    2016-03-03
  • NodeJs使用webpack打包項(xiàng)目的方法詳解

    NodeJs使用webpack打包項(xiàng)目的方法詳解

    這篇文章主要為大家詳細(xì)介紹了NodeJs使用webpack打包項(xiàng)目的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • pnpm workspace管理monorepo項(xiàng)目使用過(guò)程詳解

    pnpm workspace管理monorepo項(xiàng)目使用過(guò)程詳解

    這篇文章主要為大家介紹了pnpm workspace管理monorepo項(xiàng)目使用過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10

最新評(píng)論

荥经县| 井研县| 永兴县| 武鸣县| 收藏| 临安市| 普宁市| 驻马店市| 洛宁县| 宁南县| 湟中县| 白玉县| 潜山县| 北宁市| 峨眉山市| 玉林市| 博兴县| 周宁县| 奈曼旗| 永泰县| 原平市| 滨州市| 渝中区| 莱阳市| 海丰县| 淄博市| 和平县| 乐昌市| 黄陵县| 定结县| 合江县| 临邑县| 永州市| 方山县| 扎囊县| 云林县| 旬阳县| 高州市| 固始县| 从化市| 图木舒克市|