diff --git a/src/routes/rss.ts b/src/routes/rss.ts index 2c654eb..1e6a23d 100644 --- a/src/routes/rss.ts +++ b/src/routes/rss.ts @@ -62,7 +62,7 @@ export async function handle(c: Context): Promise { // Generate the RSS feed XML const baseUrl = `https://${env.DOMAIN}`; - const rssXml = generateRssFeed(feedConfig, emailsData, baseUrl); + const rssXml = generateRssFeed(feedConfig, emailsData, baseUrl, feedId); // Return the RSS feed with appropriate content type return new Response(rssXml, { diff --git a/src/utils/feed-generator.ts b/src/utils/feed-generator.ts index 08b9a6d..aa5f22c 100644 --- a/src/utils/feed-generator.ts +++ b/src/utils/feed-generator.ts @@ -1,6 +1,18 @@ import { Feed } from "feed"; import { FeedConfig, EmailData } from "../types"; +function parseFromAddress(from: string): { name: string; email?: string } { + const match = from.match(/^(.*?)\s*<([^>]+)>\s*$/); + if (match) { + return { name: match[1].trim() || match[2], email: match[2].trim() }; + } + const emailOnly = from.match(/^[^\s@]+@[^\s@]+\.[^\s@]+$/); + if (emailOnly) { + return { email: from.trim(), name: from.trim() }; + } + return { name: from.trim() }; +} + /** * Generate an RSS feed from a list of emails */ @@ -8,6 +20,7 @@ export function generateRssFeed( feedConfig: FeedConfig, emails: EmailData[], baseUrl: string, + feedId?: string, ): string { // Create a new feed const feed = new Feed({ @@ -34,18 +47,17 @@ export function generateRssFeed( for (const email of emails) { const date = new Date(email.receivedAt); const uniqueId = `${email.receivedAt}-${Buffer.from(email.subject).toString("base64").substring(0, 10)}`; + const entryLink = feedId + ? `${baseUrl}/entries/${feedId}/${email.receivedAt}` + : `${baseUrl}/emails/${uniqueId}`; feed.addItem({ title: email.subject, id: uniqueId, - link: `${baseUrl}/emails/${uniqueId}`, + link: entryLink, description: email.content, content: email.content, - author: [ - { - name: email.from, - }, - ], + author: [parseFromAddress(email.from)], date: date, }); }