mirror of
https://github.com/nodemailer/wildduck.git
synced 2024-09-20 23:36:15 +08:00
updated imap handling
This commit is contained in:
parent
248b9e2e11
commit
a0ce2acc40
|
@ -499,10 +499,14 @@ module.exports.getQueryResponse = function (query, message, options) {
|
|||
break;
|
||||
|
||||
case 'envelope':
|
||||
if (message.envelope) {
|
||||
value = message.envelope;
|
||||
} else {
|
||||
if (!mimeTree) {
|
||||
mimeTree = indexer.parseMimeTree(message.raw);
|
||||
}
|
||||
value = indexer.getEnvelope(mimeTree);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'rfc822':
|
||||
|
@ -513,10 +517,14 @@ module.exports.getQueryResponse = function (query, message, options) {
|
|||
break;
|
||||
|
||||
case 'rfc822.size':
|
||||
if (message.size) {
|
||||
value = message.size;
|
||||
} else {
|
||||
if (!mimeTree) {
|
||||
mimeTree = indexer.parseMimeTree(message.raw);
|
||||
}
|
||||
value = indexer.getSize(mimeTree);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'rfc822.header':
|
||||
|
|
|
@ -36,12 +36,17 @@ let queryHandlers = {
|
|||
|
||||
// matches message header date
|
||||
date: function (message, query) {
|
||||
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
82
imap.js
|
@ -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,
|
||||
|
|
18
indexes.js
18
indexes.js
|
@ -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({
|
||||
|
|
Loading…
Reference in a new issue