सालों से, क्विंसी लार्सन ने फ्रीकोडकैंप के मेल फॉर गुड प्लेटफॉर्म के माध्यम से एक साप्ताहिक ईमेल न्यूजलेटर भेजा, जो अमेज़ॅन एसईएस द्वारा संचालित है।
उन्होंने हाल ही में इस प्रक्रिया को SendGrid में माइग्रेट किया है। इस लेख में, मैं आपको दिखाऊंगा कि मैंने इसे पूरा करने के लिए एक टूल कैसे बनाया।
सेंडग्रिड खाता कैसे सेट करें
पहला कदम SendGrid के लिए पंजीकरण करना और अपना खाता सेट करना है। इस ट्यूटोरियल के प्रयोजनों के लिए, फ्री टियर पर्याप्त होना चाहिए।
जैसे-जैसे आप अपने आवेदन का विस्तार करते हैं, आपको प्लेटफ़ॉर्म के माध्यम से अपनी उपलब्ध ईमेल सीमाएँ बढ़ानी पड़ सकती हैं।
SendGrid पर एक समर्पित IP पता कैसे सेट करें
डिफ़ॉल्ट रूप से, SendGrid ईमेल भेजने के लिए साझा किए गए IP पतों का उपयोग करता है। यह छोटे पैमाने के ईमेल अनुप्रयोगों के लिए स्वीकार्य हो सकता है, लेकिन जैसे ही आप अपनी प्रेषण दरों में वृद्धि करते हैं, आपको एक समर्पित आईपी पता सेट करने की आवश्यकता होगी।
यह एक अच्छा विचार है, क्योंकि आपकी "प्रेषक प्रतिष्ठा" (मैट्रिक सेंडग्रिड ईमेल सेवा प्रदाताओं के साथ आपकी स्थिति का आकलन करने के लिए उपयोग करती है) समान आईपी साझा करने वाले अन्य उपयोगकर्ताओं के कार्यों से नकारात्मक रूप से प्रभावित नहीं होगी।
अपना खुद का समर्पित आईपी सेट करने के लिए, साइड नेविगेशन मेनू से "सेटिंग" विकल्प चुनें, फिर "आईपी एड्रेस" चुनें। हालांकि, एक त्वरित नोट:यह विकल्प फ्री टियर पर उपलब्ध नहीं है।
आपकी सशुल्क योजना के आधार पर, आपके पास पहले से ही एक समर्पित IP पता सेट अप हो सकता है। यदि आपके पास एक नहीं है, या यदि आप अधिक जोड़ना चुनते हैं, तो आप एक नया आईपी कॉन्फ़िगर करने के लिए "एक आईपी पता जोड़ें" बटन का चयन कर सकते हैं।
सेंडग्रिड में ईमेल भेजने वाले को कैसे अधिकृत करें
नोट:यदि आप अपने ईमेल के लिए कस्टम डोमेन का उपयोग कर रहे हैं तो आप इस अनुभाग को छोड़ सकते हैं।
अपने व्यक्तिगत ईमेल पते से ईमेल भेजने के लिए, आपको यह सत्यापित करना होगा कि ईमेल पता आपका है।
बाएं मेनू में, "सेटिंग" चुनें, फिर "प्रेषक प्रमाणीकरण" चुनें। अपना एक ईमेल पता जोड़ने के प्रवाह के माध्यम से चलने के लिए "एकल प्रेषक सत्यापित करें" चुनें।
सेंडग्रिड में अपने कस्टम डोमेन को कैसे प्रमाणित करें
नोट:यदि आप अपने ईमेल के लिए कस्टम डोमेन का उपयोग नहीं कर रहे हैं तो आप इस अनुभाग को छोड़ सकते हैं।
अपने कस्टम मेल डोमेन से ईमेल भेजने के लिए, आपको उस डोमेन को SendGrid के साथ प्रमाणित करना होगा। इस स्क्रीन पर जाने के लिए, सेटिंग्स मेनू को फिर से चुनें, फिर "प्रेषक प्रमाणीकरण" चुनें।
फिर आपको "डोमेन प्रमाणीकरण" के विकल्प के साथ एक स्क्रीन देखनी चाहिए। "अपने डोमेन को प्रमाणित करें" विकल्प का चयन करें और SendGrid आपके DNS रिकॉर्ड्स को कॉन्फ़िगर करने की प्रक्रिया के माध्यम से आपका मार्गदर्शन करेगा (आपके DNS प्रदाता के आधार पर विशिष्ट निर्देशों के साथ)।
सेंडग्रिड में रिवर्स डीएनएस कैसे सेट करें
नोट:यदि आप अपने ईमेल के लिए कस्टम डोमेन का उपयोग नहीं कर रहे हैं तो आप इस अनुभाग को छोड़ सकते हैं।
किसी दिए गए आईपी पते के मालिक को देखने के लिए ईमेल प्रदाताओं द्वारा रिवर्स डीएनएस (डोमेन नाम सिस्टम) का उपयोग किया जाता है। इसे सेट करने से ईमेल प्रदाता यह सत्यापित कर सकेंगे कि जिस IP पते से आप ईमेल भेजते हैं वह आपके कस्टम डोमेन से जुड़ा है।
ऊपर के समान प्रेषक प्रमाणीकरण स्क्रीन में, आपको एक "रिवर्स डीएनएस" अनुभाग दिखाई देगा। आपके खाते में मौजूद प्रत्येक समर्पित आईपी के लिए रिवर्स डीएनएस को कॉन्फ़िगर करने का एक विकल्प होगा - जैसे डोमेन प्रमाणीकरण, सेंडग्रिड का प्लेटफॉर्म आपको इसे स्थापित करने में मदद करेगा।
SendGrid में ईमेल प्रमाणीकरण कैसे सेट करें
नोट:यदि आप अपने ईमेल के लिए कस्टम डोमेन का उपयोग नहीं कर रहे हैं तो आप इस अनुभाग को छोड़ सकते हैं।
प्रमुख ईमेल प्रदाता (जैसे जीमेल, याहू और आउटलुक) ईमेल भेजने वाले को प्रमाणित करने के लिए कई तरीकों का इस्तेमाल करते हैं:एसपीएफ़, डीकेआईएम, और डीएमएआरसी।
- एसपीएफ़ (प्रेषक नीति ढांचा) पुष्टि करता है कि आपके डोमेन से मेल भेजने वाला आईपी पता ऐसा करने के लिए अधिकृत है।
- डीकेआईएम (DomainKeys Identified Mail) एक ईमेल को प्रमाणित करने के लिए सार्वजनिक कुंजी स्ट्रिंग का उपयोग करता है
from
पता सटीक है और नकली/झूठा नहीं है। - डीएमएआरसी (डोमेन-आधारित संदेश प्रमाणीकरण, रिपोर्टिंग और अनुरूपता) निर्देशों का एक सेट है जो ईमेल प्रदाताओं को बताता है कि जब कोई ईमेल SPF या DKIM सत्यापन विफल हो जाता है तो कैसे प्रतिक्रिया दें।
सेंडग्रिड का प्रमाणीकरण प्रवाह आपको डोमेन प्रमाणीकरण प्रक्रिया के हिस्से के रूप में एसपीएफ़ और डीकेआईएम स्थापित करने में मदद करेगा, लेकिन आपको अपने डीएमएआरसी को मैन्युअल रूप से कॉन्फ़िगर करने की आवश्यकता होगी।
अपने DNS होस्टिंग प्रदाता पर जाएँ और DNS प्रबंधन सेटिंग्स तक पहुँचें। वहां से, एक नया TXT
जोड़ें _dmarc.yourdomain.com
. के नाम से रिकॉर्ड करें (yourdomain.com
. की जगह अपने कस्टम डोमेन के साथ)।
ध्यान दें कि कुछ प्रदाता, जैसे कि GoDaddy, स्वचालित रूप से आपके डोमेन को रिकॉर्ड में जोड़ देंगे - इस मामले में, नाम _dmarc
होना चाहिए .
मान इस रिकॉर्ड की एक समान संरचना होनी चाहिए:
"v=DMARC1; p=none; pct=100; rua=mailto:[email protected]"
v=DMARC
उपयोग करने के लिए DMARC नियमों के संस्करण को इंगित करता है (वर्तमान में केवल संस्करण 1 उपलब्ध है)।p=none
यह इंगित करता है कि ईमेल प्रदाता को DKIM या SPF के विफल होने पर ईमेल प्रदाता को क्या करना चाहिए। यह सेटिंगnone
. के रूप में प्रारंभ होनी चाहिए , आपके ईमेल की सुपुर्दगी को प्रभावित करने से बचने के लिए। एक बार जब आप पुष्टि कर लेते हैं कि आपका DKIM और SPF सही तरीके से कॉन्फ़िगर किया गया है, तो आप इस मान कोquarantine
में अपडेट कर सकते हैं प्रदाताओं को स्वचालित रूप से विफल ईमेल को स्पैम फ़ोल्डर में रूट करने के लिए, याreject
प्रदाताओं को विफल ईमेल को अस्वीकार/बाउंस करने के लिए।pct=100
विफल ईमेल का प्रतिशत इंगित करता है जिन पर कार्रवाई लागू की जानी चाहिए।rua=mailto:[email protected]
कुल रिपोर्ट भेजने के लिए ईमेल पता है। इन रिपोर्ट्स में आपके आईपी से प्राप्त सभी ईमेल की जानकारी होती है जो किसी दिए गए प्रदाता द्वारा प्राप्त की गई थी।[email protected]
को बदलें ईमेल पते के साथ आप वे रिपोर्ट प्राप्त करना चाहते हैं।
SendGrid में एक डायनामिक टेम्प्लेट कैसे बनाएं
आज हम जिस टूल का निर्माण कर रहे हैं, वह ईमेल के विषय और बॉडी टेक्स्ट को सेट करने के लिए SendGrid की डायनेमिक टेम्प्लेट सुविधा का उपयोग करता है। इसे सेट करने के लिए, साइड नेविगेशन मेनू में "ईमेल एपीआई" विकल्प चुनें, फिर "डायनेमिक टेम्प्लेट" चुनें।
आपको अपना पहला डायनेमिक टेम्प्लेट बनाने के लिए एक स्क्रीन दिखाई देगी। "एक डायनामिक टेम्प्लेट बनाएं" विकल्प चुनें।
अपने नए टेम्पलेट को एक नाम दें:"फ्रीकोडकैंप सेंडग्रिड ट्यूटोरियल"। SendGrid इस टेम्पलेट को उपलब्ध टेम्पलेट्स की सूची में जोड़ देगा। Template ID
. देखने के लिए टेम्पलेट का चयन करें (इसे नोट कर लें, क्योंकि हमें बाद में टूल के लिए इसकी आवश्यकता होगी) और "संस्करण जोड़ें" बटन पर क्लिक करें।
दिखाई देने वाली स्क्रीन पर "रिक्त टेम्पलेट" चुनें, फिर "कोड संपादक" चुनें। अब आपको संपादक दृश्य देखना चाहिए। SendGrid का संपादक ईमेल बॉडी बनाने के लिए HTML का उपयोग करता है - हालाँकि, जब हम अपना टूल बनाते हैं तो हम प्लेन टेक्स्ट संस्करण भेजेंगे।
अभी के लिए, संपादक की सामग्री को निम्न कोड से बदलें:
<p>This is a test email used with the freeCodeCamp SendGrid tutorial</p>
<p>Unsubscribe: {{{unsubscribeId}}}</p>
आप देखेंगे कि हमने {{{unsubscribeId}}}
जोड़ा है . SendGrid का टेम्प्लेट मूल्यों को गतिशील रूप से बदलने के लिए हैंडलबार का उपयोग करता है - जब हम टूल का निर्माण करेंगे तो हम इस सुविधा का लाभ उठाएंगे।
अब ऊपर बाईं ओर से सेटिंग विकल्प चुनें - आप वैकल्पिक रूप से अपने टेम्पलेट संस्करण को एक नाम दे सकते हैं, लेकिन "विषय" फ़ील्ड वह है जिसे हम संशोधित करना चाहते हैं। इस मान को {{{subject}}}
. पर सेट करें हमारे टूल से विषय मान को गतिशील रूप से लोड करने के लिए।
डायनेमिक टेम्प्लेट का परीक्षण करने के लिए, शीर्ष मेनू से "टेस्ट डेटा" विकल्प चुनें। इस JSON डेटा को वहां संपादक में डालें:
{
"unsubscribeId": "1",
"subject": "Testing emails!"
}
अब आपको स्क्रीन के दाईं ओर पूर्वावलोकन देखना चाहिए जो टेम्पलेट में इन मानों को दर्शाता है। Save
को हिट करना न भूलें अपने परिवर्तनों को सहेजने के लिए बटन!
सेंडग्रिड में API कुंजी कैसे जेनरेट करें
अपने SendGrid खाते को कॉन्फ़िगर करने का अंतिम चरण हमारे टूल के उपयोग के लिए API कुंजी जेनरेट करना है।
मुख्य SendGrid पृष्ठ पर वापस जाने के लिए ऊपर बाईं ओर स्थित पीछे के तीर पर क्लिक करें। फिर "सेटिंग" और "एपीआई कुंजी" चुनें। नई कुंजी बनाने के लिए "एपीआई कुंजी बनाएं" चुनें। आप वैकल्पिक रूप से अपनी कुंजी को "पूर्ण पहुंच" प्रदान कर सकते हैं, लेकिन इस ट्यूटोरियल के उद्देश्य के लिए आपको केवल "मेल भेजें" पहुंच की आवश्यकता होगी।
अपनी कुंजी को एक वर्णनात्मक नाम देना सुनिश्चित करें ताकि यदि आप इस स्क्रीन को फिर से एक्सेस करते हैं तो आपको इसका उद्देश्य याद रहेगा। एक बार जब आप अपनी अनुमतियां कॉन्फ़िगर कर लेते हैं, तो कुंजी उत्पन्न करने के लिए "बनाएं और देखें" चुनें - इसे कहीं सुरक्षित रखें क्योंकि आप इसे फिर से नहीं देख पाएंगे ।
ईमेल टूल कैसे बनाएं
अब वास्तव में कुछ ईमेल भेजने के लिए कोड लिखने का समय आ गया है। आप हमारे लाइव एप्लिकेशन के लिए कोड देख सकते हैं, लेकिन इस ट्यूटोरियल के प्रयोजनों के लिए हम मुख्य रूप से SendGrid API का उपयोग करने पर ध्यान केंद्रित करने के लिए थोड़ा कम संस्करण तैयार करेंगे।
कस्टम ईमेल अभियान स्क्रिप्ट के लिए आवश्यक सॉफ़्टवेयर
इस परियोजना के साथ काम करने के लिए आपको निम्नलिखित उपकरण स्थापित करने होंगे:
- Node.js - एलटीएस संस्करण की सिफारिश की जाती है
- एक IDE, जैसे VSCode या Atom
आप वैकल्पिक रूप से git
. भी चाह सकते हैं संस्करण नियंत्रण के लिए।
हमारा लाइव टूल MongoDB एटलस क्लस्टर का उपयोग करता है, लेकिन हमारा ट्यूटोरियल उदाहरण नहीं होगा। यदि आप MongoDB से परिचित नहीं हैं, तो freeCodeCamp के पाठ्यक्रम में MongoDB की स्थापना और उपयोग पर एक उत्कृष्ट अनुभाग शामिल है।
प्रोजेक्ट कैसे प्रारंभ करें
इस प्रोजेक्ट पर काम करने के लिए एक निर्देशिका (फ़ोल्डर) बनाएं। फिर उस फ़ोल्डर को अपने संपादक और पसंद के टर्मिनल के साथ खोलें।
आरंभ करने के लिए, हमें इसे एक नोड परियोजना के रूप में स्थापित करने की आवश्यकता होगी। ऐसा करने का सबसे तेज़ तरीका है npm init
अपने टर्मिनल में। यह आपको एक package.json
. बनाने में मदद करेगा जो एक नोड एप्लिकेशन की कोर फाइल है।
हमारे एप्लिकेशन के लिए डिफ़ॉल्ट मान ठीक काम करेंगे, लेकिन हम scripts
. को संशोधित करना चाहेंगे अनुभाग:
"scripts": {
"build": "tsc",
"send": "node ./prod/send.js"
},
npm init
एक test
बनाएगा स्क्रिप्ट - इसे हमारे प्रोजेक्ट के लिए हटाया जा सकता है।
build
स्क्रिप्ट का उपयोग हमारी टाइपस्क्रिप्ट को जावास्क्रिप्ट में संकलित करने के लिए किया जाएगा, और send
स्क्रिप्ट हमारे आवेदन को चलाएगी।
आगे हम टाइपस्क्रिप्ट को स्थापित और स्थापित करेंगे। यदि आप टाइपस्क्रिप्ट से परिचित नहीं हैं, तो यह अनिवार्य रूप से मजबूत प्रकार की परिभाषाओं और संकलन-समय त्रुटि जाँच के साथ जावास्क्रिप्ट का एक सुपरसेट है।
अपने प्रोजेक्ट पर टाइपस्क्रिप्ट स्थापित करने के लिए npm install --save-dev typescript
run चलाएँ अपने टर्मिनल में। (--save-dev
ध्वज इसे विकास निर्भरता के रूप में सहेजता है - रनटाइम पर टाइपस्क्रिप्ट की आवश्यकता नहीं होती है इसलिए इसे उत्पादन वातावरण में साफ किया जा सकता है)।
टाइपस्क्रिप्ट को अपने स्वयं के कॉन्फ़िगरेशन फ़ाइल की आवश्यकता होती है ताकि वह उन नियमों को सेट कर सके जिन्हें जावास्क्रिप्ट फ़ाइलों को उत्पन्न करते समय पालन करना चाहिए। अपने प्रोजेक्ट के रूट डायरेक्टरी में tsconfig.json
. नाम की एक फाइल बनाएं और निम्नलिखित डालें:
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"outDir": "./prod",
"rootDir": "./src"
}
}
excludes
दिखाई देगा संपत्ति। यह मान ट्यूटोरियल फ़ाइल संरचना के लिए विशिष्ट है और आपको इसकी आवश्यकता नहीं होगी।संक्षिप्तता के लिए, हम इन कॉन्फ़िगरेशन सेटिंग्स में नहीं जाएंगे। यदि आप अतिरिक्त जानकारी चाहते हैं, तो टाइपस्क्रिप्ट में बहुत गहन दस्तावेज हैं।
यदि आप git
. का उपयोग कर रहे हैं संस्करण नियंत्रण के लिए और इसे एक भंडार (जैसे गिटहब) में अपलोड करने के लिए, आप एक .gitignore
बनाना चाहेंगे अपने प्रोजेक्ट की रूट डायरेक्टरी में फाइल करें। इस फ़ाइल में शामिल होना चाहिए:
/node_modules/
.env
/prod/
/node_modules/
स्थापित पैकेजों को अनदेखा कर देगा। संस्करण नियंत्रण के साथ काम करते समय इसे सर्वोत्तम अभ्यास माना जाता है।.env
हमारी पर्यावरण चर फ़ाइल को अनदेखा कर देगा। यह बहुत महत्वपूर्ण है क्योंकि आप कभी नहीं अपने रहस्यों को एक भंडार के लिए प्रतिबद्ध करना चाहते हैं।/prod/
हमारी संकलित जावास्क्रिप्ट फाइलों को अनदेखा कर देगा। हम इस फ़ोल्डर का उपयोग अपनी ईमेल सूचियों के लिए भी करेंगे, इसलिए गलती से उस निजी पहचान योग्य जानकारी को करने से बचना महत्वपूर्ण है।
एक .env
बनाएं अपने रूट प्रोजेक्ट डायरेक्टरी में फाइल करें। हम इस फ़ाइल के माध्यम से निम्नलिखित पर्यावरण चर लोड करेंगे:
SENDGRID_API_KEY=
SENDGRID_FROM=
SENDGRID_TEMPLATE_ID=
MAIL_SUBJECT=
<अंजीर> जब आप मान भरते हैं, तो उन्हें दोहरे उद्धरण चिह्नों में लपेटना याद रखें। साथ ही, =
. के आसपास कोई स्थान नहीं है साइन इन करें! SENDGRID_API_KEY
आपके द्वारा पिछले चरणों में जेनरेट की गई API कुंजी होनी चाहिए.SENDGRID_FROM
आपका ईमेल पता होना चाहिए (यहfrom
. के लिए उपयोग किया गया पता है फ़ील्ड)।SENDGRID_TEMPLATE_ID
id
होना चाहिए आपके द्वारा पहले बनाए गए गतिशील टेम्पलेट के लिए स्ट्रिंग।MAIL_SUBJECT
आपके द्वारा भेजे जाने वाले ईमेल की विषय पंक्ति होगी। अभी के लिए, इसे "fCC ट्यूटोरियल ईमेल" के रूप में सेट करें।
अंत में, एक src
बनाएं अपनी रूट प्रोजेक्ट निर्देशिका में फ़ोल्डर, और एक send.ts
. बनाएं उस फ़ोल्डर में फ़ाइल करें।
अपनी निर्भरता कैसे स्थापित करें
सबसे पहले हमें sendgrid
. इंस्टॉल करना होगा Node.js पैकेज। यह पैकेज SendGrid API के लिए एक आवरण के रूप में कार्य करता है और ईमेल भेजने के लिए API कॉल करने की हमारी प्रक्रिया को सुव्यवस्थित करेगा। npm install @sendgrid/mail
चलाएं इस पैकेज को स्थापित करने के लिए।
फिर हमें कुछ विकास निर्भरताओं की आवश्यकता है। npm install --save-dev dotenv @types/node
चलाएं ।
dotenv
हमें.env
. से पर्यावरण चर लोड करने की अनुमति देगा स्थानीय रूप से फ़ाइल करें।@types/node
Node.js के लिए टाइप परिभाषाएं प्रदान करता है - टाइपस्क्रिप्ट अंतर्निहित विधियों और कार्यों की संरचना को समझने के लिए इन परिभाषाओं पर निर्भर करता है।
तर्क कैसे लिखें
अब हम अपने /src/send.ts
. में काम करेंगे फ़ाइल - यह वह जगह है जहाँ हम अपने ऐप लॉजिक का बड़ा हिस्सा बना रहे हैं। हम अपने पैकेज से आवश्यक मान आयात करके शुरू करेंगे।
सबसे पहले हम dotenv
लोड करना चाहते हैं हमारे पर्यावरण चर को पैकेज और पार्स करें।
import dotenv from "dotenv";
dotenv.config();
dotenv
केवल स्थानीय विकास के लिए आवश्यक है - अधिकांश ऑनलाइन होस्ट जैसे Heroku और Repl.it पर्यावरण चर को मूल रूप से संभाल सकते हैं
dotenv.config()
कॉल हमारे .env
को पढ़ता है फ़ाइल और मानों को process.env
. में लोड करता है नोड वस्तु।
आगे हम SendGrid पैकेज से आवश्यक मॉड्यूल आयात करते हैं:
import sgMail, { MailDataRequired } from "@sendgrid/mail";
sgMail
प्राथमिक एपीआई आवरण है, और MailDataRequired
एक प्रकार की परिभाषा है जिसकी हमें आवश्यकता होगी।
अंत में, हम अपनी फाइलों को संभालने के लिए कुछ अंतर्निहित नोड सुविधाओं को आयात करते हैं:
import path from "path";
import { createWriteStream, readFile } from "fs";
path
संबंधित पथों के साथ हमारी ईमेल सूची फ़ाइलों का पता लगाने के लिए उपयोग किया जाएगाfs
उन फ़ाइलों को पढ़ने और लिखने के लिए उपयोग किया जाएगा
तर्क का निर्माण शुरू करने का समय! हमारा एप्लिकेशन .env
. में सेट किए जाने वाले कुछ आवश्यक मानों पर निर्भर करता है फ़ाइल, इसलिए हमें यह सत्यापित करके शुरू करने की आवश्यकता है कि वे चर सही तरीके से सेट हैं। यदि कोई गुम है, तो हम चाहते हैं कि ईमेल भेजते समय त्रुटियों को फेंकने से बचने के लिए हमारा आवेदन जल्दी से बाहर निकल जाए।
// Here we check for a valid API key
const apiKey = process.env.SENDGRID_API_KEY;
if (!apiKey) {
console.error("Missing SendGrid Key");
process.exit(1);
}
// Here we check for a valid from address
const fromAddress = process.env.SENDGRID_FROM;
if (!fromAddress) {
console.error("Missing sender email address!");
process.exit(1);
}
// Here we check for a dynamic template ID
const sgTemplate = process.env.SENDGRID_TEMPLATE_ID;
if (!sgTemplate) {
console.error("Missing SendGrid Template ID");
process.exit(1);
}
// Here we check for the mail subject, but if it is missing
// we do not need to exit. Instead we use a fallback value.
const subjectValue = process.env.MAIL_SUBJECT || "Fallback value - check your env!";
<अंजीर>||
सिंटैक्स कोड को बताता है कि यदि process.env.MAIL_SUBJECT
अपरिभाषित या गलत है, इसके बजाय स्ट्रिंग का उपयोग करें।
process.exit(1)
कॉल जो आप प्रत्येक स्थिति में देखते हैं चेक नोड को 1
के एक्जिट कोड के साथ प्रक्रिया (हमारे आवेदन) को समाप्त करने के लिए कहता है . यह इंगित करता है कि इनमें से किसी एक जांच के विफल होने के कारण हमारा एप्लिकेशन क्रैश हो गया।
SendGrid के लिए हमें API कुंजी सेट करने की आवश्यकता है। अपने पर्यावरण चर तर्क के नीचे, कुंजी सेट करने के लिए फ़ंक्शन कॉल जोड़ें।
// Here we set the SendGrid API key
sgMail.setApiKey(apiKey);
आगे बढ़ने से पहले, आगे बढ़ें और npm run build
चलाएं आपके टर्मिनल में - यह एक prod
बनाएगा हमारे संकलित जावास्क्रिप्ट युक्त फ़ोल्डर। अब आपको निम्न फ़ाइल संरचना देखनी चाहिए:
इस समय, यदि आप git
का उपयोग कर रहे हैं आप बहुत आश्वस्त होना चाहते हैं कि prod
फ़ोल्डर आपके भंडार के लिए प्रतिबद्ध नहीं होगा।
prod
के भीतर फ़ोल्डर, एक validEmails.csv
बनाएं फ़ाइल। ईमेल सूची को पढ़ने के लिए हमारा ऐप इस फ़ाइल का उपयोग करेगा। फ़ाइल को निम्न सामग्री के साथ प्रारंभ करें ([email protected]
. बदलें) अपने वास्तविक ईमेल पते के साथ):
email,unsubscribeId
[email protected],1
[email protected],2
.csv
फ़ाइलों में अल्पविराम के आसपास स्थान नहीं होते हैं।
अब हम इसे ईमेल सूची में पार्स करने के लिए कोड लिख सकते हैं! आपके src/send.ts
. में फ़ाइल, यह कोड जोड़ें:
// Here we concatenate our file path for the valid email file
const filePath = path.join(__dirname + "/../validEmails.csv");
// This is where we start reading the file!
readFile(filePath, "utf8", (err, data) => {
if (err) {
console.error(err);
return;
}
console.log(data)
});
function
. का उपयोग करने के लिए आपका स्वागत है इसके बजाय घोषणाएं, यदि आप चाहें तो।
अब अगर आप npm run build
run चलाते हैं और npm run send
आपको हमारे validEmail.csv
. की सामग्री देखनी चाहिए टर्मिनल में फ़ाइल। यदि आप चाहें, तो आप इस बिंदु तक हमारी वर्तमान प्रगति देख सकते हैं।
महान! अब हमें उस स्ट्रिंग को वस्तुओं की एक सरणी में पार्स करने की आवश्यकता है ताकि हम इसके माध्यम से पुनरावृति कर सकें और अपने ईमेल संदेशों का निर्माण कर सकें। हमारे कॉलबैक फ़ंक्शन को अपडेट करें:
// This is where we start reading the file!
readFile(filePath, "utf8", (err, data) => {
if (err) {
console.error(err);
return;
}
// Here we parse the data into an object array
const emailList = data
.split("\n")
.slice(1)
.map((el) => {
const [email, unsubscribeId] = el.split(",");
return { email, unsubscribeId };
});
});
[email, unsubscribeId]
उन दो चरों को विभाजित सरणी के मान निर्दिष्ट करने के लिए विनाशकारी लागू होता है।.split("\n")
लाइन ब्रेक द्वारा स्ट्रिंग को विभाजित करता है। नोट :यदि आप विंडोज़ पर हैं, तो आपको अपनेvalidEmails.csv
के लिए एंड-ऑफ़-लाइन सेटिंग बदलने की आवश्यकता हो सकती हैCRLF
. से करने के लिएLF
(Windows अतिरिक्त लाइनब्रेक वर्ण सम्मिलित करता है जो हमारे डेटा प्रबंधन को प्रभावित करेगा).slice(1)
उस सरणी के पहले तत्व को हटा देता है (हमाराemail,unsubscribeId
लाइन)।- हमारा
map
फ़ंक्शन प्रत्येकemail,unsubscribeId
को रूपांतरित करेगा एक{email, unsubscribeId}
. में स्ट्रिंग करें वस्तु।
इस पार्सिंग फ़ंक्शन का अंतिम परिणाम email
. के साथ ऑब्जेक्ट्स की एक सरणी होगी और unsubscribeId
गुण - एक स्ट्रिंग की तुलना में काम करने में बहुत आसान।
अब कुछ ईमेल भेजने का समय आ गया है। आपके पार्सिंग फ़ंक्शन के नीचे (लेकिन अभी भी readFile
. के भीतर है कॉलबैक) हमारी पुनरावृत्ति विधि के लिए संरचना जोड़ें। क्योंकि हम ऐरे में प्रत्येक मान को एक्सेस करना चाहते हैं, हम .forEach
. का उपयोग करेंगे दृष्टिकोण।
// Here we iterate through the emailList array
emailList.forEach((user) => {});
user
पैरामीटर एक {email, unsubscribeId}
होगा वस्तु। हमने इसे user
. कहा है क्योंकि यह पूर्ण एप्लिकेशन में एक फ्रीकोडकैंप उपयोगकर्ताडेटा ऑब्जेक्ट का प्रतिनिधित्व करता है।
.forEach
. के लिए कॉलबैक में , हम संदेश वस्तु का निर्माण कर सकते हैं जिसे SendGrid API अपेक्षा करता है।
// Here we iterate through the emailList array
emailList.forEach((user) => {
// This is the message object SendGrid needs
const message: MailDataRequired = {
to: user.email,
from: fromAddress,
subject: subjectValue,
text: "This goes away!",
templateId: sgTemplate,
dynamicTemplateData: {
subject: subjectValue,
unsubscribeId: user.unsubscribeId
}
}
});
आगे बढ़ने से पहले, आइए इस संदेश वस्तु को और करीब से देखें। MailDataRequired
हमने पहले आयात किया था, यहाँ टाइप डेफिनिशन के रूप में उपयोग किया जाता है, इसलिए टाइपस्क्रिप्ट हमें सचेत कर सकता है यदि हम एक आवश्यक संपत्ति को याद करते हैं। शुक्र है, हमारे पास सभी आवश्यक गुण हैं। लेकिन उनका क्या मतलब है?
to:
संदेश भेजने के लिए ईमेल पता। यह होगाemail
हमारेvalidEmails.csv
. की प्रत्येक पंक्ति से फ़ाइलfrom:
से संदेश भेजने के लिए ईमेल पता। यह हमारे.env
. में सेट है पहले (यह आपका . होना चाहिए) ईमेल पता)।subject:
इस फ़ील्ड की आवश्यकता नहीं है, लेकिन यदि डायनामिक टेम्प्लेट हमारे विषय को सही ढंग से पार्स नहीं करता है, तो हमें फ़ॉलबैक मान देता है।text:
यह टेक्स्ट मान टेम्पलेट द्वारा अधिलेखित कर दिया गया है। हालाँकि, इसका उपयोग करना अभी भी महत्वपूर्ण है। SendGridplaintext
के रूप में ईमेल भेज सकता है याhtml
-text
. का उपयोग करकेhtml
. के बजाय संपत्ति संपत्ति, हम सुनिश्चित करते हैं कि हमारा टेम्पलेटplaintext
. के रूप में भेजा गया है . ईमेल प्रदाता अधिक संभावना हैं HTML संदेशों को स्पैम के रूप में फ़्लैग करने के लिए, इसलिए यह हमारी सुपुर्दगी दर को बढ़ाने में मदद करता है।templateId:
यह डायनामिक टेम्प्लेट के लिए आईडी है जिसे SendGrid को ईमेल में उपयोग करना चाहिए।dynamicTemplateData:
ये वे मान हैं जो हमारे हैंडलबार स्ट्रिंग्स के अनुरूप हैं जिन्हें हमने पहले डायनेमिक टेम्प्लेट में सेट किया था।
महान! हमारा अगला कदम इस निर्मित संदेश को लेना और भेजना है। संदेश वस्तु के नीचे (लेकिन अभी भी .forEach
. के भीतर कॉलबैक), आइए अपना भेजें कॉल जोड़ें:
// Here we send the message we just constructed!
sgMail.send(message);
यह हमारे validEmails.csv
. के प्रत्येक ईमेल पर संदेश भेजेगा . दुर्भाग्य से, हमारा कोड चुपचाप चलेगा और हमें पता नहीं चलेगा कि प्रत्येक प्रेषण सफल हुआ या नहीं। आइए कुछ त्रुटि प्रबंधन जोड़ें।
.send()
कॉल एक वादा लौटाता है, इसलिए हम .then().catch()
. का उपयोग कर सकते हैं वापसी को संभालने के लिए।
// Here we send the message we just constructed!
sgMail.send(message)
.then(() => {
// Here we log successful send requests
console.info(`Message send success: ${user.email}`)
}).catch((err) => {
// Here we log errored send requests
console.error(err);
console.error(`Message send failed: ${user.email}`)
});
अब अगर आप npm run build
run चलाते हैं और npm run send
आपको अपने इनबॉक्स में एक सुंदर ईमेल देखना चाहिए!
इस बिंदु पर, अब आपके पास एक कार्यात्मक ईमेल भेजने वाला एप्लिकेशन है। बधाई हो! आप चाहें तो इस बिंदु तक हमारी प्रगति देख सकते हैं।
यह देखने के लिए पढ़ें कि बाउंस किए गए ईमेल और भेजने में विफलताओं के लिए अतिरिक्त तर्क को कैसे संभालना है, जिसके बारे में हम आगे चर्चा करेंगे।
सेंडग्रिड में बाउंस ईमेल को कैसे हैंडल करें
आपने देखा होगा कि [email protected]
बहुत वास्तविक ईमेल पता नहीं है। SendGrid पिछले दिन आपकी गतिविधि के लिए प्रतिदिन बाउंस रिपोर्ट जेनरेट करेगा।
प्रत्येक बाउंस किया गया ईमेल आपकी SendGrid प्रतिष्ठा को ठेस पहुंचाता है और इससे ईमेल प्रदाता आपके मेल को स्पैम के रूप में चिह्नित कर सकते हैं। इसलिए, हमें ज्ञात बाउंसिंग पतों पर भेजने से रोकने के लिए तर्क जोड़ने की आवश्यकता है।
एक bouncedEmails.csv
बनाकर प्रारंभ करें अपने prod
. में फ़ाइल करें फ़ोल्डर (यह आपके validEmails.csv
. के बगल में होना चाहिए ) हमें unsubscribeId
की आवश्यकता नहीं है यहां मान हैं, इसलिए इसे इसके साथ प्रारंभ करें:
email
[email protected]
अब वापस हमारे send.ts
. पर फ़ाइल। लाइन 38 पर, हमारे मौजूदा filePath
. के ठीक नीचे घोषणा, नए के लिए पथ को कॉन्फ़िगर करें bouncedEmails.csv
फ़ाइल।
// Here we concatenate our file paths for the CSV files
const filePath = path.join(__dirname + "/validEmails.csv");
const bouncePath = path.join(__dirname + "/bouncedEmails.csv");
send.ts
फ़ाइल)।
महान! अब हमें उस फाइल को पढ़ने की जरूरत है। इन फ़ाइल पथ घोषणाओं के ठीक नीचे (हमारे मौजूदा readFile
. से पहले कॉल), बाउंस की गई फ़ाइलों को पढ़ने के लिए तर्क जोड़ें।
// Read through the bounce list, parse into array
readFile(bouncePath, "utf8", (err, data) => {
if (err) {
console.error(err);
process.exit(1);
}
bounceList = data.split("\n").slice(1);
readFile
अतुल्यकालिक है - इसलिए हमें कॉलबैक फ़ंक्शन को हमारे सभी मौजूदा प्रेषण तर्क के आसपास लपेटने की आवश्यकता है . सुनिश्चित करें कि आपका समापन })
. है इस कॉलबैक के लिए हमारी फ़ाइल के बिल्कुल अंत में ले जाया जाता है।
हमने bouncedEmails.csv
पढ़ा फ़ाइल, इसे नई लाइन पर विभाजित करें (याद रखें कि आपको यह सुनिश्चित करना होगा कि आपकी पंक्ति के अंत LF
हैं ), और email
. को हटा दें रेखा। अंत में, हम अपने मौजूदा सेंड लॉजिक को जारी रखते हैं।
हमारे भेजें तर्क पर वापस जाएं। हमारे .forEach
. के अंदर फ़ंक्शन, अवरुद्ध ईमेल को छोड़ने के लिए तर्क जोड़ें (अनावश्यक चर बनाने से बचने के लिए हम संदेश ऑब्जेक्ट बनाने से पहले इसे जोड़ देंगे)।
// Here we iterate through the emailList array
emailList.forEach((user) => {
// Here we check if the email has been bounced
if (bounceList.length && bounceList.includes(user.email)) {
console.info(`Message send skipped: ${user.email}`);
return;
}
bounceList.csv
फ़ाइल खाली है, includes
पर कॉल कर रहा है एक त्रुटि फेंक देगा। इसलिए हम एक .length
. की जांच करते हैं मूल्य पहले।
शुरुआती return
. का लाभ उठाकर कथन, हम उस विशेष .forEach
. को समाप्त करते हैं पुनरावृत्ति जब bounceList
वह ईमेल शामिल है। यह हमें उन ईमेल पतों पर भेजने का प्रयास करने से रोकता है जो पहले बाउंस हो चुके हैं। अब अगर आप npm run build
run चलाते हैं और npm run start
, आपको यह आउटपुट अपने टर्मिनल में देखना चाहिए:
अब तक की हमारी प्रगति देखें।
सेंडग्रिड में विफल ईमेल कैसे कैप्चर करें
यदि कोई ईमेल भेजने में विफल रहता है तो वर्तमान में हमारा एप्लिकेशन एक त्रुटि लॉग करेगा। यह छोटे उपयोग के मामलों के लिए काम कर सकता है, लेकिन जैसे ही आप अपने आवेदन को बढ़ाते हैं, आपको उन विफलताओं की पहचान करना और फिर से भेजने का प्रयास करना मुश्किल हो जाएगा।
लेकिन इसके बजाय, हम अपने एप्लिकेशन को उन ईमेल को एक नई फ़ाइल में सहेज सकते हैं।
एक failedEmails.csv
बनाएं अपने prod
. में फ़ाइल करें फ़ोल्डर। यह फ़ाइल खाली हो सकती है। हम शीर्ष लेख पंक्ति जोड़ने के लिए कोड लिखेंगे।
हमारे send.ts
पर वापस जाएं फ़ाइल, लाइन 38 पर हमारे पथ घोषणाओं पर जाएं। आइए हमारे नए failedEmails.csv
के लिए एक और जोड़ें :
// Here we concatenate our file paths for the CSV files
const filePath = path.join(__dirname + "/validEmails.csv");
const bouncePath = path.join(__dirname + "/bouncedEmails.csv");
const failedPath = path.join(__dirname + "/failedEmails.csv");
हमारे अन्य पथों के विपरीत, इस पथ का उपयोग write
. के लिए किया जाएगा संचालन। चूंकि हम लगातार लिखना चाहते हैं क्योंकि ईमेल संसाधित होते हैं, हमें ऐसा करने के लिए एक स्ट्रीम बनाने की आवश्यकता होती है। इन पथ घोषणाओं के ठीक नीचे, आइए उस स्ट्रीम को बनाते हैं और अपनी प्रारंभिक शीर्षलेख पंक्ति जोड़ते हैं।
// Here we create our write stream for failed emails
const failedStream = createWriteStream(failedPath);
// Here we add the header row
failedStream.write("email,unsubscribeId\n")
इस नई स्ट्रीम को शामिल करने के लिए हमारे त्रुटि प्रबंधन तर्क को सुधारने का समय आ गया है। हमें एक और write
जोड़ना होगा send
. में हमारी एरर हैंडलिंग के लिए ऑपरेशन कॉल करें।
// Here we send the message we just constructed!
sgMail
.send(message)
.then(() => {
// Here we log successful send requests
console.info(`Message send success: ${user.email}`);
})
.catch((err) => {
// Here we log errored send requests
console.error(err);
console.error(`Message send failed: ${user.email}`);
// And here we add that email to the failedEmails.csv
failedStream.write(`${user.email},${user.unsubscribeId}\n`)
});
यह email
लिखेगा और unsubscribeId
हमारे नए failedEmails.csv
. पर उचित प्रारूप में - हमें उस डेटा को validEmails.csv
. में कॉपी करने की अनुमति देता है एक और भेजने का प्रयास करने के लिए।
बधाई हो! अब आपने ईमेल ब्लास्ट भेजने के लिए एक सफल और पूरी तरह कार्यात्मक टूल बना लिया है। यदि आप अपने काम की पुष्टि करना चाहते हैं तो आप पूरा कोड देख सकते हैं। लेकिन कुछ वैकल्पिक, "अच्छा लगा" सुविधाओं के लिए पढ़ते रहें।
आपके ईमेल टूल के लिए वैकल्पिक सुविधाएं
चूंकि हमारा टूल सीएलआई-आधारित है (जिसका अर्थ है कि इसका उपयोग कमांड-लाइन इंटरफ़ेस या टर्मिनल में किया जाता है), बहुत अधिक उपयोगकर्ता प्रतिक्रिया नहीं है। स्क्रिप्ट की प्रगति के बारे में अधिक जानकारी प्रदान करने के लिए हम कुछ अतिरिक्त कंसोल फ़ंक्शंस का लाभ उठा सकते हैं।
आइए कुछ "चौकियों" को जोड़कर शुरू करें। हमारे पर्यावरण चर सत्यापन से पहले, आइए एक संदेश प्रिंट करें कि स्क्रिप्ट शुरू हो गई है और चर की जाँच कर रही है:
console.info('Script started. Validating environment variables...')
फिर, हमारे सत्यापन के बाद, हम एक सफल संदेश प्रिंट कर सकते हैं।
// Here we set the SendGrid API key
sgMail.setApiKey(apiKey);
console.info('Variables confirmed!')
बाउंस की गई फ़ाइल को पढ़ने के लिए हमारे फ़ंक्शन के भीतर, हम प्रारंभ, विफलता और सफलता के लिए कुछ संदेश जोड़ सकते हैं।
console.info('Reading bounced email list...')
// Read through the bounce list, parse into array
readFile(bouncePath, "utf8", (err, data) => {
if (err) {
console.error(err);
console.error('Failed to read bounced emails!')
process.exit(1);
}
bounceList = data.split("\n").slice(1);
console.info('Bounced emails read!')
और हमारी वैध ईमेल सूची के लिए भी ऐसा ही:
console.info('Reading send list...')
// This is where we start reading the file!
readFile(filePath, "utf8", (err, data) => {
if (err) {
console.error(err);
console.error('Failed to read send list!')
return;
}
अब, ऑपरेशन पूरा होने पर संदेश प्रिंट करना बहुत अच्छा होगा। हालांकि, अगर हम console.info
. जोड़ते हैं हमारे .forEach
. के बाद लूप, यह वास्तव में पहले . प्रिंट करेगा ईमेल भेजना समाप्त हो गया है!
ऐसा इसलिए है क्योंकि .send
मेथड एक नेटवर्क कॉल बनाता है और एक प्रॉमिस लौटाता है, और हो सकता है कि प्रॉमिस हमारी पुनरावृत्ति समाप्त होने से पहले हल/अस्वीकार न हुआ हो।
इसलिए इसके बजाय हम ईमेल की कुल संख्या बनाम ईमेल की कुल संख्या को ट्रैक करने के लिए एक काउंटर बना सकते हैं। हमारे .forEach
. से ठीक पहले लूप, इन चरों को जोड़ें:
// Here we create variables for counting
const emailTotal = emailList.length;
let emailCount = 0;
हम बाउंस किए गए ईमेल को संसाधित के रूप में गिनना चाहते हैं, भले ही हम उन्हें छोड़ रहे हों।
// Here we iterate through the emailList array
emailList.forEach((user) => {
// Here we check if the email has been bounced
if (bounceList.includes(user.email)) {
console.info(`Message send skipped: ${user.email}`);
emailCount++;
if (emailCount === emailTotal) {
console.info(
`Sending complete! Sent ${emailTotal} emails. Have a nice day!`
);
return;
}
}
अंत में हमें यह देखने के लिए तर्क जोड़ने की जरूरत है कि हमने जो ईमेल भेजा है वह आखिरी ईमेल है या नहीं। यह तर्क भेजें कॉल के लिए हमारी सफलता और त्रुटि हैंडलर में जाता है:
// Here we send the message we just constructed!
sgMail
.send(message)
.then(() => {
// Here we log successful send requests
console.info(`Message send success: ${user.email}`);
// Here we handle the email counts
emailCount++;
if (emailCount === emailTotal) {
console.info(
`Sending complete! Sent ${emailTotal} emails. Have a nice day!`
);
}
})
.catch((err) => {
// Here we log errored send requests
console.error(err);
console.error(`Message send failed: ${user.email}`);
// And here we add that email to the failedEmails.csv
failedStream.write(`${user.email},${user.unsubscribeId}\n`);
// Here we handle the email counts
emailCount++;
if (emailCount === emailTotal) {
console.info(
`Sending complete! Sent ${emailTotal} emails. Have a nice day!`
);
}
});
और इसके साथ ही, हमारा ऐप पूरी तरह से पूरा हो गया है! अगर आप npm run build
चलाते हैं और npm run send
स्क्रिप्ट, आपको यह आउटपुट अपने टर्मिनल में देखना चाहिए:
और आपको इसके समान दिखने वाले कुछ ईमेल प्राप्त होने चाहिए थे:
आप हमारा अंतिम कोड यहां देख सकते हैं, या आप फ्रीकोडकैंप के लिए निर्मित विस्तारित संस्करण देख सकते हैं।