139 lines
4.9 KiB
JavaScript
139 lines
4.9 KiB
JavaScript
const { getAddresseId } = require("../sql/mail");
|
|
const { DEBUG } = require("../utils/debug");
|
|
const { simpleParser } = require("mailparser");
|
|
|
|
const {
|
|
registerMessage,
|
|
registerMailbox_message,
|
|
saveHeader_fields,
|
|
saveAddress_fields,
|
|
} = require("../sql/saveMessage");
|
|
const { getMailboxId, getField } = require("../sql/mail");
|
|
|
|
function saveMessage(attrs, mailboxId, imap) {
|
|
console.log("SAVE MSG")
|
|
// console.log(attrs.struct);
|
|
const envelope = attrs.envelope;
|
|
const timestamp = new Date(envelope.date).getTime();
|
|
const rfc822size = attrs.size;
|
|
registerMessage(timestamp, rfc822size, envelope.messageId).then(
|
|
(messageId) => {
|
|
const seen = attrs.flags.includes("Seen") ? 1 : 0; // todo verify
|
|
const deleted = attrs.flags.includes("Deleted") ? 1 : 0; // todo verify
|
|
|
|
registerMailbox_message(
|
|
mailboxId,
|
|
attrs.uid,
|
|
messageId,
|
|
attrs.modseq,
|
|
seen,
|
|
deleted
|
|
);
|
|
// // attributes.struct.forEach(part => {
|
|
// // // saveBodyparts().then((bodypartId) => {
|
|
// // // const partText = undefined;
|
|
// // // savePart_numbers(messageId, partText, bodypartId, part.size, part.lines)
|
|
// // // });
|
|
// // });
|
|
const len = attrs.struct.length;
|
|
console.log(attrs.struct);
|
|
// // attrs.struct.forEach((part) => {
|
|
// // console.log(part)
|
|
// console.log("----------");
|
|
// if (len > 1) part = part[0];
|
|
// if (part?.type == "text") {
|
|
// console.log(part.partID);
|
|
// console.log(attrs.uid);
|
|
// const uid = attrs.uid;
|
|
// const bodies = ["HEADER", "1.TEXT", "2.TEXT", "2.HTML"];
|
|
|
|
// const fetchOptions = {
|
|
// bodies: bodies,
|
|
// };
|
|
|
|
const fetch = imap.fetch(attrs.uid, { bodies: ["HEADER.FIELDS (FROM)", 2] });
|
|
|
|
fetch.on("message", (msg) => {
|
|
msg.on("body", (stream, info) => {
|
|
simpleParser(stream, async (err, parsed) => {
|
|
console.log(parsed);
|
|
});
|
|
});
|
|
|
|
msg.once("end", () => {
|
|
console.log("Finished fetching message");
|
|
});
|
|
});
|
|
|
|
fetch.once("error", (err) => {
|
|
console.log(err);
|
|
});
|
|
|
|
fetch.once("end", () => {
|
|
console.log("Done fetching all messages");
|
|
});
|
|
// }
|
|
// });
|
|
|
|
// // const part = ''; // todo when transfered
|
|
|
|
// // save envelope (header + from, to, subject, date, cc)
|
|
// Object.keys(attributes.envelope).forEach(key => {
|
|
// const newKey = keyNormalizer(key);
|
|
// if (isHeader(newKey)) {
|
|
// getField(newKey).then((fieldId) => {
|
|
// saveHeader_fields(messageId, part, 2, fieldId, attributes.envelope[key]);
|
|
// });
|
|
// } else {
|
|
// getField(newKey).then((fieldId) => {
|
|
// if (attributes.envelope[key]) {
|
|
// attributes.envelope[key].forEach((elt, index) => {
|
|
// saveAddress_fields(messageId, part, fieldId, index, getAddresseId(`${elt.mailbox}@${elt.host}`, elt.name));
|
|
// });
|
|
// }
|
|
// });
|
|
// }
|
|
// });
|
|
|
|
// // // save more header
|
|
// // message.headerLines.forEach(elt => {
|
|
// // const newKey = keyNormalizer(elt.key);
|
|
// // getField(newKey).then((fieldId) => {
|
|
// // saveHeader_fields(messageId, part, 2, fieldId, elt[line]);
|
|
// // });
|
|
// // });
|
|
|
|
// // // todo add date field
|
|
}
|
|
);
|
|
}
|
|
|
|
function isHeader(key) {
|
|
switch (key) {
|
|
case "date":
|
|
case "subject":
|
|
case "messageId":
|
|
return true;
|
|
case "from":
|
|
case "sender":
|
|
case "replyTo":
|
|
case "to":
|
|
case "cc":
|
|
case "bcc":
|
|
case "inReplyTo":
|
|
return false;
|
|
default:
|
|
DEBUG.log("Unknown header key: " + key);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
function keyNormalizer(key) {
|
|
// todo
|
|
return key;
|
|
}
|
|
|
|
module.exports = {
|
|
saveMessage,
|
|
};
|