我正在使用node-imap,我找不到一个简单的代码示例来说明如何使用fs将使用node-imap获取的电子邮件附件保存到磁盘。
我已经读过几遍文档了。在我看来,我应该用一个对消息的特定部分(附件)的引用来做另一个获取。我从一个基本的例子开始:
var Imap = require('imap'),
inspect = require('util').inspect;
var imap = new Imap({
user: '[email protected]',
password: 'mygmailpassword',
host: 'imap.gmail.com',
port: 993,
tls: true
});
function openInbox(cb) {
imap.openBox('INBOX', true, cb);
}
imap.once('ready', function() {
openInbox(function(err, box) {
if (err) throw err;
var f = imap.seq.fetch('1:3', {
bodies: 'HEADER.FIELDS (FROM TO SUBJECT DATE)',
struct: true
});
f.on('message', function(msg, seqno) {
console.log('Message #%d', seqno);
var prefix = '(#' + seqno + ') ';
msg.on('body', function(stream, info) {
var buffer = '';
stream.on('data', function(chunk) {
buffer += chunk.toString('utf8');
});
stream.once('end', function() {
console.log(prefix + 'Parsed header: %s', inspect(Imap.parseHeader(buffer)));
});
});
msg.once('attributes', function(attrs) {
console.log(prefix + 'Attributes: %s', inspect(attrs, false, 8));
//Here's were I imagine to need to do another fetch for the content of the message part...
});
msg.once('end', function() {
console.log(prefix + 'Finished');
});
});
f.once('error', function(err) {
console.log('Fetch error: ' + err);
});
f.once('end', function() {
console.log('Done fetching all messages!');
imap.end();
});
});
});
imap.once('error', function(err) {
console.log(err);
});
imap.once('end', function() {
console.log('Connection ended');
});
imap.connect();
这个例子很有效。这是附件部分的输出:
[ { partID: '2',
type: 'application',
subtype: 'octet-stream',
params: { name: 'my-file.txt' },
id: null,
description: null,
encoding: 'BASE64',
size: 44952,
md5: null,
disposition:
{ type: 'ATTACHMENT',
params: { filename: 'my-file.txt' } },
language: null } ],
如何使用node的fs模块读取该文件并将其保存到磁盘?
5条答案
按热度按时间nkhmeac61#
感谢@arnt和mscdex的帮助。这里有一个完整的工作脚本,它将所有附件作为文件流到磁盘,同时base64动态解码它们。在内存使用方面相当可伸缩。
puruo6ea2#
你也可以用它为我工作。
njthzxwz3#
作者:Christiaan Westerbeek
change:1. use =>,forEach; 2.第二次fetch不需要“struct”。
问题:
在某些情况下,附件的文件名SHOLUD为attachment.disposition.params“文件名”]。请参阅“RFC 2231 MIME参数值和编码字扩展”& here。
cgyqldqp4#
下面的解释是从电子邮件下载附件,也有一个标志(markAsRead)设置为true只读取未读邮件,并为下载所有附件设置为false。
仅获取未读/未查看的电子邮件:你必须在回调中 Package fetching调用以搜索一个,像这样:
将电子邮件标记为已读:对我来说是一个棘手的问题,在第53行,打开收件箱的调用类似于:openBox('INBOX',true,function(err,box){第二个参数(true值)用于以只读模式打开收件箱。您需要将其更改为false,然后添加一个字段markSeen:第二个参数中的true:
这是我现在使用的脚本,更改如下:
将邮件标记为已读:如果配置选项imapOptions.markAsRead被设置为true,它将把已处理的邮件标记为已读。文件格式:有一个配置选项(downloads.filenameFormat)可用于重命名文件。其实很简单如果您将其设置为$FILENAME或只是删除它,它将保留原始文件名。我包括它,因为人们发送的文件名称相同,但内容不同,我需要保留它们。日志:我使用simple-node-logger包添加了日志。脚本使用两个级别:debug,它显示了原始脚本和信息(更简单的日志)中的所有内容。如果您只需要它,也会使用错误级别。
这是一个配置文件,其中包含新选项:
干杯!干杯!
kuuvgm7e5#
由于所有内容都是更新的,而不是使用pipe方法,因此您可以直接使用此方法来写入文件。`
`