31 ポイント 投稿者 hongminhee 2025-07-14 | 6件のコメント | WhatsAppで共有

こんにちは。個人的にメール送信ライブラリを作ったので共有してみます。

なぜ作ることになったのか

最近、複数のプロジェクトを進める中で Node.js、Deno、Bun などさまざまなランタイムを使うようになりましたが、メール送信の部分では毎回別のライブラリを探したり、設定をやり直したりしなければならない不便さがありました。特に Deno や Bun では、Node.js 向けのメールライブラリが正しく動作しないことが多かったです。

そこで、「一度書けばどこでも動く」メールライブラリがあるといいと思い、Upyo を作ることになりました。

主な特徴

クロスランタイム互換性

Node.js、Deno、Bun、そしてエッジ関数で同じコードのまま動作します。ランタイムごとに異なる設定やコード変更は必要ありません。

ゼロ依存

個人的に多くの依存関係が付いてくるのを好まないため、ゼロ依存で作りました。たとえば 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 は韓国語の「切手」に由来する名前です。切手で手紙を送るように、メールを送るという意味を込めて名付けました。

6件のコメント

 
davidshim 2025-08-13

2〜3回ほどAPIを変更した経験があるので、共感できるプロジェクトです。サイトもドキュメントも、きれいによく作られていると思います。サービスを運用していると、たまに特定のメールサービスが停止して、別のメールサービスをフェイルオーバーとして構築しなければならないことがありますが、transportをプールの概念で運用するコードもあると良さそうです。resend.com にも対応してくれるとうれしいです。後で導入する時までに未対応なら、直接貢献もしてみます〜!

 
hongminhee 2025-08-13

フィードバックありがとうございます! PoolTransportResendTransport は近いうちに追加してみようと思います!

 
nemorize 2025-07-15

シンボルの「郵票」を「ウピョ」に変えるのはどうでしょうか?
今でも本当にぴったりで美しいので、少し慎重になってしまいますが…。

 
zinisuni 2025-07-15

お〜、いいですね〜。グッドグッド

 
cgl00 2025-07-15

お一人で進めているプロジェクトなんですか?? すごいですね..

 
hongminhee 2025-07-15

はい、今のところはまだ一人で作っています。😅