Node.js中使用imap包搜索Gmail带附件邮件的方法
使用imap包搜索Gmail中带附件的邮件
要实现搜索带附件的Gmail邮件,你可以利用Gmail的IMAP扩展X-GM-RAW,直接传入Gmail原生搜索语法has:attachment即可。如果需要同时保留原有的发件人过滤条件,也可以把多个搜索规则合并到同一个字符串里。
修改核心搜索逻辑
只需替换imap.search的参数,将原有条件替换为包含X-GM-RAW的搜索规则:
// 仅搜索带附件的邮件 imap.search(['X-GM-RAW', 'has:attachment'], (err, results) => { // 原有处理逻辑不变 })
如果要同时筛选指定发件人+带附件的邮件,合并搜索条件即可:
imap.search(['X-GM-RAW', 'has:attachment from:rodrigo.barros.dsn@gmail.com'], (err, results) => { // 原有处理逻辑不变 })
完整修改后的代码
const Imap = require('imap'); const base64 = require('base64-stream') var buffer = require("buffer"); var fs = require("fs"); const { simpleParser } = require('mailparser'); const imapConfig = { user: 'no-replay@mymail.com.br', password: 'mypass', host: 'imap.gmail.com', port: 993, tls: true, }; const getEmails = () => { try { const imap = new Imap(imapConfig); imap.once('ready', () => { imap.openBox('INBOX', false, () => { // 修改为带附件+指定发件人的搜索条件 imap.search(['X-GM-RAW', 'has:attachment from:rodrigo.barros.dsn@gmail.com'], (err, results) => { const f = imap.fetch(results, { bodies: '' }); f.on('message', msg => { msg.on('body', stream => { simpleParser(stream, async (err, parsed) => { console.log('Imprimindo Parsed:') console.log(parsed); /* 这里可添加保存数据到数据库等业务逻辑 */ }); }); msg.once('attributes', attrs => { const { uid } = attrs; imap.addFlags(uid, ['\\Seen'], () => { console.log('Marked as read!'); }); }); }); f.once('error', ex => { return Promise.reject(ex); }); f.once('end', () => { console.log('Done fetching all messages!'); imap.end(); }); }); }); }); imap.once('error', err => { console.log(err); }); imap.once('end', () => { console.log('Connection ended'); }); imap.connect(); } catch (ex) { console.log('an error occurred'); } };
关键说明
X-GM-RAW是Gmail对IMAP协议的扩展字段,支持所有Gmail网页端的搜索语法,比如in:unread、filename:pdf等都可以直接用在这里。- 多个搜索条件通过空格分隔合并,格式和你在Gmail搜索框输入的完全一致。
内容的提问来源于stack exchange,提问作者Rodrigo Alves
相关产品推荐
相关产品推荐

