<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Ondrej Musil</title>
    <description>The latest articles on Forem by Ondrej Musil (@freaz).</description>
    <link>https://forem.com/freaz</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F628845%2Fdbda34d7-bcf9-4399-ba2c-03ec82078c80.jpeg</url>
      <title>Forem: Ondrej Musil</title>
      <link>https://forem.com/freaz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/freaz"/>
    <language>en</language>
    <item>
      <title>Don't get burned by email</title>
      <dc:creator>Ondrej Musil</dc:creator>
      <pubDate>Tue, 27 Jul 2021 12:13:38 +0000</pubDate>
      <link>https://forem.com/superface/don-t-get-burned-by-email-6c4</link>
      <guid>https://forem.com/superface/don-t-get-burned-by-email-6c4</guid>
      <description>&lt;p&gt;When we noticed &lt;a href="https://twitter.com/garybernhardt/status/1390461076974735363" rel="noopener noreferrer"&gt;Gary Bernhardt's tweet&lt;/a&gt; about the major outage of &lt;a href="https://status.sendgrid.com/incidents/bj70jkn55zv8" rel="noopener noreferrer"&gt;SendGrid services&lt;/a&gt; we realized, we could get burned as well and looked at how &lt;a href="https://superface.ai/" rel="noopener noreferrer"&gt;Superface&lt;/a&gt; could help.&lt;/p&gt;

&lt;p&gt;This tutorial will help you to send transactional emails with the maximum reliability using &lt;a href="https://github.com/superfaceai/one-sdk-js" rel="noopener noreferrer"&gt;Superface OneSDK&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;By the end of the tutorial, you’ll have an email integration that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;automatically fails over and recovers between multiple email providers using circuit breaker pattern&lt;/li&gt;
&lt;li&gt;gives you clear insights into your email usage across all providers&lt;/li&gt;
&lt;li&gt;notifies you when things go wrong and actively suggests improvements&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Providers and setup
&lt;/h2&gt;

&lt;p&gt;The simplest step you can do to improve your application is to use two providers with failover.&lt;/p&gt;

&lt;p&gt;For the purpose of this tutorial, we will use &lt;a href="http://example.com/" rel="noopener noreferrer"&gt;example.com&lt;/a&gt; as a sender domain and &lt;a href="//mailto:hello@example.com"&gt;hello@example.com&lt;/a&gt; as a sender email address. We’ll configure SendGrid to be the primary and Postmark the secondary email provider. Feel free to use your own domains &amp;amp; providers of choice (although currently only Sendgrid, Postmark, Mailgun &amp;amp; Mandrill by Mailchimp are supported).&lt;/p&gt;

&lt;p&gt;You need to do two things, to be able to send emails:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Verify domain or configure single email address&lt;/li&gt;
&lt;li&gt;Get API Key to access provider APIs&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SendGrid&lt;/strong&gt;: &lt;a href="https://docs.sendgrid.com/ui/account-and-settings/how-to-set-up-domain-authentication" rel="noopener noreferrer"&gt;How to verify domain&lt;/a&gt;, &lt;a href="https://docs.sendgrid.com/ui/account-and-settings/api-keys" rel="noopener noreferrer"&gt;How to get API Key&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Postmark&lt;/strong&gt;: &lt;a href="https://postmarkapp.com/support/article/1046-how-do-i-verify-a-domain" rel="noopener noreferrer"&gt;How to verify domain&lt;/a&gt;, &lt;a href="https://postmarkapp.com/videos/an-introduction-to-postmark-servers" rel="noopener noreferrer"&gt;How to get API Key&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mandrill&lt;/strong&gt; (by Mailchimp): &lt;a href="https://mailchimp.com/developer/transactional/docs/authentication-delivery/#authentication" rel="noopener noreferrer"&gt;How to verify domain&lt;/a&gt;, &lt;a href="https://mailchimp.com/developer/transactional/guides/quick-start/#generate-your-api-key" rel="noopener noreferrer"&gt;How to get API Key&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mailgun&lt;/strong&gt;: &lt;a href="https://documentation.mailgun.com/en/latest/user_manual.html#verifying-your-domain" rel="noopener noreferrer"&gt;How to verify domain&lt;/a&gt;, &lt;a href="https://documentation.mailgun.com/en/latest/api-intro.html#base-url" rel="noopener noreferrer"&gt;How to get API Key&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last step is to &lt;a href="https://superface.ai/create-account?invitation=resilient_email" rel="noopener noreferrer"&gt;Create Superface account&lt;/a&gt;. It will give you access to details about &lt;a href="http://superface.ai/communication/send-email" rel="noopener noreferrer"&gt;send-email&lt;/a&gt; capability, and to your project monitoring, which we will use later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use OneSDK in your application
&lt;/h2&gt;

&lt;p&gt;You can use any of your NodeJS projects or simply clone our &lt;a href="https://github.com/superfaceai/resilient-email-tutorial" rel="noopener noreferrer"&gt;tutorial repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you use our tutorial repository, get started with installing dependencies and start the application,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install dependencies&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Start application&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then open &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;, you should see&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiashx6zm3ntm2yxq5tle.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiashx6zm3ntm2yxq5tle.png" alt="Running App"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Add send-email capability and configure providers
&lt;/h3&gt;

