31 पॉइंट द्वारा hongminhee 2025-07-14 | 6 टिप्पणियां | WhatsApp पर शेयर करें

नमस्ते। मैंने व्यक्तिगत रूप से एक ईमेल भेजने की लाइब्रेरी बनाई है और उसे साझा कर रहा हूँ。

इसे बनाने की ज़रूरत क्यों पड़ी?

हाल ही में कई प्रोजेक्ट्स पर काम करते हुए मुझे Node.js, Deno, Bun जैसे अलग-अलग रनटाइम इस्तेमाल करने पड़े, लेकिन ईमेल भेजने वाले हिस्से में हर बार अलग लाइब्रेरी ढूँढनी पड़ती थी या सेटिंग्स फिर से करनी पड़ती थीं, जो असुविधाजनक था। खासकर Deno या Bun में, Node.js के लिए बनी ईमेल लाइब्रेरियाँ अक्सर ठीक से काम नहीं करती थीं।

इसीलिए मैंने सोचा कि अगर ऐसी ईमेल लाइब्रेरी हो जो “एक बार लिखो, हर जगह चलाओ”, तो अच्छा होगा, और इसी सोच से Upyo बनाया।

प्रमुख विशेषताएँ

क्रॉस-रनटाइम संगतता

यह Node.js, Deno, Bun और edge functions में एक ही कोड के साथ काम करता है। रनटाइम के हिसाब से अलग सेटिंग या कोड बदलाव की ज़रूरत नहीं होती।

ज़ीरो डिपेंडेंसी

मुझे व्यक्तिगत रूप से बहुत सारी dependencies साथ में खिंचकर आना पसंद नहीं है, इसलिए इसे zero dependency के साथ बनाया गया है। उदाहरण के लिए, SMTP transport भी 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 जैसी कई ईमेल सेवाओं को सपोर्ट करता है, और प्रोवाइडर बदलने पर भी application code वैसा ही रहता है। आपको सिर्फ Transport बदलना होता है। (अगले वर्ज़न में Amazon SES सपोर्ट भी आएगा।)

टेस्ट-फ्रेंडली

यह MockTransport देता है, जिससे असली ईमेल भेजे बिना भी ईमेल लॉजिक को टेस्ट किया जा सकता है। इससे डेवलपमेंट के दौरान गलती से असली ईमेल भेजे जाने की चिंता नहीं रहती।

अभी जिन हिस्सों में कमी है

  • SMTP transport में STARTTLS सपोर्ट अभी लागू नहीं किया गया है
  • edge functions में SMTP अभी सपोर्टेड नहीं है (सिर्फ HTTP API आधारित transport ही संभव है)
  • यह अभी शुरुआती विकास चरण में है, इसलिए 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  

transport पैकेज @upyo/smtp के अलावा @upyo/mailgun, @upyo/sendgrid, @upyo/ses, @upyo/mock भी हैं, और आगे और भी जोड़े जाने वाले हैं।

दस्तावेज़: https://upyo.org
कोड: https://github.com/dahlia/upyo

समापन

यह प्रोजेक्ट भले ही मेरी व्यक्तिगत ज़रूरत से शुरू हुआ हो, लेकिन मुझे लगा कि समान समस्या से जूझ रहे लोगों के लिए यह मददगार हो सकता है, इसलिए इसे साझा कर रहा हूँ। अभी यह वर्ज़न 0.1.0 पर है, लेकिन मैं इसे लगातार बेहतर बनाता रहूँगा।

फ़ीडबैक या योगदान का हमेशा स्वागत है!


Upyo का नाम कोरियाई शब्द “upyo” से लिया गया है। जैसे डाक टिकट से चिट्ठी भेजी जाती है, वैसे ही ईमेल भेजने के अर्थ में यह नाम रखा गया है।

6 टिप्पणियां

 
davidshim 2025-08-13

मैंने 2~3 बार API बदलने का अनुभव किया है, इसलिए यह प्रोजेक्ट बहुत relatable लगा। लगता है आपने साइट और docs दोनों बहुत साफ़-सुथरे तरीके से बनाए हैं। सर्विस चलाते समय कभी-कभी कोई खास mail service बंद हो जाती है, इसलिए failover के लिए दूसरी mail service बनानी पड़ती है; ऐसे में अगर transport को pool की अवधारणा के साथ चलाने वाला code भी हो, तो अच्छा लगेगा। resend.com का support भी मिले तो बढ़िया होगा। बाद में जब मैं इसे लागू करूँगा तब तक अगर यह उपलब्ध नहीं हुआ, तो मैं खुद भी contribute करके देखूँगा~!

 
hongminhee 2025-08-13

फ़ीडबैक के लिए धन्यवाद! PoolTransport और ResendTransport भी हम जल्द ही जोड़ने की कोशिश करेंगे!

 
nemorize 2025-07-15

क्या symbol के “郵票” को “u-pyo” में बदलना कैसा रहेगा?
अभी भी यह वाकई एकदम परफेक्ट और सुंदर लग रहा है, इसलिए यह सुझाव थोड़ा सावधानी से दे रहा/रही हूँ..

 
zinisuni 2025-07-15

ओ~ अच्छा है~ बहुत बढ़िया

 
cgl00 2025-07-15

क्या यह एक solo project है?? कमाल है..

 
hongminhee 2025-07-15

हाँ, अभी तक इसे मैंने अकेले ही बनाया है. 😅