안녕하세요. 개인적으로 이메일 발송 라이브러리를 만들어서 공유해봅니다.
왜 만들게 되었나요?
최근에 여러 프로젝트를 진행하면서 Node.js, Deno, Bun 등 다양한 런타임을 사용하게 되었는데, 이메일 발송 부분에서 매번 다른 라이브러리를 찾거나 설정을 다시 해야 하는 불편함이 있었습니다. 특히 Deno나 Bun에서는 Node.js용 이메일 라이브러리들이 제대로 동작하지 않는 경우가 많더라고요.
그래서 “한 번 작성하면 어디서든 동작하는” 이메일 라이브러리가 있으면 좋겠다는 생각에 Upyo를 만들게 되었습니다.
주요 특징
크로스 런타임 호환성
Node.js, Deno, Bun, 그리고 에지 함수(edge functions)에서 동일한 코드로 작동합니다. 런타임별로 다른 설정이나 코드 변경이 필요 없습니다.
제로 의존성
개인적으로 여러 의존성이 딸려 들어오는 것을 선호하지 않다 보니, 제로 의존성으로 제작하게 되었습니다. 이를테면 SMTP 트랜스포트도 smtp
패키지를 사용하지 않고, 직접 개발했습니다.
단순한 API
복잡한 설정 없이 몇 줄로 이메일을 보낼 수 있도록 설계했습니다:
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);
제공 업체 독립성
SMTP, Mailgun, SendGrid 등 다양한 이메일 서비스를 지원하며, 제공 업체를 바꿔도 애플리케이션 코드는 그대로 유지됩니다. Transport
만 교체하면 됩니다. (다음 버전에는 Amazon SES 지원도 들어갑니다.)
테스트 친화적
실제 이메일을 보내지 않고도 이메일 로직을 테스트할 수 있는 MockTransport
를 제공합니다. 개발 중에 실수로 실제 이메일이 발송되는 걱정 없이 테스트할 수 있습니다.
아직 부족한 부분들
- SMTP 트랜스포트에서 STARTTLS 지원이 아직 구현되지 않았습니다
- 에지 함수에서 SMTP는 아직 지원하지 않습니다 (HTTP API 기반 트랜스포트만 가능)
- 아직 초기 개발 단계라 API가 변경될 수 있습니다
사용해보기
다양한 런타임에서 사용 가능합니다:
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
트랜스포트 패키지는 @upyo/smtp
외에도 @upyo/mailgun
, @upyo/sendgrid
, @upyo/ses
, @upyo/mock
이 있고, 앞으로도 더 추가될 예정입니다.
문서: https://upyo.org
코드: https://github.com/dahlia/upyo
마무리
개인적인 필요에 의해 시작한 프로젝트이지만, 혹시 비슷한 고민을 하고 계신 분들께 도움이 될 수 있을 것 같아 공유해봅니다. 아직 버전 0.1.0이지만, 꾸준히 개선해나갈 예정입니다.
피드백이나 기여는 언제든 환영합니다!
Upyo는 한국어 “우표”에서 따온 이름입니다. 우표로 편지를 보내듯 이메일을 보낸다는 의미로 지었습니다.