rsshub
Version:
Make RSS Great Again!
96 lines (94 loc) • 2.98 kB
JavaScript
import { t as config } from "./config-C37vj7VH.mjs";
import { t as logger_default } from "./logger-Czu8UMNd.mjs";
import { t as parseDate } from "./parse-date-BrP7mxXf.mjs";
import { t as cache_default } from "./cache-Bo__VnGm.mjs";
import { t as config_not_found_default } from "./config-not-found-Dyp3RlZZ.mjs";
import { ImapFlow } from "imapflow";
import { simpleParser } from "mailparser";
//#region lib/routes/mail/imap.ts
const route = {
path: "/imap/:email/:folder{.+}?",
name: "Unknown",
maintainers: [],
handler
};
async function handler(ctx) {
const { email, folder = "INBOX" } = ctx.req.param();
const { limit = 10 } = ctx.req.query();
const mailConfig = {
username: email,
port: 993,
...Object.fromEntries(new URLSearchParams(config.email.config[email.replaceAll(/[.@]/g, "_")]))
};
if (!mailConfig.username || !mailConfig.password || !mailConfig.host || !mailConfig.port) throw new config_not_found_default("Email Inbox RSS is disabled due to the lack of <a href=\"https://docs.rsshub.app/deploy/#route-specific-configurations\">relevant config</a>");
const client = new ImapFlow({
host: mailConfig.host,
port: Number.parseInt(mailConfig.port),
secure: true,
auth: {
user: mailConfig.username,
pass: mailConfig.password
},
proxy: config.proxyUri,
logger: {
debug: (log) => logger_default.debug(log.msg),
info: (log) => logger_default.info(log.msg),
warn: (log) => logger_default.warn(log.msg),
error: (log) => logger_default.error(log?.msg)
}
});
try {
await client.connect();
} catch (error) {
throw new Error(error.responseText);
}
/**
[
{
// https://imapflow.com/global.html#FetchMessageObject
seq: Number,
uid: Number,
envelope: {
// https://imapflow.com/global.html#MessageEnvelopeObject
},
id: 'md5-like-hash-string',
source: Buffer,
}
]
*/
const mails = [];
const lock = await client.getMailboxLock(folder);
try {
for await (const message of client.fetch(`${Math.max(client.mailbox.exists - limit + 1, 1)}:*`, {
envelope: true,
source: true,
uid: true
})) mails.push(message);
} finally {
lock.release();
}
const items = await Promise.all(mails.map((item) => cache_default.tryGet(`mail:${email}:${item.envelope.messageId}`, async () => {
const parsed = await simpleParser(item.source);
let description = parsed.html || parsed.textAsHtml;
if (parsed.attachments.length) {
description += `<h3>Attachments (${parsed.attachments.length})</h3>`;
for (const attachment of parsed.attachments) description += `<p>${attachment.filename}</p>`;
}
return {
title: item.envelope.subject,
description,
pubDate: parseDate(item.envelope.date),
author: parsed.from.text,
guid: `mail:${email}:${item.envelope.messageId}`
};
})));
await client.logout();
return {
title: `${email}'s Inbox${folder === "INBOX" ? "" : ` - ${folder}`}`,
link: `https://${email.split("@")[1]}`,
item: items,
allowEmpty: true
};
}
//#endregion
export { route };