updated imap handling

This commit is contained in:
Andris Reinman 2017-03-10 15:20:13 +02:00
parent 248b9e2e11
commit a0ce2acc40
4 changed files with 127 additions and 22 deletions

View file

@ -499,10 +499,14 @@ module.exports.getQueryResponse = function (query, message, options) {
break;
case 'envelope':
if (!mimeTree) {
mimeTree = indexer.parseMimeTree(message.raw);
if (message.envelope) {
value = message.envelope;
} else {
if (!mimeTree) {
mimeTree = indexer.parseMimeTree(message.raw);
}
value = indexer.getEnvelope(mimeTree);
}
value = indexer.getEnvelope(mimeTree);
break;
case 'rfc822':
@ -513,10 +517,14 @@ module.exports.getQueryResponse = function (query, message, options) {
break;
case 'rfc822.size':
if (!mimeTree) {
mimeTree = indexer.parseMimeTree(message.raw);
if (message.size) {
value = message.size;
} else {
if (!mimeTree) {
mimeTree = indexer.parseMimeTree(message.raw);
}
value = indexer.getSize(mimeTree);
}
value = indexer.getSize(mimeTree);
break;
case 'rfc822.header':

View file

@ -36,12 +36,17 @@ let queryHandlers = {
// matches message header date
date: function (message, query) {
let mimeTree = message.mimeTree;
if (!mimeTree) {
mimeTree = indexer.parseMimeTree(message.raw);
let date;
if (message.headerdate) {
date = message.headerdate;
} else {
let mimeTree = message.mimeTree;
if (!mimeTree) {
mimeTree = indexer.parseMimeTree(message.raw);
}
date = mimeTree.parsedHeader.date || message.internaldate;
}
let date = mimeTree.parsedHeader.date || message.internaldate;
switch (query.operator) {
case '<':
return getShortDate(date) < getShortDate(query.value);
@ -56,7 +61,7 @@ let queryHandlers = {
// matches message body
body: function (message, query) {
let body = (message.raw || '').toString();
let body = indexer.getContents(message.mimeTree).toString();
let bodyStart = body.match(/\r?\r?\n/);
if (!bodyStart) {
return false;
@ -66,7 +71,8 @@ let queryHandlers = {
// matches message source
text: function (message, query) {
return (message.raw || '').toString().toLowerCase().indexOf((query.value || '').toString().toLowerCase()) >= 0;
let body = indexer.getContents(message.mimeTree).toString();
return body.toLowerCase().indexOf((query.value || '').toString().toLowerCase()) >= 0;
},
// matches message UID number. Sequence queries are also converted to UID queries
@ -76,15 +82,18 @@ let queryHandlers = {
// matches message source size
size: function (message, query) {
let raw = message.raw || '';
let size = message.size;
if (!size) {
size = (message.raw || '').length;
}
switch (query.operator) {
case '<':
return raw.length < query.value;
return size < query.value;
case '=':
return raw.length === query.value;
return size === query.value;
case '>':
return raw.length > query.value;
return size > query.value;
}
return false;

82
imap.js
View file

@ -722,7 +722,6 @@ server.onFetch = function (path, options, session, callback) {
};
if (!options.metadataOnly) {
//projection.raw = true;
projection.mimeTree = true;
}
@ -835,12 +834,13 @@ server.onSearch = function (path, options, session, callback) {
let projection = {
uid: true,
internaldate: true,
headerdate: true,
flags: true,
modseq: true
};
if (options.terms.includes('body') || options.terms.includes('text') || options.terms.includes('header')) {
projection.raw = true;
projection.mimeTree = true;
}
if (!options.terms.includes('all')) {
@ -934,6 +934,72 @@ server.onSearch = function (path, options, session, callback) {
internaldate: entry
});
}
break;
case 'headerdate':
{
let op = false;
let value = new Date(term.value + ' GMT');
switch (term.operator) {
case '<':
op = '$lt';
break;
case '<=':
op = '$lte';
break;
case '>':
op = '$gt';
break;
case '>=':
op = '$gte';
break;
}
let entry = !op ? [{
$gte: value
}, {
$lt: new Date(value.getTime() + 24 * 3600 * 1000)
}] : {
[op]: value
};
if (!query.$and) {
query.$and = [];
}
query.$and.push({
headerdate: entry
});
}
break;
case 'size':
{
let op = '$eq';
let value = Number(term.value) || 0;
switch (term.operator) {
case '<':
op = '$lt';
break;
case '<=':
op = '$lte';
break;
case '>':
op = '$gt';
break;
case '>=':
op = '$gte';
break;
}
let entry = {
[op]: value
};
if (!query.$and) {
query.$and = [];
}
query.$and.push({
size: entry
});
}
break;
}
});
}
@ -1040,13 +1106,21 @@ server.addToMailbox = (username, path, meta, date, flags, raw, callback) => {
let mailbox = item.value;
let internaldate = date && new Date(date) || new Date();
let headerdate = mimeTree.parsedHeader.date && new Date(mimeTree.parsedHeader.date);
if (headerdate.toString() === 'Invalid Date') {
headerdate = internaldate;
}
let message = {
mailbox: mailbox._id,
uid: mailbox.uidNext,
internaldate: date && new Date(date) || new Date(),
raw,
internaldate,
headerdate,
flags,
unseen: !flags.includes('\\Seen'),
size: raw.length,
meta,
modseq: 0,
mimeTree,

View file

@ -52,10 +52,24 @@ db.messages.createIndex({
});
db.messages.createIndex({
date: 1
internaldate: 1
});
db.messages.createIndex({
date: -1
internaldate: -1
});
db.messages.createIndex({
headerdate: 1
});
db.messages.createIndex({
headerdate: -1
});
db.messages.createIndex({
size: 1
});
db.messages.createIndex({
size: -1
});
db.messages.createIndex({