Upyo: Moderne Cross-Runtime-Bibliothek zum Versenden von E-Mails für JavaScript/TypeScript
(upyo.org)Hallo, ich möchte hier eine selbst entwickelte Bibliothek zum Versenden von E-Mails vorstellen und teilen.
Warum habe ich sie entwickelt?
In letzter Zeit habe ich bei verschiedenen Projekten unterschiedliche Runtimes wie Node.js, Deno und Bun verwendet. Dabei war es im Bereich E-Mail-Versand jedes Mal umständlich, eine andere Bibliothek zu suchen oder die Konfiguration neu aufzusetzen. Gerade unter Deno oder Bun funktionieren E-Mail-Bibliotheken für Node.js oft nicht richtig.
Deshalb habe ich Upyo entwickelt, weil ich dachte, es wäre praktisch, eine E-Mail-Bibliothek zu haben, die man „einmal schreibt und überall ausführt“.
Hauptmerkmale
Cross-Runtime-Kompatibilität
Sie funktioniert mit demselben Code unter Node.js, Deno, Bun und in Edge Functions. Es sind keine runtime-spezifischen Einstellungen oder Codeänderungen erforderlich.
Zero Dependencies
Da ich persönlich keine Vorliebe für viele mitgezogene Abhängigkeiten habe, habe ich sie als Zero-Dependency-Bibliothek entwickelt. So wurde zum Beispiel auch der SMTP-Transport nicht mit dem Paket smtp umgesetzt, sondern direkt selbst entwickelt.
Einfache API
Sie wurde so entworfen, dass sich E-Mails ohne komplizierte Konfiguration mit nur wenigen Zeilen versenden lassen:
import { createMessage } from "@upyo/core";
import { MailgunTransport } from "@upyo/mailgun";
const message = createMessage({
from: "sender@example.com",
to: "recipient@example.com",
subject: "Hello from Upyo!",
content: { text: "간단한 이메일입니다." },
});
const transport = new MailgunTransport({
apiKey: process.env.MAILGUN_KEY,
domain: process.env.MAILGUN_DOMAIN,
});
const receipt = await transport.send(message);
Unabhängigkeit vom Anbieter
Es unterstützt verschiedene E-Mail-Dienste wie SMTP, Mailgun und SendGrid. Auch wenn der Anbieter gewechselt wird, bleibt der Anwendungscode unverändert. Es muss nur der Transport ausgetauscht werden. (In der nächsten Version kommt auch Unterstützung für Amazon SES hinzu.)
Testfreundlich
Es wird ein MockTransport bereitgestellt, mit dem sich die E-Mail-Logik testen lässt, ohne tatsächlich E-Mails zu versenden. So kann man testen, ohne befürchten zu müssen, während der Entwicklung versehentlich echte E-Mails zu verschicken.
Noch unvollständige Bereiche
- Im SMTP-Transport ist die Unterstützung für STARTTLS noch nicht implementiert
- In Edge Functions wird SMTP derzeit noch nicht unterstützt (nur HTTP-API-basierte Transports sind möglich)
- Das Projekt befindet sich noch in einer frühen Entwicklungsphase, daher kann sich die API noch ändern
Ausprobieren
Es kann in verschiedenen Runtimes verwendet werden:
npm add @upyo/core @upyo/smtp
pnpm add @upyo/core @upyo/smtp
yarn add @upyo/core @upyo/smtp
deno add --jsr @upyo/core @upyo/smtp
bun add @upyo/core @upyo/smtp
Neben @upyo/smtp gibt es als Transport-Pakete auch @upyo/mailgun, @upyo/sendgrid, @upyo/ses und @upyo/mock, und künftig sollen noch weitere hinzukommen.
Dokumentation: https://upyo.org
Code: https://github.com/dahlia/upyo
Abschluss
Das Projekt entstand aus einem persönlichen Bedarf heraus, aber ich dachte, es könnte auch für andere hilfreich sein, die vor ähnlichen Herausforderungen stehen, und möchte es deshalb hier teilen. Es ist zwar noch Version 0.1.0, wird aber kontinuierlich weiter verbessert.
Feedback oder Beiträge sind jederzeit willkommen!
Upyo ist ein Name, der vom koreanischen Wort für „Briefmarke“ abgeleitet ist. Er soll ausdrücken, dass man mit Upyo E-Mails verschickt, so wie man mit einer Briefmarke Briefe versendet.
6 Kommentare
Das ist ein Projekt, mit dem ich mich gut identifizieren kann, weil ich selbst schon zwei- oder dreimal die API wechseln musste. Auch die Website und die Dokumentation scheinen sehr sauber und gelungen erstellt zu sein. Wenn man einen Service betreibt, kommt es gelegentlich vor, dass ein bestimmter Mail-Service ausfällt und man deshalb als Failover einen anderen Mail-Service aufbauen muss; es wäre daher schön, wenn es auch Code gäbe, mit dem sich
transportnach dem Pool-Konzept betreiben lässt. Es wäre auch toll, wennresend.comunterstützt würde. Falls das bis zu dem Zeitpunkt, an dem ich es später einsetze, noch nicht umgesetzt ist, werde ich vielleicht selbst etwas dazu beitragen~!Vielen Dank für das Feedback! Ich werde versuchen,
PoolTransportundResendTransportbald hinzuzufügen!Wie wäre es, das Symbol „郵票“ in „Briefmarke“ zu ändern?
Es ist schon jetzt wirklich perfekt und schön, deshalb bin ich damit auch ein wenig vorsichtig..
Oh~ das ist gut~ sehr gut
Ist das ein Ein-Personen-Projekt?? Wirklich beeindruckend..
Ja, bisher habe ich das noch allein entwickelt. 😅