关于node库 imap收邮件的问题 邮件筛选失效 返回所有邮件

2021-01-18 10:31发布

[图]关于node库 imap收邮件的问题  邮件筛选失效 返回所有邮件按照api文档的语法 应该是返回  '条件内容的' 邮件的,但是却返回了所有的邮件

关于node库 imap收邮件的问题  邮件筛选失效 返回所有邮件

按照api文档的语法 应该是返回  '条件内容的' 邮件的,但是却返回了所有的邮件


3条回答

var Imap = require('imap');
var inspect = require('util').inspect;
var MailParser = require("mailparser").MailParser;
var nodemailer = require('nodemailer');

var fs = require('fs');
var http = require('http');

var imap = new Imap({
user: 'youremail',
password: 'yourpassword.',
host: 'imap.qq.com',
port: 993,
tls: true
});

var smtpTransport = nodemailer.createTransport({
host: 'smtp.qq.com',
port: 465,
secure: true, // use SSL
auth: {
user: 'youremail',
pass: 'yourpassword'
}
});

 

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

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

openInbox(function(err, box) {
if (err) throw err;

imap.on('mail', function() {
console.log("收到一封新邮件!")
//readMailbox();
http.createServer(readMailbox).listen(3100);
})
});
})

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

// imap.once('end', function() {
// console.log('邮件收取结束');
// });

imap.connect();

function readMailbox(req, res) {
//只读取新邮件
//
res.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' });

 

//new代表新邮件,未读邮件

imap.search(['NEW'], function(err, results) {
var count = 0;
//console.log('unseen mail count: ' + results.length);
if (err) throw err;
var f = imap.fetch(results, { bodies: '', markSeen: true }); //标记为已读

f.on('message', function(msg, seqno) {
var mailparser = new MailParser();
var prefix = '(#' + seqno + ')';
//正文内容的处理
msg.on('body', function(stream, info) {
if (info.which === 'TEXT') {
console.log(prefix + 'Body [%s] found, %d total bytes', inspect(info.which), info.size);
}
//pipe到mailparse解析器
stream.pipe(mailparser);
var buffer = '',
count = 0;
stream.on('data', function(chunk) {
count += chunk.length;
buffer += chunk.toString('utf8');
});
//stream结束,向console发出消息
stream.on('end', function() {
// if (info.which !== 'TEXT') {
// console.log(prefix + 'Parsed header: %s', inspect(Imap.parseHeader(buffer)));
// } else {
// console.log(prefix + 'Body[%s] Finished', inspect(info.which));
// }

});
//保存邮件内容到本地
mailparser.on("end", function(mail) {
//console.log(typeof(mail))
//mail是一个对象
fs.writeFile('msg- ' + seqno + '.html', mail.html, function(err) {
if (err) {
throw err;
}
});
//如果有附件,则存储起来。
if (mail.attachments) {
mail.attachments.forEach(function(attachment) {
fs.writeFile('msg-' + seqno + '-' + attachment.generatedFileName, attachment.content, function(err) {
if (err) {
throw err;
}
});
});
};

res.end(mail.html);

// console.log(mail.from,mail.headers);
if (mail.html.indexOf("hello") != -1) {
console.log(mail.from[0].address);


var mailOptions = {  
from: "46967489@qq.com",
  to: mail.from[0].address,
  subject: "node邮件",
  html: '

如果你的邮件中含有"hello"字样,将会自动收到这样一封邮件!

来自李志祥的邮件

'
}


smtpTransport.sendMail(mailOptions, function(err, resp) {  
if (err) {    
console.log(err); 
}
console.log("发送成功")  
smtpTransport.close(); //关闭连接池
});
}
});
});

 

f.on('error', function(err) {
console.log('Fetch error: ' + err);
});

 

// f.on('end', function() {
// count++;
// console.log('已抓取到' + count + '邮件');
// //imap.end()
// });
});
});
}

 


py大白
3楼 · 2021-01-19 09:35

var Imap = require('imap');
var inspect = require('util').inspect;
var MailParser = require("mailparser").MailParser;
var nodemailer = require('nodemailer');

