Node.js की मानक लाइब्रेरी में कोई बिल्ट-इन SMTP क्लाइंट नहीं है। Nodemailer यह कमी पूरी करता है: यह बाहर जाने वाले मेल के लिए TLS नेगोशिएशन, कनेक्शन पूलिंग, MIME एन्कोडिंग और फ़ाइल अटैचमेंट संभालता है।
Nodemailer को कैसे इंस्टॉल और कॉन्फ़िगर करें?
इसे npm से इंस्टॉल करें:
npm install nodemailer
ट्रांसपोर्ट में आपके SMTP कनेक्शन का विवरण रहता है। आप इसमें होस्ट और पोर्ट देते हैं, फिर क्रेडेंशियल auth के अंतर्गत पास करते हैं:
import nodemailer from "nodemailer";
const transporter = nodemailer.createTransport({
host: "smtp.example.com",
port: 587,
secure: false, // true for port 465, false for 587 (STARTTLS)
auth: {
user: process.env.SMTP_USER,
pass: process.env.SMTP_PASS,
},
});
secure: false के साथ पोर्ट 587, STARTTLS का उपयोग करता है, जो हैंडशेक के बाद कनेक्शन को TLS में अपग्रेड करता है। पोर्ट 465 के लिए secure: true चाहिए। यूज़रनेम और पासवर्ड को सोर्स कोड में नहीं, बल्कि एनवायरनमेंट वेरिएबल में रखें।
संदेश कैसे भेजें?
एनवेलप और कंटेंट के साथ sendMail को कॉल करें। यह एक प्रॉमिस लौटाता है, इसलिए इसे try/catch के साथ async/await में रखें, ताकि भेजना विफल होने पर प्रोसेस क्रैश न हो:
async function main() {
try {
const info = await transporter.sendMail({
from: '"Your App" <you@yourdomain.com>',
to: "recipient@example.org",
subject: "Your receipt",
text: "Thanks for your order. This is the plain-text version.",
html: "<p>Thanks for your order.</p>",
});
console.log("Sent:", info.messageId);
} catch (err) {
console.error("Send failed:", err);
}
}
main();
हमेशा text और html दोनों भेजें। कुछ क्लाइंट प्लेन-टेक्स्ट भाग दिखाते हैं, और बिना टेक्स्ट विकल्प वाले संदेश को स्पैम फ़िल्टर आमतौर पर ख़राब स्कोर देते हैं।
अटैचमेंट कैसे जोड़ें?
एक attachments ऐरे पास करें। हर एंट्री किसी पाथ, बफ़र या स्ट्रीम से डेटा पढ़ सकती है:
await transporter.sendMail({
from: "you@yourdomain.com",
to: "recipient@example.org",
subject: "Your invoice",
text: "Invoice attached.",
attachments: [
{
filename: "invoice.pdf",
path: "./invoices/invoice-1042.pdf",
},
{
filename: "note.txt",
content: "Generated at runtime, no file needed.",
},
],
});
असली मेल भेजे बिना टेस्ट कैसे करें?
Nodemailer के साथ Ethereal आता है, जो एक नकली SMTP सेवा है। यह संदेशों को डिलीवर करने के बजाय अपने पास रख लेती है। हर बार भेजने पर आपको एक प्रीव्यू URL मिलता है, जो लोकल डेवलपमेंट के लिए आदर्श है:
const testAccount = await nodemailer.createTestAccount();
const transporter = nodemailer.createTransport({
host: "smtp.ethereal.email",
port: 587,
secure: false,
auth: {
user: testAccount.user,
pass: testAccount.pass,
},
});
const info = await transporter.sendMail({
from: "you@yourdomain.com",
to: "test@example.org",
subject: "Preview only",
text: "This never leaves Ethereal.",
});
console.log("Preview:", nodemailer.getTestMessageUrl(info));
Ethereal से आप देख सकते हैं कि आपने क्या बनाया है। इससे यह पता नहीं चलता कि कोई असली इनबॉक्स उस संदेश को स्वीकार करेगा या नहीं।
Bird से भेजें
SMTP काम करता है, लेकिन इसे प्रोडक्शन में चलाने के लिए आपको खुद मेल सर्वर चलाना (या किराए पर लेना), IP को वॉर्म करना और प्रतिष्ठा पर नज़र रखनी पड़ती है। HTTP API यह काम अपने ऊपर ले लेता है। खुला रखने के लिए कोई SMTP सॉकेट नहीं होता, और डिलीवरेबिलिटी का इन्फ्रास्ट्रक्चर प्रदाता संभालता है। Bird ईमेल API के साथ वही भेजना एक ही कॉल में हो जाता है:
import { BirdClient } from "@messagebird/sdk";
const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });
const { data, error } = await bird.email
.send({
from: "onboarding@messagebird.dev",
to: ["delivered@messagebird.dev"],
subject: "Hello from Node",
html: "<p>It works.</p>",
})
.safe();
onboarding@messagebird.dev प्रेषक और delivered@messagebird.dev सैंडबॉक्स पता असली प्राप्तकर्ता पर भेजने से पहले वायरिंग की पुष्टि करते हैं। सर्वरलेस रनटाइम, जैसे Vercel फ़ंक्शन और अन्य JavaScript सर्वर वातावरण, जब SMTP कनेक्शन खुले नहीं रख पाते, तब इसी HTTPS तरीके का उपयोग करते हैं।
अक्सर पूछे जाने वाले प्रश्न
क्या Nodemailer ब्राउज़र में काम करता है?
नहीं। Nodemailer एक सर्वर-साइड लाइब्रेरी है और Node के नेटवर्किंग मॉड्यूल पर निर्भर करती है। ब्राउज़र SMTP कनेक्शन नहीं खोल सकते, और क्लाइंट कोड में क्रेडेंशियल रखने से वे उजागर हो जाएँगे। इसके बजाय बैकएंड से भेजें।
टेक्स्ट और HTML दोनों क्यों भेजें?
मल्टीपार्ट संदेश से हर क्लाइंट वह हिस्सा चुन सकता है जिसे वह दिखा सकता है, और प्लेन-टेक्स्ट विकल्प से स्पैम फ़िल्टर संदेश को बेहतर ढंग से पढ़ पाते हैं। text छोड़ देना ईमेल के स्पैम में जाने का एक आम कारण है।
क्या मुझे SMTP इस्तेमाल करना चाहिए या HTTP API?
कम वॉल्यूम और आंतरिक टूल के लिए SMTP ठीक है। बड़े पैमाने पर प्रोडक्शन में भेजने के लिए HTTP API उस सर्वर की ज़रूरत हटा देता है जिसे आपको अन्यथा खुद चलाना पड़ता, और डिलीवरेबिलिटी का प्रबंधन भी साथ में संभालता है। कई टीमें डेवलपमेंट में Nodemailer और प्रोडक्शन में API इस्तेमाल करती हैं।
Node से SMTP के ज़रिए संवाद करने के लिए Nodemailer एक भरोसेमंद विकल्प है। अगर आप उसके पीछे का मेल सर्वर खुद नहीं चलाना चाहते, तो API विकल्प को शुरू से अंत तक देखने के लिए ईमेल भेजने की गाइड पढ़ें।