国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

Node接收電子郵件的實例代碼

2019-11-19 16:01:24
字體:
來源:轉載
供稿:網友

上一篇文章寫了如何通過node發送電子郵件,有發送就會有接收嘛,所以這篇文章來說說關于在node中如何接收電子郵件。

郵件協議

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

smtp協議

簡單郵件傳輸協議:是一種基于文本的電子郵件傳輸協議,用于從源地址到目的地址傳輸郵件的規范,通過它來控制郵件的中轉方式,是因特網中用于在郵件服務器之間交換郵件的協議。SMTP是一個“推”的協議,它不允許根據需要從遠程服務器上“拉”來消息。要做到這點,郵件客戶端必須使用POP3或IMAP。所以發送郵件的時候我們需要簡單的了解下面的這兩種協議。

pop3協議

POP3協議允許電子郵件客戶端下載服務器上的郵件,但是在客戶端的操作(如移動郵件、刪除郵件、標記已讀等),不會反饋到服務器上,比如通過客戶端收取了郵箱中的3封郵件并移動到其他文件夾,郵箱服務器上的這些郵件是沒有同時被移動的。也就是說POP3協議實際上是下載了一份郵件的副本到本地郵件客戶端,而且對本地郵件副本的操作只會影響本地數據。多個郵件客戶端里面的郵件的狀態可能會不一致。

imap協議

IMAP(Internet消息訪問協議)也是提供面向用戶的郵件收取服務。常用的版本是IMAP4。與POP3協議類似允許電子郵件客戶端下載服務器上的郵件,不同的是,開啟了IMAP后,您在電子郵件客戶端收取的郵件仍然保留在服務器上,同時在客戶端上的操作都會反饋到服務器上,如:刪除郵件,標記已讀等,服務器上的郵件也會做相應的動作。換句話說,IMAP把遠程文件夾當成本地文件夾來操作,它們之間類似于雙向同步。這樣的好處是,當你在多個郵件客戶端看見的郵件的狀態是一致的。本次接收郵件我們也使用此協議來實現。

接收郵件測試過程

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

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

 imap接收郵件測試過程

本次測試的大概過程如下

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

安裝node第三方包

npm install --save imap mailparser

郵件接收服務器我選擇Gmail,發送郵件的服務器使用qq郵箱。

使用qq郵箱發送一封帶有附件的郵件

通過程序接收郵件

查看附件保存時否正確

核心代碼

var Imap = require('imap')var MailParser = require("mailparser").MailParservar fs = require("fs")var imap = new Imap({  user: 'yourname@gmail.com', //你的郵箱賬號  password: 'yourpassword', //你的郵箱密碼  host: 'imap.gmail.com', //郵箱服務器的主機地址  port: 993, //郵箱服務器的端口地址  tls: true, //使用安全傳輸協議  tlsOptions: { rejectUnauthorized: false } //禁用對證書有效性的檢查});function openInbox(cb) {  imap.openBox('INBOX', true, cb);}imap.once('ready', function() {  openInbox(function(err, box) {    console.log("打開郵箱")    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: '' });//抓取郵件(默認情況下郵件服務器的郵件是未讀狀態)      f.on('message', function(msg, seqno) {        var mailparser = new MailParser();        msg.on('body', function(stream, info) {          stream.pipe(mailparser);//將為解析的數據流pipe到mailparser          //郵件頭內容          mailparser.on("headers", function(headers) {            console.log("郵件頭信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");            console.log("郵件主題: " + headers.get('subject'));            console.log("發件人: " + headers.get('from').text);            console.log("收件人: " + headers.get('to').text);          });          //郵件內容          mailparser.on("data", function(data) {            if (data.type === 'text') {//郵件正文              console.log("郵件內容信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");              console.log("郵件內容: " + data.html);            }            if (data.type === 'attachment') {//附件              console.log("郵件附件信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");              console.log("附件名稱:"+data.filename);//打印附件的名稱              data.content.pipe(fs.createWriteStream(data.filename));//保存附件到當前目錄下              data.release();            }          });        });        msg.once('end', function() {          console.log(seqno + '完成');        });      });      f.once('error', function(err) {        console.log('抓取出現錯誤: ' + err);      });      f.once('end', function() {        console.log('所有郵件抓取完成!');        imap.end();      });    });  });});imap.once('error', function(err) {  console.log(err);});imap.once('end', function() {  console.log('關閉郵箱');});imap.connect();

默認情況下抓取郵件后郵件服務器的郵件狀態為未讀,如果要在抓取后讓郵箱服務器中的郵件狀態變為已讀,可以修改

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

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

參考文檔

查看node-imap詳細文檔和api請點擊這里

查看Mailparser詳細文檔請點擊這里

后記

如果google郵箱如果開啟了二次認證,那么你需要在google后臺生成一個專用密碼來登錄google郵箱拉取郵件。

通過一個簡單的例子實現了如何使用node和imap協議來接收郵件,結合上篇node發送電子郵件文章的內容,一個簡單的郵件客戶端的基本收信發信功能就有了,但是想實現一個功能完善用戶體驗好的郵件客戶端就需要不斷揣摩它,設計它,完善它,希望這篇文章能帶給你啟發,可以實現一個屬于你自己的郵件客戶端。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 黄龙县| 长葛市| 呼图壁县| 浙江省| 金平| 自治县| 上杭县| 静乐县| 汉中市| 宣武区| 临沭县| 北京市| 中卫市| 凤城市| 辰溪县| 怀柔区| 搜索| 龙胜| 天等县| 枣庄市| 公主岭市| 固阳县| 麻栗坡县| 南江县| 萍乡市| 安龙县| 娄烦县| 瑞昌市| 宁津县| 大英县| 台中县| 山阴县| 安徽省| 张家港市| 宁远县| 南宁市| 康保县| 桑植县| 饶河县| 云和县| 汝南县|