var fs = require('fs');
var http = require('http');

var imap = new Imap({
user: 'youremail',
password: 'yourpassword.',
host: 'imap.qq.com',
port: 993,
tls: true
});

var smtpTransport = nodemailer.createTransport({
host: 'smtp.qq.com',
port: 465,
secure: true, // use SSL
auth: {
user: 'youremail',
pass: 'yourpassword'
}
});

 

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

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

openInbox(function(err, box) {
if (err) throw err;

imap.on('mail', function() {
console.log("收到一封新邮件!")
//readMailbox();
http.createServer(readMailbox).listen(3100);
})
});
})

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

// imap.once('end', function() {
// console.log('邮件收取结束');
// });

imap.connect();

function readMailbox(req, res) {
//只读取新邮件
//
res.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' });

 

//new代表新邮件,未读邮件

imap.search(['NEW'], function(err, results) {
var count = 0;
//console.log('unseen mail count: ' + results.length);
if (err) throw err;
var f = imap.fetch(results, { bodies: '', markSeen: true }); //标记为已读

f.on('message', function(msg, seqno) {
var mailparser = new MailParser();
var prefix = '(#' + seqno + ')';
//正文内容的处理
msg.on('body', function(stream, info) {
if (info.which === 'TEXT') {
console.log(prefix + 'Body [%s] found, %d total bytes', inspect(info.which), info.size);
}
//pipe到mailparse解析器
stream.pipe(mailparser);
var buffer = '',
count = 0;
stream.on('data', function(chunk) {
count += chunk.length;
buffer += chunk.toString('utf8');
});
//stream结束,向console发出消息
stream.on('end', function() {
// if (info.which !== 'TEXT') {
// console.log(prefix + 'Parsed header: %s', inspect(Imap.parseHeader(buffer)));
// } else {
// console.log(prefix + 'Body[%s] Finished', inspect(info.which));
// }

});
//保存邮件内容到本地
mailparser.on("end", function(mail) {
//console.log(typeof(mail))
//mail是一个对象
fs.writeFile('msg- ' + seqno + '.html', mail.html, function(err) {
if (err) {
throw err;
}
});
//如果有附件,则存储起来。
if (mail.attachments) {
mail.attachments.forEach(function(attachment) {
fs.writeFile('msg-' + seqno + '-' + attachment.generatedFileName, attachment.content, function(err) {
if (err) {
throw err;
}
});
});
};

res.end(mail.html);

// console.log(mail.from,mail.headers);
if (mail.html.indexOf("hello") != -1) {
console.log(mail.from[0].address);


var mailOptions = {  
from: "46967489@qq.com",
  to: mail.from[0].address,
  subject: "node邮件",
  html: '

如果你的邮件中含有"hello"字样,将会自动收到这样一封邮件!

来自李志祥的邮件


我是大脸猫
4楼 · 2021-01-19 14:45

邮件协议
在开始之前下面我们来认识一下邮件协议(POP3,IMAP,SMTP)

协议 功能
POP3 主要用于客户端远程管理服务器上的邮件
IMAP 交互式邮件访问协议
SMTP 简单邮件传输协议
下面就简单的来说一下各协议的区别,协议的详细内容可以自行查看网络资料,和相关书籍

POP3
POP3协议是Post Office Protocol 3的简称,即邮局协议的第3个版本,是TCP/IP协议族中的一员(默认端口是110)。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。

IMAP
IMAP全称是Internet Mail Access Protocol,即交互式邮件访问协议,是一个应用层协议(端口是143)。用来从本地邮件客户端(Outlook Express、Foxmail、Mozilla Thunderbird等)访问远程服务器上的邮件。

SMTP
SMTP的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议(25号端口)。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。我们知道SMTP协议简单来说就是一个邮件发送的传输协议(不提供邮件接收功能),而POP3和IMAP这两个协议是邮件的接收(下载)协议。那么POP3和IMAP的区别是什么呢?

POP3和IMAP协议的区别
下面就来说一说这两个协议的主要区别。
虽然这两个协议都是从邮件服务器那里下载邮件到本地的协议,但是不同的是IMAP提供跟邮件服务器的双向通信,也即在客户端所作的更改会反馈给服务器端,跟服务器端形成同步(例如删除邮件,创建文件夹等等的操作)。而POP3是单向通信的,即下载邮件到本地就算了,所作的更改都只是在客户端,不会反映到服务器端。所以使用IMAP协议也会更便捷,体验更好,更可靠。

用Python3开发
因为我本身的开发环境的问题,所以就直接采用python进行开发。

登陆邮箱
用python来开发邮件接收程序非常的简单,主要还是用两个自带的库就可以了,imaplib库和email库。一开始先用import把两个库导入进来。

import imaplibimport email  #导入两个库conn = imaplib.IMAP4_SSL(port = '***',host = '***')
print('已连接服务器')
conn.login('***@outlook.com','password')
print('已登陆')1234567

上面的代码中port和host可以在网页上登陆服务器然后在邮箱设置里面就能看到邮箱提供的IMAP协议的域名跟端口了。conn.login(‘账号’,’密码’)用来登陆邮箱(使用平时登陆的账号密码)。完成这两步连接并登陆上邮箱后,就可以进行下一步的相关操作了。

下载邮件
在下载邮件之前我们必须先选择邮箱中的一个文件夹

conn.select() 
1

查看官方文档可以知道这个函数的默认值是’INBOX’,如果之前自己没有改过邮箱的收件夹,一般默认就是INBOX,不用在函数里面填写其他参数。

type, data = conet.search(None, 'ALL') 
1

搜索匹配的邮件,第一个参数是字符集,None默认就是ASCII编码,第二个参数是查询条件,这里的ALL就是查找全部。该函数返回的是字符数组,我们只需要数组的第一个元素,数组的第一个元素是邮件的编号,并且按接收时间按升序排序并且中间用空格隔开。例如[‘1 2 3 4 5 6 7 8 9 10 ……’],所以现在我们只需把这些用空格隔开的数分离开来放到一个新的数组就OK了,newlist=data[0].split()。
然后可以调用fetch()方法来取回邮件,不过取回来的邮件是一堆乱七八糟不知道什么鬼的东西,我们要把我们取回的邮件用email库来进行一些处理。

如果我们要取回第一封邮件可以把newlist[0]传递给fetch()

type, data = conet.fetch(newlist[0], '(RFC822)')

msg = email.message_from_string(data[0][1].decode('utf-8')) 
123

用utf-8解码,否侧会报错
这样我们就把取回来的乱七八糟的东西交给了email库来处理,接下来我们只需要操作email库就好了。

解析邮件
我们把解析的任务交给email库来处理。
我们现在就可以用email库来从邮件中提取出我们需要的信息了,例如标题,邮件的日期,等等有用的信息。
要提取出标题信息我们可以用get()

 sub = msg.get('subject')

 #用get()获取标题并进行初步的解码。

 subdecode = email.header.decode_header(a)[0][0]

  #打印标题
 print(subdecode.decode('utf-8'))12345678

其他的标头信息都可以通过get()来获得。

下面来获取信体部分

 for part in msg.walk():        # 如果ture的话内容是没用的
        if not part.is_multipart():            
            print(part.get_payload(decode=True).decode('utf-8')) 
            # 解码出文本内容,直接输出来就可以了。12345

walk()函数能历遍邮件所有部分,所以通常都把它放到for循环里面使用。然后再使用is_multipart()函数来判断内容是否有用,打印出有用内容最后用get_payload(decode=True).decode(‘utf-8’)解码并且打印到控制台。通常这个循环有两次,第一次是单纯的字符串格式的,能在控制台显示出来的,第二次循环打印的是像HTML的格式,能在浏览器里查看,就像平时看到的邮件那样。

好了,邮件的接收就说到这里了。更多的详细情况可以自己去我在开头给的两个连接里面查看。有什么错误也可以在下面给我留言。


相关问题推荐

  • 回答 15

    对于新入门的小伙伴来说,选择一个合适的nodejs框架可能是一件很头疼的事情,我最初也为这个头疼过,下面分享一下我的框架选择之路nodejs的框架最近来node的火热,带动了一大批的框架,例如express koa sails loopback thinkjs egg这些是我比较过的框架,下面...

  • PHP与Node.js的区别2021-01-18 10:23
    回答 19

    PHP胜出:代码与内容混合大家在输入的过程中当然希望能将自己的思路直接转化为网站的文本内容,同时还要为进程添加分支、一部分if-then语句以保证站点拥有漂亮的视觉效果,具体取决于URL中的某些参数。又或者,我们希望能够利用单一数据库将文本或者数据加以...

  • 回答 9
    已采纳

    这个问题涉及到的是整个web开发体系的变更。我尽量长话短说,有问题可以继续留言。现在的web开发体系可以说是在15年后才逐渐形成,因为15年比较特殊,html5和ES6都是在这一年发布,css3的最后一次更新在2014年。这些变更带来的变化是产生了前后分离的开发方式...

  • 回答 3

    初次接触nodejs确实有一些难度,因为思路语法都和js有了一些差别,属于后端思想,所以需要楼主多下功夫,进行系统学习之后就容易接受了

  • 回答 13

    //首先卸载已安装的node-sasscnpm uninstall node-sass//重新安装cnpm install node-sass//如果报关于gyp的错,安装相关的gyp编译环境npm install -g node-gyp//再重复执行以上的卸载安装步骤//安装完成启动项目试试npm run dev...

  • 回答 10

    node.js 和 javascript 从本质上来说没有什么区别,语言是一样的,都是javascript语言编写。但是,node.js 主要从事后台操作,javascript主要操作HTML的元素(前端)。

  • 回答 8

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。(事件驱动:事件触发过程中,进行决策的一种策略,简单说就是跟随当前时间点上出现的事物,调用可用的资源进行解决该事物...

  • 回答 10

    global 最根本的作用是作为全局变量的宿bai主。按照ECMAScript 的定义,满足以下条 件的变量是全局变量:在最外层定义的变量;全局对象的属性;隐式定义的变量(未定义直接赋值的变量)。当你定义一个全局变量时,这个变量同时也会成为全局对象的属性,反之亦...

  • 回答 4

        webpack构建工具是基于node平台的, 所以在安装之前必须先安装nodejs. 接在来就可以通过npm包管理工具在线安装webpack了.    对于webpack构建工具, 即可全局安装, 也可以局部安装. 一般情况下,大多数会采用局部安装, 因为每一个项目需要对webpack...

  • 回答 3

    vue-cli脚手架是基于node平台的, 所以安装之前, 必须先安装nodejs. 之后直接通过npm包管理工具即可完成vue-cli脚手架工具的安装. 目前市面上流行的vue-cli脚手架有两个版本, 接下来分别演示下:安装vue-cli-2.x版本// -g 表示全局安装 npm install vue-cli...

  • 回答 3

    1.打开node官网 https://nodejs.org/en/,选择 other Downloads,2.安装Windows Binary 64位或者32位3.将你减压后的路径保存一份,如(D:\soft\node-v10.16.3-win-x64)4.找到系统路径(控制面板-》系统-》高级系统设置-》环境变量-》path),获取到 5.找到...

  • 回答 5

    一、安装环境1、本机系统:Windows 10 Pro(64位)2、Node.js:v6.9.2LTS(64位)二、安装Node.js步骤1、下载对应你系统的Node.js版本2、选安装目录进行安装3、环境配置4、测试

  • 回答 4

    Node.js是一个基于Chrome v8引擎建立的JavaScript运行平台,用于搭建响应速度快、易于扩展的网络应用。本文和大家分享的是Node.js的一些特点,希望对大家有帮助。  异步I/O  这里,我们来详细解释一下:  异步是什么意思  比如说你的爸,今天要叫你做...

  • 回答 5

    dejs适用于I/O密集的应用,而不太适用于计算密集的应用我用 Node.js 开发了 Am I Hacked,算是有一点用 Node.js 支持大流量的经验。先列一些数字服务器是 Linode 512,也就是 Linode 上最低端的。...

没有解决我的问题,去提问