31 points par hongminhee 2025-07-14 | 6 commentaires | Partager sur WhatsApp

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

 
davidshim 2025-08-13

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 ~ !

 
hongminhee 2025-08-13

Merci pour vos retours ! Nous allons essayer d’ajouter bientôt PoolTransport et ResendTransport !

 
nemorize 2025-07-15

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

 
zinisuni 2025-07-15

Oh~ c’est bien~ super super

 
cgl00 2025-07-15

C'est un projet solo ?? C'est impressionnant...

 
hongminhee 2025-07-15

Oui, jusqu’à présent, je l’ai encore développé seul. 😅