Upyo : une bibliothèque moderne d’envoi d’e-mails cross-runtime pour JavaScript/TypeScript
(upyo.org)Bonjour. Je partage une bibliothèque d’envoi d’e-mails que j’ai créée à titre personnel.
Pourquoi l’avoir créée ?
En travaillant récemment sur plusieurs projets, j’ai été amené à utiliser différents runtimes comme Node.js, Deno et Bun, et il était contraignant de devoir à chaque fois chercher une bibliothèque différente pour l’envoi d’e-mails ou refaire toute la configuration. En particulier, sur Deno ou Bun, les bibliothèques d’e-mail prévues pour Node.js ne fonctionnaient souvent pas correctement.
C’est pourquoi j’ai créé Upyo, en me disant qu’il serait utile d’avoir une bibliothèque d’e-mail qui « s’écrit une fois et fonctionne partout ».
Principales caractéristiques
Compatibilité cross-runtime
Elle fonctionne avec le même code sur Node.js, Deno, Bun, ainsi que dans les edge functions. Aucun réglage spécifique au runtime ni modification de code n’est nécessaire.
Zéro dépendance
Comme je n’aime pas particulièrement embarquer de nombreuses dépendances, je l’ai conçue avec zéro dépendance. Par exemple, le transport SMTP a lui aussi été développé directement, sans utiliser de package smtp.
API simple
Conçue pour permettre d’envoyer des e-mails en quelques lignes, sans configuration complexe :
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);
Indépendance vis-à-vis des fournisseurs
Compatible avec différents services d’e-mail comme SMTP, Mailgun et SendGrid, tout en permettant de conserver le même code applicatif même si vous changez de fournisseur. Il suffit de remplacer le Transport. (La prise en charge d’Amazon SES arrivera dans la prochaine version.)
Conçue pour les tests
Un MockTransport est fourni pour tester la logique d’e-mail sans envoyer de véritables messages. Vous pouvez donc tester sans craindre d’expédier un vrai e-mail par erreur pendant le développement.
Points encore incomplets
- La prise en charge de STARTTLS n’est pas encore implémentée dans le transport SMTP
- Dans les edge functions, SMTP n’est pas encore pris en charge (seuls les transports basés sur des API HTTP sont possibles)
- Le projet en est encore au tout début de son développement, l’API peut donc évoluer
Essayer
Utilisable sur différents runtimes :
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
En plus de @upyo/smtp, les packages de transport incluent @upyo/mailgun, @upyo/sendgrid, @upyo/ses et @upyo/mock, et d’autres seront ajoutés à l’avenir.
Documentation : https://upyo.org
Code : https://github.com/dahlia/upyo
Conclusion
C’est un projet né d’un besoin personnel, mais je le partage car il pourrait aussi aider celles et ceux qui rencontrent des problématiques similaires. Ce n’est encore que la version 0.1.0, mais je compte l’améliorer régulièrement.
Les retours et contributions sont toujours les bienvenus !
Upyo est un nom inspiré du mot coréen « timbre-poste ». L’idée est d’envoyer des e-mails comme on envoie une lettre avec un timbre.
6 commentaires
C’est un projet auquel je m’identifie, ayant moi-même déjà changé d’API deux ou trois fois. Le site comme la documentation semblent avoir été réalisés de façon très propre et soignée. Quand on exploite un service, il arrive parfois qu’un prestataire d’e-mail tombe en panne, ce qui oblige à mettre en place un autre service de messagerie en failover ; ce serait donc bien d’avoir aussi du code permettant d’exploiter les transports selon un concept de pool. Ce serait bien aussi si
resend.cométait pris en charge. Si ce n’est toujours pas le cas quand j’en viendrai à l’adopter, j’essaierai même de contribuer moi-même ~ !Merci pour vos retours ! Nous allons essayer d’ajouter bientôt
PoolTransportetResendTransport!Que diriez-vous de remplacer le symbole « 郵票 » par « timbre » ?
C'est déjà vraiment parfait et très joli tel quel, donc j'hésite un peu à le suggérer..
Oh~ c’est bien~ super super
C'est un projet solo ?? C'est impressionnant...
Oui, jusqu’à présent, je l’ai encore développé seul. 😅