为何以下JavaScript Promise会返回所有邮件附件?
为什么这段imap-simple的Promise代码会返回所有邮件附件?
Hey there, let's break down why you're seeing all those attachments in your results, and how to adjust things if that's not what you want:
首先,先看代码里的关键设置
你的fetchOptions里启用了struct: true——这个选项告诉imap-simple返回邮件的完整MIME结构,其中自然包含了邮件里所有附件的元数据(比如文件名、类型、大小等)。这并不意味着你已经下载了附件的实际内容,但它会把所有附件的结构信息带回来。如果你的“所有邮件附件”是指符合搜索条件的邮件里的全部附件,那这其实是正常行为,因为你没对附件做任何过滤。
如果你是拿到了不符合搜索条件的邮件的附件(比如所有邮件的附件)
那大概率是你的搜索条件没生效,常见原因有这几个:
- 日期格式不兼容IMAP标准:你用
toISOString()生成的日期格式(比如2024-07-05T12:34:56.789Z)很多IMAP服务器不买账,标准的SINCE格式应该是DD-MMM-YYYY(比如05-Jul-2024)。格式不对会导致服务器忽略这个条件,只执行UNSEEN,甚至完全失效返回所有邮件。 - 未读标记的状态问题:如果你的邮件已经被其他客户端标记为已读,或者服务器上的
UNSEEN状态和你预期的不一致,也会导致搜索范围超出你想要的24小时窗口。 - 邮箱文件夹确认:确保
openBox('INBOX')确实打开了你要操作的收件箱,有没有可能误打开了其他文件夹?
修正建议
- 修复日期格式:改成IMAP服务器认可的格式:
const delay = 24 * 3600 * 1000; const yesterday = new Date(Date.now() - delay); // 生成 DD-MMM-YYYY 格式的日期 const formattedYesterday = yesterday.toLocaleDateString('en-US', { day: '2-digit', month: 'short', year: 'numeric' }).replace(/ /g, '-'); const searchCriteria = ['UNSEEN', ['SINCE', formattedYesterday]]; - 过滤特定附件:如果只想获取某类附件(比如PDF),可以在拿到邮件后遍历结构筛选:
connection.search(searchCriteria, fetchOptions).then(messages => { messages.forEach(msg => { // 只筛选标记为ATTACHMENT且类型为PDF的部分 const targetAttachments = msg.parts.filter(part => part.disposition?.type === 'ATTACHMENT' && part.type === 'application/pdf' ); // 这里处理你需要的附件 console.log('Filtered attachments:', targetAttachments); }); }); - 排查搜索条件:先打印返回的邮件数量和邮件头信息,确认搜索条件是否真的筛选出了过去24小时的未读邮件,逐步定位问题。
内容的提问来源于stack exchange,提问作者Mary
相关产品推荐
相关产品推荐

