summaryrefslogtreecommitdiff
path: root/app/imap.js
diff options
context:
space:
mode:
Diffstat (limited to 'app/imap.js')
-rw-r--r--app/imap.js38
1 files changed, 38 insertions, 0 deletions
diff --git a/app/imap.js b/app/imap.js
index 1ac76a4..f2e8cc2 100644
--- a/app/imap.js
+++ b/app/imap.js
@@ -3,6 +3,7 @@ const { ImapFlow } = require('imapflow');
ipcMain.on('imap:listTree:from', listTreeFrom);
ipcMain.on('imap:listTree:to', listTreeTo);
+ipcMain.on('imap:migrate', migrate);
async function connect (options) {
const client = new ImapFlow({
@@ -32,3 +33,40 @@ async function listTreeTo (event, options) {
event.reply('imap:listTree:to:reply', await client.listTree());
await client.logout();
}
+
+async function migrate (event, { from, to }) {
+ const fromClient = await connect(from);
+ const toClient = await connect(to);
+
+ const fromFolders = (await fromClient.list()).filter((folder) => folder.subscribed);
+ for (const fromFolder of fromFolders) {
+ try {
+ await toClient.mailboxCreate(fromFolder.path);
+ } catch (e) {}
+
+ const fromMailbox = await fromClient.getMailboxLock(fromFolder.path);
+ const toMailbox = await toClient.getMailboxLock(fromFolder.path);
+ try {
+ const toMsgsGenerator = await toClient.fetch('1:*', { flags: true, envelope: true, source: true });
+ const toMsgs = [];
+ for await (const toMsg of toMsgsGenerator) {
+ toMsgs.push(toMsg);
+ }
+ const fromMsgsGenerator = await fromClient.fetch('1:*', { flags: true, envelope: true, source: true });
+
+ for await (const fromMsg of fromMsgsGenerator) {
+ if (toMsgs.some((toMsg) => Buffer.compare(toMsg.source, fromMsg.source) === 0)) {
+ continue;
+ }
+
+ await toClient.append(fromFolder.path, fromMsg.source, Array.from(fromMsg.flags), fromMsg.envelope.date);
+ }
+ } finally {
+ fromMailbox.release();
+ toMailbox.release();
+ }
+ }
+
+ await fromClient.logout();
+ await toClient.logout();
+}