31 Punkte von hongminhee 2025-07-14 | 6 Kommentare | Auf WhatsApp teilen

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

 
davidshim 2025-08-13

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 transport nach dem Pool-Konzept betreiben lässt. Es wäre auch toll, wenn resend.com unterstü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~!

 
hongminhee 2025-08-13

Vielen Dank für das Feedback! Ich werde versuchen, PoolTransport und ResendTransport bald hinzuzufügen!

 
nemorize 2025-07-15

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..

 
zinisuni 2025-07-15

Oh~ das ist gut~ sehr gut

 
cgl00 2025-07-15

Ist das ein Ein-Personen-Projekt?? Wirklich beeindruckend..

 
hongminhee 2025-07-15

Ja, bisher habe ich das noch allein entwickelt. 😅