&lt;p&gt;The easiest way to add use cases is to use &lt;a href="https://github.com/superfaceai/cli" rel="noopener noreferrer"&gt;Superface CLI&lt;/a&gt;. Its interactive install will guide you through the setup, and will automatically install OneSDK that does the hard work of integrating for you. &lt;/p&gt;

&lt;p&gt;The goal is to have two providers (SendGrid and Postmark) with failover and configure &lt;code&gt;SendEmail&lt;/code&gt; usecase to use &lt;a href="https://en.wikipedia.org/wiki/Circuit_breaker_design_pattern" rel="noopener noreferrer"&gt;circuit-breaker&lt;/a&gt; as failover policy.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npx @superfaceai/cli &lt;span class="nb"&gt;install &lt;/span&gt;communication/send-email &lt;span class="nt"&gt;-i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After finishing the interactive install, you should see a new folder called &lt;code&gt;superface&lt;/code&gt;. It is a place where all configuration and metadata for OneSDK lives. Also, &lt;code&gt;package.json&lt;/code&gt; and &lt;code&gt;package-lock.json&lt;/code&gt; will be updated because CLI added &lt;code&gt;@superfaceai/one-sdk&lt;/code&gt; as a new dependency.&lt;/p&gt;

&lt;h3&gt;
  
  
  Send email
&lt;/h3&gt;

&lt;p&gt;Now it is time to send emails. It should be implemented in &lt;code&gt;routes/index.js&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;First you need to import &lt;code&gt;SuperfaceClient&lt;/code&gt; from &lt;code&gt;@superfaceai/one-sdk&lt;/code&gt; package&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SuperfaceClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@superfaceai/one-sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The email will be sent when POST request is received &lt;em&gt;(Look for TODO: Implement Send Hello email comment).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Replace the comment and next line with following code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Create OneSDK instance&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sdk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SuperfaceClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Load installed profile&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;profile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;sdk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getProfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;communication/send-email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Use the profile to SendEmail&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getUseCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SendEmail&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;perform&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hello@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Superface Resilient Email Tutorial&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Hello &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; from Superface Tutorial`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Get and show data&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Send Email Failed: &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Uups..&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Now it is time to run it and try if it works.&lt;/p&gt;

&lt;p&gt;Start application with&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;, fill in your email address, and hit &lt;code&gt;Send Hello&lt;/code&gt;, you should get the message-id as result and receive the email.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmom0psz7xyxq2spu87pe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmom0psz7xyxq2spu87pe.png" alt="Send with SendGrid"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Testing failover
&lt;/h3&gt;

&lt;p&gt;Now let's check how failover works.&lt;/p&gt;

&lt;p&gt;You don't want to wait for the next outage, to see if failover works. To emulate the unavailability of SendGrid API, you can point &lt;a href="http://api.sendgrid.com" rel="noopener noreferrer"&gt;api.sendgrid.com&lt;/a&gt; to &lt;a href="http://localhost" rel="noopener noreferrer"&gt;localhost&lt;/a&gt; in &lt;code&gt;/etc/hosts&lt;/code&gt;. If you configured a different primary provider, use its respective API base URL.&lt;/p&gt;

&lt;p&gt;For unix systems open &lt;code&gt;/etc/hosts&lt;/code&gt; with sudo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/hosts
Password:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and enter this line at the end&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;127.0.0.1 api.sendgrid.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;result should be similar to&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1   localhost
255.255.255.255 broadcasthost
::1             localhost

127.0.0.1 api.sendgrid.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now go back to running the application and send a hello to yourself again&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F98qhddi8jr43i083s8yz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F98qhddi8jr43i083s8yz.png" alt="Send with Postmark"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It looks the same as before, but there is a small change. The message-id has a different structure. And it is because the email was sent with Postmark instead of unavailable SendGrid.&lt;/p&gt;

&lt;p&gt;You can also try how OneSDK will recover, by removing &lt;a href="http://api.sendgrid.com" rel="noopener noreferrer"&gt;api.sendgrid.com&lt;/a&gt; entry added to &lt;code&gt;/etc/hosts&lt;/code&gt;. It must be at least 30 seconds from failover to secondary, to get tried primary provider again.et&lt;/p&gt;

&lt;h2&gt;
  
  
  Dashboard
&lt;/h2&gt;

&lt;p&gt;If you configured OneSDK with SDK Token, you should also receive an email notification about failover. It contains information such as when the failover happened and the reason.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F69b309s63zxc7kpyqjqq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F69b309s63zxc7kpyqjqq.png" alt="Failover email notification"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you check the &lt;a href="https://superface.ai/dashboard" rel="noopener noreferrer"&gt;dashboard&lt;/a&gt;, you can see what profiles and providers your application is using, the number of performs, and when the last failover happened.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2m318kpuv7ogwkit1d4c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2m318kpuv7ogwkit1d4c.png" alt="Project insights"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Emails are important in applications we build, without them users are not able to sign in, or worse customers will not receive bought train tickets. Here is how you can make it super resilient with the least effort. &lt;/p&gt;

&lt;p&gt;The best part? You can get this level of resiliency and ease of use for any use case out there! Check out &lt;a href="https://superface.ai" rel="noopener noreferrer"&gt;Superface&lt;/a&gt; and &lt;a href="https://superface.ai/how-it-works" rel="noopener noreferrer"&gt;how it works&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>tutorial</category>
      <category>api</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
