save
This commit is contained in:
@@ -1,95 +1,138 @@
|
||||
const Imap = require('imap');
|
||||
const {simpleParser} = require('mailparser');
|
||||
const inspect = require('util').inspect;
|
||||
const saveMessage = require('./storeMessage').saveMessage;
|
||||
|
||||
const Imap = require("imap");
|
||||
const { simpleParser } = require("mailparser");
|
||||
const inspect = require("util").inspect;
|
||||
const saveMessage = require("./storeMessage").saveMessage;
|
||||
const imapConfig = require("./config.json").mail;
|
||||
|
||||
const fs = require("fs");
|
||||
const imap = new Imap({
|
||||
user: '',
|
||||
password: '',
|
||||
tlsOptions: {servername: "imap.gmail.com"},
|
||||
host: 'imap.gmail.com',
|
||||
port: 993,
|
||||
tls: true
|
||||
user: imapConfig.user,
|
||||
password: imapConfig.password,
|
||||
tlsOptions: { servername: "imap.gmail.com" },
|
||||
host: "imap.gmail.com",
|
||||
port: 993,
|
||||
tls: true,
|
||||
});
|
||||
|
||||
|
||||
imap.once('ready', function() {
|
||||
imap.once("ready", function () {
|
||||
const readOnly = true;
|
||||
imap.openBox('INBOX', readOnly, (err, box) => {
|
||||
imap.openBox("INBOX", readOnly, (err, box) => {
|
||||
// console.log(box); // uidvalidty uidnext, messages total and new
|
||||
|
||||
if (err) throw err;
|
||||
const f = imap.seq.fetch('2:2', {
|
||||
bodies: ['HEADER.FIELDS (FROM)','TEXT'],
|
||||
struct: true,
|
||||
envelope: true,
|
||||
extensions: true
|
||||
imap.search(["ALL"], function (err, results) {
|
||||
console.log(results[results.length - 1]);
|
||||
});
|
||||
|
||||
f.on('message', function(msg, seqno) {
|
||||
// console.log('Message #%d', seqno);
|
||||
var prefix = '(#' + seqno + ') ';
|
||||
let attributes = undefined;
|
||||
let body = undefined;
|
||||
|
||||
msg.on('body', function(stream, info) {
|
||||
simpleParser(stream, async (err, parsed) => {
|
||||
body = parsed;
|
||||
if (attributes) {
|
||||
saveMessage(body, attributes);
|
||||
};
|
||||
// console.log(parsed.headers)
|
||||
// const {from, subject, textAsHtml, text} = parsed;
|
||||
// console.log(parsed.attachments)
|
||||
// console.log(prefix + parsed.text)
|
||||
// console.log(parsed.from.value);
|
||||
// console.log(parsed.subject);
|
||||
// console.log(parsed.date)
|
||||
// console.log(parsed.replyTo.value);
|
||||
// console.log(parsed.messageId);
|
||||
// console.log(parsed.html);
|
||||
// console.log(parsed.text);
|
||||
// console.log(parsed.textAsHtml);
|
||||
});
|
||||
});
|
||||
|
||||
const f = imap.fetch(969, { size: true, struct: true, envelope: true });
|
||||
// var f = imap.seq.fetch('1:3', {
|
||||
// bodies: 'HEADER.FIELDS (FROM TO SUBJECT DATE)',
|
||||
// struct: true
|
||||
// });
|
||||
f.on("message", function (msg, seqno) {
|
||||
// console.log("Message #%d", seqno);
|
||||
// var prefix = "(#" + seqno + ") ";
|
||||
// msg.on("body", function (stream, info) {
|
||||
// simpleParser(stream, async (err, parsed) => {
|
||||
// // find box id;
|
||||
// console.log(parsed)
|
||||
// const boxId = 1;
|
||||
// // saveMessage(parsed, boxId);
|
||||
// console.log(parsed.subject);
|
||||
// fs.writeFileSync("./test.json", JSON.stringify(parsed));
|
||||
// });
|
||||
// // console.log(prefix + 'Body');
|
||||
// // stream.pipe(fs.createWriteStream('msg-' + seqno + '-body.txt'));
|
||||
// });
|
||||
msg.once('attributes', attrs => {
|
||||
attributes = attrs;
|
||||
if (body) {
|
||||
saveMessage(body, attributes);
|
||||
};
|
||||
// console.log(prefix + 'Attributes: %s', inspect(attrs, false, 8));
|
||||
|
||||
// todo find boxId
|
||||
const boxId = 1;
|
||||
saveMessage(attrs, boxId, imap);
|
||||
});
|
||||
|
||||
msg.once('end', function() {
|
||||
console.log(prefix + 'Finished');
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
f.once('error', function(err) {
|
||||
console.log('Fetch error: ' + err);
|
||||
});
|
||||
|
||||
f.once('end', function() {
|
||||
console.log('Done fetching all messages!');
|
||||
imap.end();
|
||||
});
|
||||
|
||||
|
||||
f.once("error", function (err) {
|
||||
console.log("Fetch error: " + err);
|
||||
});
|
||||
f.once("end", function () {
|
||||
console.log("Done fetching all messages!");
|
||||
// imap.end();
|
||||
});
|
||||
// });
|
||||
return;
|
||||
// if (err) throw err;
|
||||
// const f = imap.seq.fetch('2:2', {
|
||||
// bodies: ['HEADER.FIELDS (FROM)','TEXT'],
|
||||
// struct: true,
|
||||
// envelope: true,
|
||||
// extensions: true
|
||||
// });
|
||||
|
||||
// f.on('message', function(msg, seqno) {
|
||||
// // console.log('Message #%d', seqno);
|
||||
// var prefix = '(#' + seqno + ') ';
|
||||
// let attributes = undefined;
|
||||
// let body = undefined;
|
||||
|
||||
// msg.on('body', function(stream, info) {
|
||||
// simpleParser(stream, async (err, parsed) => {
|
||||
// body = parsed;
|
||||
// // console.log(body)
|
||||
// if (attributes) {
|
||||
// saveMessage(body, attributes);
|
||||
// };
|
||||
// // console.log(parsed.headers)
|
||||
// // const {from, subject, textAsHtml, text} = parsed;
|
||||
// // console.log(parsed.attachments)
|
||||
// // console.log(prefix + parsed.text)
|
||||
// // console.log(parsed.from.value);
|
||||
// // console.log(parsed.subject);
|
||||
// // console.log(parsed.date)
|
||||
// // console.log(parsed.replyTo.value);
|
||||
// // console.log(parsed.messageId);
|
||||
// // console.log(parsed.html);
|
||||
// // console.log(parsed.text);
|
||||
// // console.log(parsed.textAsHtml);
|
||||
// });
|
||||
// });
|
||||
|
||||
// msg.once('attributes', attrs => {
|
||||
// attributes = attrs;
|
||||
// console.log(attributes)
|
||||
// if (body) {
|
||||
// saveMessage(body, attributes);
|
||||
// };
|
||||
// // console.log(prefix + 'Attributes: %s', inspect(attrs, false, 8));
|
||||
|
||||
// });
|
||||
|
||||
// msg.once('end', function() {
|
||||
// console.log(prefix + 'Finished');
|
||||
// });
|
||||
|
||||
// });
|
||||
|
||||
// f.once('error', function(err) {
|
||||
// console.log('Fetch error: ' + err);
|
||||
// });
|
||||
|
||||
// f.once('end', function() {
|
||||
// console.log('Done fetching all messages!');
|
||||
// imap.end();
|
||||
// });
|
||||
});
|
||||
});
|
||||
|
||||
imap.once('error', function(err) {
|
||||
});
|
||||
|
||||
imap.once("error", function (err) {
|
||||
console.log(err);
|
||||
});
|
||||
|
||||
imap.once('end', function() {
|
||||
console.log('Connection ended');
|
||||
});
|
||||
|
||||
imap.connect();
|
||||
});
|
||||
|
||||
imap.once("end", function () {
|
||||
console.log("Connection ended");
|
||||
});
|
||||
|
||||
imap.connect();
|
||||
|
||||
// const getEmails = () => {
|
||||
// imap.once('ready', () => {
|
||||
@@ -116,7 +159,7 @@ imap.once('ready', function() {
|
||||
// // 'mime-version' => '1.0',
|
||||
// // 'content-type' => { value: 'text/html', params: [Object] },
|
||||
// // 'content-transfer-encoding' => 'quoted-printable'
|
||||
|
||||
|
||||
// });
|
||||
// });
|
||||
// msg.once('attributes', attrs => {
|
||||
@@ -149,14 +192,14 @@ imap.once('ready', function() {
|
||||
|
||||
// imap.connect();
|
||||
// };
|
||||
|
||||
|
||||
// getEmails();
|
||||
|
||||
|
||||
function isValidEmail(email) {
|
||||
// todo
|
||||
return true;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
isValidEmail
|
||||
}
|
||||
isValidEmail,
|
||||
};
|
||||
|
||||
@@ -1,62 +1,129 @@
|
||||
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');
|
||||
const {
|
||||
registerMessage,
|
||||
registerMailbox_message,
|
||||
saveHeader_fields,
|
||||
saveAddress_fields,
|
||||
} = require("../sql/saveMessage");
|
||||
const { getMailboxId, getField } = require("../sql/mail");
|
||||
|
||||
function saveMessage(message, attributes, mailbox) {
|
||||
const timestamp = new Date(attributes.envelope.date).getTime();
|
||||
const rfc822size = 0; // todo
|
||||
registerMessage(timestamp, rfc822size).then((messageId) => {
|
||||
getMailboxId(mailbox).then((mailboxId) => {
|
||||
const seen = attributes.flags.includes('Seen') ? 1 : 0; // todo verify
|
||||
const deleted = attributes.flags.includes('Deleted') ? 1 : 0; // todo verify
|
||||
registerMailbox_message(mailboxId, attributes.uid, messageId, attributes.modseq, seen, deleted).then(() => {
|
||||
attributes.struct.forEach(part => {
|
||||
// saveBodyparts().then((bodypartId) => {
|
||||
// const partText = undefined;
|
||||
// savePart_numbers(messageId, partText, bodypartId, part.size, part.lines)
|
||||
// });
|
||||
});
|
||||
const part = ''; // todo
|
||||
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]);
|
||||
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);
|
||||
});
|
||||
});
|
||||
} 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));
|
||||
});
|
||||
}
|
||||
|
||||
msg.once("end", () => {
|
||||
console.log("Finished fetching message");
|
||||
});
|
||||
}
|
||||
});
|
||||
// todo add date field
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
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':
|
||||
case "date":
|
||||
case "subject":
|
||||
case "messageId":
|
||||
return true;
|
||||
case 'from':
|
||||
case 'sender':
|
||||
case 'replyTo':
|
||||
case 'to':
|
||||
case 'cc':
|
||||
case 'bcc':
|
||||
case 'inReplyTo':
|
||||
case "from":
|
||||
case "sender":
|
||||
case "replyTo":
|
||||
case "to":
|
||||
case "cc":
|
||||
case "bcc":
|
||||
case "inReplyTo":
|
||||
return false;
|
||||
default:
|
||||
DEBUG.log("Unknown header key: "+key);
|
||||
DEBUG.log("Unknown header key: " + key);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -66,7 +133,6 @@ function keyNormalizer(key) {
|
||||
return key;
|
||||
}
|
||||
|
||||
|
||||
module.exports = {
|
||||
saveMessage
|
||||
}
|
||||
saveMessage,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user