ok, everything fetches ok.. except bad utf8 in subjects
parent
84e801d31e
commit
c152ffa122
2
db.sql
2
db.sql
|
@ -38,5 +38,7 @@ create table messages (
|
|||
headers text not null,
|
||||
body text not null,
|
||||
time timestamptz not null,
|
||||
flags smallint not null,
|
||||
foreign key (folder_id) references folders (id) on delete cascade on update cascade
|
||||
);
|
||||
create index messages_messageid on messages (messageid);
|
||||
|
|
96
operetta.js
96
operetta.js
|
@ -11,22 +11,32 @@ var inspect = require('util').inspect;
|
|||
|
||||
var pg = require('pg-bricks').configure('postgresql://'+cfg.pg.user+':'+cfg.pg.password+'@'+(cfg.pg.host||'')+':'+cfg.pg.port+'/'+cfg.pg.database);
|
||||
|
||||
var flagNum = {
|
||||
'\\recent': 1,
|
||||
'\\flagged': 2,
|
||||
'\\answered': 4,
|
||||
'\\seen': 8,
|
||||
};
|
||||
|
||||
function splitEmails(s)
|
||||
{
|
||||
var re = /(((['"])((?:[^'"\\]+|\\["'\\])*)\3|[^"'<,]+)\s*)?<([^>,]*)>/g, m;
|
||||
var r = [];
|
||||
var re = /^[\s,]*(?:(?:["'](.*?)["']|([^<]+))\s*<([^>]+)>|<?([^<>]+)>?)/; // '
|
||||
var m, r = [];
|
||||
while (m = re.exec(s))
|
||||
r.push({ name: m[4]||m[2], email: m[5] });
|
||||
{
|
||||
s = s.substr(m[0].length);
|
||||
r.push({ name: (m[1]||m[2]||'').trim(), email: (m[3]||m[4]||'').trim() });
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
function* main(thread, account)
|
||||
{
|
||||
var accountId;
|
||||
var [ err, row ] = yield pg.select('id').from('accounts').where({ email: account.email }).row(thread);
|
||||
var [ err, rows ] = yield pg.select('id').from('accounts').where({ email: account.email }).rows(thread);
|
||||
if (err) throw err;
|
||||
if (row && row.id)
|
||||
accountId = row.id;
|
||||
if (rows[0] && rows[0].id)
|
||||
accountId = rows[0].id;
|
||||
else
|
||||
{
|
||||
var [ err, row ] = yield pg.insert('accounts', {
|
||||
|
@ -46,17 +56,30 @@ function* main(thread, account)
|
|||
for (var k in boxes)
|
||||
{
|
||||
var [ err, box ] = yield srv.openBox(k, true, thread);
|
||||
var boxrow = {
|
||||
name: box.name,
|
||||
uidvalidity: box.uidvalidity,
|
||||
account_id: 1
|
||||
};
|
||||
console.log(box);
|
||||
if (err) throw err;
|
||||
var boxId;
|
||||
var [ err, rows ] = yield pg.update('folders', { uidvalidity: box.uidvalidity, unread_count: box.messages.new })
|
||||
.where({ account_id: accountId, name: box.name }).returning('id').rows(thread);
|
||||
if (err) throw err;
|
||||
if (rows[0] && rows[0].id)
|
||||
boxId = rows[0].id;
|
||||
else
|
||||
{
|
||||
var [ err, row ] = yield pg.insert('folders', {
|
||||
name: box.name,
|
||||
uidvalidity: box.uidvalidity,
|
||||
account_id: accountId,
|
||||
unread_count: box.messages.new,
|
||||
// total_count: box.messages.count
|
||||
}).returning('id').row(thread);
|
||||
if (err) throw err;
|
||||
boxId = row.id;
|
||||
}
|
||||
var f = srv.fetch('1:*', {
|
||||
size: true,
|
||||
bodies: 'HEADER.FIELDS (FROM TO CC SUBJECT DATE MESSAGE-ID IN-REPLY-TO)'
|
||||
bodies: 'HEADER'
|
||||
});
|
||||
f.on('message', function(msg)
|
||||
f.on('message', function(msg, seqnum)
|
||||
{
|
||||
gen.run(function*(thread)
|
||||
{
|
||||
|
@ -68,20 +91,43 @@ function* main(thread, account)
|
|||
buffer += chunk.toString('utf8');
|
||||
});
|
||||
yield stream.once('end', thread);
|
||||
var header = Imap.parseHeader(buffer);
|
||||
header.from = splitEmails(header.from && header.from[0]);
|
||||
msgrow.from = header.from && header.from[0];
|
||||
msgrow.to = header.to && header.to[0];
|
||||
msgrow.cc = header.cc && header.cc[0];
|
||||
msgrow.subject = header.subject && header.subject[0];
|
||||
msgrow.date = header.date && header.date[0];
|
||||
msgrow.messageid = header['message-id'] && header['message-id'][0];
|
||||
msgrow.inreplyto = header['in-reply-to'] && header['in-reply-to'][0];
|
||||
msgrow.headers = buffer;
|
||||
msgrow.body = '';
|
||||
var header = Imap.parseHeader(msgrow.headers);
|
||||
for (var i in header)
|
||||
for (var k = 0; k < header[i].length; k++)
|
||||
header[i][k] = header[i][k].replace(/\x00/g, '');
|
||||
header.from = header.from && splitEmails(header.from[0])[0];
|
||||
msgrow.from_email = header.from && header.from.email || '';
|
||||
msgrow.from_name = header.from && header.from.name || '';
|
||||
header.replyto = header['reply-to'] && splitEmails(header['reply-to'][0])[0];
|
||||
msgrow.replyto_email = header.replyto && header.replyto.email || '';
|
||||
msgrow.replyto_name = header.replyto && header.replyto.name || '';
|
||||
msgrow.to_list = header.to && header.to[0] || '';
|
||||
msgrow.cc_list = header.cc && header.cc[0] || '';
|
||||
msgrow.bcc_list = header.bcc && header.bcc[0] || '';
|
||||
msgrow.subject = header.subject && header.subject[0] || '';
|
||||
msgrow.messageid = header['message-id'] && header['message-id'][0] || '';
|
||||
msgrow.inreplyto = header['in-reply-to'] && header['in-reply-to'][0] || '';
|
||||
var [ attrs ] = yield msg.once('attributes', thread);
|
||||
msgrow.date = msgrow.date || attrs.date;
|
||||
if (header.date)
|
||||
{
|
||||
var t = Date.parse(header.date[0]);
|
||||
if (!isNaN(t))
|
||||
msgrow.time = new Date(t);
|
||||
}
|
||||
if (!msgrow.time)
|
||||
msgrow.time = new Date(attrs.date);
|
||||
msgrow.uid = attrs.uid;
|
||||
msgrow.folder_id = boxId;
|
||||
msgrow.flags = 0;
|
||||
for (var i = 0; i < attrs.flags.length; i++)
|
||||
msgrow.flags = msgrow.flags || flagNum[attrs.flags[i].toLowerCase()];
|
||||
msgrow.flags = (msgrow.flags & ~8) | (msgrow.flags & 8 ? 0 : 8); // invert "\seen" (unread) flag
|
||||
yield msg.once('end', thread);
|
||||
console.log(msgrow);
|
||||
console.log(msgrow.time+' '+msgrow.from_email+' '+msgrow.subject);
|
||||
var [ err, row ] = yield pg.insert('messages', msgrow).run(thread);
|
||||
if (err) throw err;
|
||||
});
|
||||
});
|
||||
yield f.on('end', thread);
|
||||
|
|
Loading…
Reference in New Issue