NodeJS 实时收发 QQ 邮件
安装依赖 pnpm i mailparser imap moment
import { MailParser } from 'mailparser';
import * as Imap from 'imap';
import { createWriteStream, readFileSync, unlinkSync } from 'fs';
import { join } from 'path';
import * as moment from 'moment';
async QQ() {
const imap = new Imap({
/** QQ 邮箱 */
user: 'xxx@qq.com',
/** 这里填写的不是 QQ邮箱的密码,这里是 pop3 的密钥 */
password: 'xxxxx',
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: any) => {
imap.setFlags([data.uid], 'SEEN', () => {});
/** 这里拿到的 data 可以直接进行数据库存储 */
console.log(data);
}
msg.on('body', (stream) => {
stream.pipe(mailparser);
mailparser.on("headers", (headers: any) => {
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 = moment(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 = join(__dirname, '..', '..', '..', '..', 'public', 'mailer', `${new Date().valueOf()}.${data.filename.split('.')[data.filename.split('.').length - 1]}`);
const ws = createWriteStream(path);
ws.on('close', () => {
status ;
info.buffer = readFileSync(path);
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();
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfjicbf
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13