# Show GN: Upyo: 현대적인 JavaScript/TypeScript용 크로스 런타임 이메일 전송 라이브러리

> Clean Markdown view of GeekNews topic #21971. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=21971](https://news.hada.io/topic?id=21971)
- GeekNews Markdown: [https://news.hada.io/topic/21971.md](https://news.hada.io/topic/21971.md)
- Type: show
- Author: [hongminhee](https://news.hada.io/@hongminhee)
- Published: 2025-07-14T10:55:37+09:00
- Updated: 2025-07-14T10:55:37+09:00
- Original source: [upyo.org](https://upyo.org/)
- Points: 31
- Comments: 6

## Summary

**Node.js, Deno, Bun** 등 다양한 **자바스크립트 런타임**에서 동일한 코드로 동작하는 **크로스 런타임 이메일 발송 라이브러리**가 등장해 이메일 통합 개발 경험이 간소화됩니다. Upyo는 **제로 의존성** 구조와 **단순한 API**를 제공해 설정 복잡성을 줄이고, **SMTP‧Mailgun‧SendGrid 등 벤더 독립적인 트랜스포트 구조**로 서비스 전환도 유연하게 지원합니다. 또한 **MockTransport**를 통한 테스트 친화성도 확보되어, 실제 이메일 발송 없이 로직을 검증할 수 있습니다. 아직 초기 단계로 일부 기능 미지원이 있지만, 다양한 환경에서 **통합적 이메일 발송 솔루션**을 찾는 개발자에게 새로운 선택지를 제공합니다.

## Topic Body

안녕하세요. 개인적으로 이메일 발송 라이브러리를 만들어서 공유해봅니다.  
  
#### 왜 만들게 되었나요?  
  
최근에 여러 프로젝트를 진행하면서 Node.js, Deno, Bun 등 다양한 런타임을 사용하게 되었는데, 이메일 발송 부분에서 매번 다른 라이브러리를 찾거나 설정을 다시 해야 하는 불편함이 있었습니다. 특히 Deno나 Bun에서는 Node.js용 이메일 라이브러리들이 제대로 동작하지 않는 경우가 많더라고요.  
  
그래서 “한 번 작성하면 어디서든 동작하는” 이메일 라이브러리가 있으면 좋겠다는 생각에 Upyo를 만들게 되었습니다.  
  
#### 주요 특징  
  
##### 크로스 런타임 호환성  
  
Node.js, Deno, Bun, 그리고 에지 함수(edge functions)에서 동일한 코드로 작동합니다. 런타임별로 다른 설정이나 코드 변경이 필요 없습니다.  
  
##### 제로 의존성  
  
개인적으로 여러 의존성이 딸려 들어오는 것을 선호하지 않다 보니, 제로 의존성으로 제작하게 되었습니다. 이를테면 SMTP 트랜스포트도 `smtp` 패키지를 사용하지 않고, 직접 개발했습니다.  
  
##### 단순한 API  
복잡한 설정 없이 몇 줄로 이메일을 보낼 수 있도록 설계했습니다:  
  
```typescript  
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가 변경될 수 있습니다  
  
#### 사용해보기  
  
다양한 런타임에서 사용 가능합니다:  
  
```bash  
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는 한국어 “우표”에서 따온 이름입니다. 우표로 편지를 보내듯 이메일을 보낸다는 의미로 지었습니다.

## Comments



### Comment 42445

- Author: davidshim
- Created: 2025-08-13T06:36:58+09:00
- Points: 1

2~3번은 api를 바꾼 경험이 있어서 공감이 가는 프로젝트입니다. 사이트도, 문서도 깔끔하게 잘 만드신 것 같아요. 서비스를 운영하다 보면 가끔 특정 메일 서비스가 중단돼서 다른 메일 서비스를 failover로  구축해야할 때가 있는데, transport를 pool 개념으로 운용하는 코드도 있으면 좋을 것 같습니다. resend.com 도 지원되면 좋을 것 같아요. 나중에 적용할 때까지 안돼있다면 직접 기여도 해보겠습니다~!

### Comment 42468

- Author: hongminhee
- Created: 2025-08-13T13:35:10+09:00
- Points: 1
- Parent comment: 42445
- Depth: 1

피드백 감사합니다! `PoolTransport`랑 `ResendTransport`는 조만간 추가해 보도록 하겠습니다!

### Comment 41447

- Author: nemorize
- Created: 2025-07-15T22:51:32+09:00
- Points: 1

심볼의 “郵票”를 “우표”로 바꾸는건 어떨까요?  
지금도 정말 찰떡으로 이뻐서 조금 조심스럽긴 하네요..

### Comment 41431

- Author: zinisuni
- Created: 2025-07-15T15:10:44+09:00
- Points: 1

오~ 좋네요~ 굿굿

### Comment 41410

- Author: cgl00
- Created: 2025-07-15T10:33:33+09:00
- Points: 1

1인 프로젝트인가요?? 대단하시네요..

### Comment 41419

- Author: hongminhee
- Created: 2025-07-15T11:10:56+09:00
- Points: 1
- Parent comment: 41410
- Depth: 1

네, 아직까지는 혼자 만들었습니다. 😅
