imapEmail.js
2.76 KB
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
const Imap = require('imap');
const imapConfig = {
user: 'mil2inda@gmail.com',
password: 'iyiyaqaksbewpclq',
host: 'imap.gmail.com',
port: 993,
tls: true,
keepalive: {
forceNoop: true
},
tlsOptions: {
rejectUnauthorized: false // Ignore self-signed certificate error
}
};
async function watchIncomingEmails() {
const imap = new Imap(imapConfig);
let largestUID = 0;
function openInbox() {
return new Promise((resolve, reject) => {
imap.openBox('INBOX', true, (err, box) => {
if (err) {
reject(err);
} else {
resolve(box);
}
});
});
}
function fetchNewMessages() {
return new Promise((resolve, reject) => {
let criteria = ['UNSEEN', ['FROM', 'nattaponw@sourcecode.co.th'], ['UID', `${largestUID + 1}:*`]]
imap.search(criteria, (searchErr, results) => {
if (searchErr) {
reject(searchErr);
return;
}
try {
const fetch = imap.fetch(results, { bodies: '' });
const messages = [];
fetch.on('message', (msg, seqno) => {
let buffer = '';
msg.on('attributes', (attrs) => {
largestUID = attrs.uid
});
msg.on('body', (stream, info) => {
console.log(info)
stream.on('data', (chunk) => buffer += chunk.toString());
stream.on('end', () => {
messages.push(buffer);
});
});
});
fetch.on('end', () => {
resolve(messages);
});
} catch (fetchError) {
if(fetchError.message == 'Nothing to fetch') {
console.log('There are no messages to fetch.')
resolve([])
} else {
reject(fetchError)
}
}
});
});
}
imap.once('ready', async () => {
try {
const box = await openInbox();
console.log('Listening for new messages...');
imap.on('mail', async (numNewMsgs) => {
console.log(`${numNewMsgs} new message(s) received.`);
const messages = await fetchNewMessages();
console.log(`Unread messages: ${messages.length} from nattaponw@sourcecode.co.th` )
// messages.forEach((message, index) => {
// console.log(`New message ${index + 1}:`, message);
// });
console.log('All new messages processed.');
});
} catch (error) {
console.log('Error:', error);
}
});
imap.once('error', (err) => {
console.error('IMAP error:', err);
});
imap.once('end', () => {
console.log('IMAP connection ended.');
});
imap.connect();
}
watchIncomingEmails();