DingMing

丁大铭的个人空间,用来分享一些前端小技巧,默默成长吧,哈哈

Node自动接收新邮件进行处理

  |  
 阅读次数
    简介: 通过imap 来接收邮箱新邮件,类似客户端系列,不过比较简单的,目前只有新邮件,后续也可以通过这个来做一个自己的邮件客户端。

1.介绍 邮件协议

  1. POP3:Post Office Protocol 3,即邮局协议的第三个版本,是应用最广泛的邮件接收协议。POP3 是一种单向的邮件传输协议,它只能将服务器上的邮件传输到本地计算机上,而不能将本地计算机上的邮件传输到服务器上。POP3 协议的默认端口号是 110。
  2. IMAP:Internet Mail Access Protocol,即互联网邮件访问协议,是一种高级的邮件协议。IMAP 与 POP3 不同,它是一种双向的邮件传输协议,它不仅可以将服务器上的邮件传输到本地计算机上,还可以将本地计算机上的邮件传输到服务器上。IMAP 协议的默认端口号是 143。
  3. SMTP:Simple Mail Transfer Protocol,即简单邮件传输协议,是一种用于发送邮件的协议。SMTP 协议的默认端口号是 25。

2.需求

在指定邮箱接收到新邮件后,进行邮件处理,比如 获取邮件内容,并跳转指定链接 进行 Selenium 自动化操作。

3.处理思路

通过 imap 来登录邮箱,然后读取邮箱中未读的邮件,并将邮件内容进行解析获得,然后跳转指定页面。

4.使用模块

  • imap
  • mailparser
    主要就是这两个。

5.代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
var MailParser = require('mailparser').MailParser
var Imap = require('imap')
var Path = require('path')
var fs = require('fs')
var dayjs = require('dayjs')

function QQ() {
const imap = new Imap({
/** QQ 邮箱 */
user: 'XXXXXXX@qq.com',
/** 这里填写的不是 QQ邮箱的密码,这里是 pop3 的密钥 */
password: 'XXXXXXXX',
host: 'pop.qq.com',

tls: false,
authTimeout: 1000,
tlsOptions: { rejectUnauthorized: false },
})
const search = () =>
imap.search(
[
[
'UNSEEN',
['SINCE', new Date(+new Date() - 5 * 60 * 1000).toISOString()],
],
],
(err, results) => {
if (!err) {
try {
const f = imap.fetch(results, {
markSeen: false,
bodies: '',
struct: true,
})
f.on('message', (msg) => {
const mailparser = new MailParser()
const info = {
theme: '',
form: '',
mailName: '',
to: '',
datatime: '',
html: null,
text: null,
uid: null,
buffer: null,
}
let status = 0
const next = (data) => {
imap.setFlags([data.uid], 'SEEN', () => {})
/** 这里拿到的 data 可以直接进行数据库存储 */
console.log(1111, data)
}
msg.on('body', (stream) => {
stream.pipe(mailparser)
mailparser.on('headers', (headers) => {
info.theme = headers.get('subject')
info.form = headers.get('from').value[0].address
info.mailName = headers.get('from').value[0].name
info.to = headers.get('to').value[0].address
info.datatime = dayjs(headers.get('date')).format(
'YYYY-MM-DD HH:mm:ss'
)
status++
if (status === 3) {
next(info)
}
})
mailparser.on('data', (data) => {
if (data.type === 'text') {
status++
info.html = data.html
info.text = data.text
if (status === 3) {
next(info)
}
}
if (data.type === 'attachment') {
const path = Path.join(
__dirname,
'..',
'..',
'..',
'..',
'public',
'mailer',
`${new Date().valueOf()}.${
data.filename.split('.')[
data.filename.split('.').length - 1
]
}`
)
const ws = fs.createWriteStream(path)
ws.on('close', () => {
status++
info.buffer = fs.readFileSync(path)
fs.unlinkSync(path)
if (status === 3) {
next(info)
}
})
data.content.pipe(ws)
data.release()
}
})
})
msg.on('attributes', (data) => {
info.uid = data.uid
status++
if (status === 3) {
next(info)
}
})
})
} catch (err) {}
} else {
throw err
}
}
)
let init = true
imap.once('ready', () => {
imap.openBox('INBOX', true, (err) => {
if (!err) {
init = false
search()
} else {
throw err
}
})
})
imap.on('mail', () => {
if (!init) {
search()
}
})
imap.connect()
}

QQ()

6.注意事项

1.password 是密钥,不是密码

2. 一定不是使用网易邮箱,网易邮箱的 pop3 服务是收费的,而且不是很稳定,建议使用 QQ 邮箱