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, };