feat: parse <author> from From header in RSS items

Parse the From header into name + email parts so the feed library
renders proper RFC 2822 format (email (Name)) in <author> elements.
Also passes feedId to the generator so item links can point to the
upcoming /entries/:feedId/:receivedAt route.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Julien Herr
2026-05-20 23:50:54 +02:00
parent 6a6614fb26
commit 54e7a1bfa0
2 changed files with 19 additions and 7 deletions
+1 -1
View File
@@ -62,7 +62,7 @@ export async function handle(c: Context): Promise<Response> {
// 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, {
+18 -6
View File
@@ -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,
});
}