mail/back/imap/storeMessage.js
2023-03-10 16:08:50 +01:00

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