こんにちは。個人的にメール送信ライブラリを作ったので共有してみます。
なぜ作ることになったのか
最近、複数のプロジェクトを進める中で 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件のコメント
2〜3回ほどAPIを変更した経験があるので、共感できるプロジェクトです。サイトもドキュメントも、きれいによく作られていると思います。サービスを運用していると、たまに特定のメールサービスが停止して、別のメールサービスをフェイルオーバーとして構築しなければならないことがありますが、transportをプールの概念で運用するコードもあると良さそうです。
resend.comにも対応してくれるとうれしいです。後で導入する時までに未対応なら、直接貢献もしてみます〜!フィードバックありがとうございます!
PoolTransportとResendTransportは近いうちに追加してみようと思います!シンボルの「郵票」を「ウピョ」に変えるのはどうでしょうか?
今でも本当にぴったりで美しいので、少し慎重になってしまいますが…。
お〜、いいですね〜。グッドグッド
お一人で進めているプロジェクトなんですか?? すごいですね..
はい、今のところはまだ一人で作っています。😅