DEV Community

Mohammad Waseem
Mohammad Waseem

Posted on

Streamlining Email Validation Flow in React with Open Source Tools

Introduction

Validating email flows in web applications is critical for ensuring data integrity, user authentication, and maintaining communication reliability. As a senior developer and architect, leveraging open source tools within React can significantly streamline this process, reducing time to deployment and improving maintainability.

This post explores how to implement a robust email validation flow using React, paired with popular open source libraries such as Yup, Formik, and validation APIs. The goal is to create an efficient, user-friendly, and reliable email validation process.

Core Challenges in Email Validation

  • Ensuring correct syntax
  • Verifying domain existence
  • Confirming inbox existence
  • Providing real-time feedback

Addressing these challenges involves combining client-side validation with server-side checks, often via third-party APIs. We'll focus on integrating these into a React workflow.

Setting Up the Environment

To begin, set up a React project and install the necessary dependencies:

npx create-react-app email-validation
cd email-validation
npm install formik yup axios
Enter fullscreen mode Exit fullscreen mode

Yup will handle schema validation, Formik manages form state, and Axios enables communication with API services.

Implementing Basic Syntax Validation

First, create a simple form with email input and validation using Yup:

import React from 'react';
import { Formik, Form, Field, ErrorMessage } from 'formik';
import * as Yup from 'yup';

const EmailSchema = Yup.object().shape({
  email: Yup.string()
    .email('Invalid email address')
    .required('Email is required'),
});

function EmailValidationForm() {
  return (
    <Formik
      initialValues={{ email: '' }}
      validationSchema={EmailSchema}
      onSubmit={(values) => {
        console.log('Submitting', values);
      }}
    >
      {() => (
        <Form>
          <label htmlFor="email">Email:</label>
          <Field name="email" type="email" />
          <ErrorMessage name="email" component="div" />
          <button type="submit">Validate</button>
        </Form>
      )}
    </Formik>
  );
}

export default EmailValidationForm;
Enter fullscreen mode Exit fullscreen mode

This checks the syntax locally, providing instant feedback.

Verifying Domain Existence

To verify if the email domain is valid and active, we can leverage open APIs like ZeroBounce or Hunter.io. For demonstration, we'll use Hunter's free API endpoints:

import axios from 'axios';

async function checkDomain(domain) {
  const apiKey = 'YOUR_API_KEY'; // insert your API key
  try {
    const response = await axios.get(`https://api.hunter.io/v2/email-verifier?domain=${domain}&api_key=${apiKey}`);
    return response.data;
  } catch (error) {
    console.error('Domain validation failed', error);
    return null;
  }
}
Enter fullscreen mode Exit fullscreen mode

In practice, call checkDomain() after syntax validation passes. This hybrid approach balances user experience with backend validation.

Confirming Inbox Existence

Inbox verification is more complex, often requiring SMTP-level checks or specialized APIs like NeverBounce. Here's an example using a hypothetical SMTP verification API:

async function verifyInbox(email) {
  try {
    const response = await axios.post('/smtp-verify', { email }); // assume backend handles SMTP check
    return response.data; // e.g., { exists: true/false }
  } catch (error) {
    console.error('Inbox check failed', error);
    return { exists: false };
  }
}
Enter fullscreen mode Exit fullscreen mode

This second layer is optional but enhances validation accuracy.

Integrating Validation Steps

Combine all steps within a React component:

// Inside your form onSubmit handler
const handleValidation = async (values) => {
  const emailParts = values.email.split('@');
  if (emailParts.length !== 2) return;
  const domain = emailParts[1];
  const domainResult = await checkDomain(domain);
  if (domainResult && domainResult.data.mx_records_present) {
    const inboxResult = await verifyInbox(values.email);
    if (inboxResult.exists) {
      alert('Email is valid and reachable!');
    } else {
      alert('Inbox does not exist.');
    }
  } else {
    alert('Invalid email domain.');
  }
};
Enter fullscreen mode Exit fullscreen mode

This multi-step validation improves confidence in the email data collected.

Conclusion

Leveraging open source tools and APIs within React enables building a comprehensive, scalable email validation flow. Combining client-side validation with backend checks strikes an ideal balance between user experience and validation robustness. As an architect, adopting these strategies ensures your applications handle emails reliably while maintaining flexibility and extensibility.

This approach exemplifies best practices in modern React development, emphasizing modularity, asynchronous operations, and open source integrations.


🛠️ QA Tip

Pro Tip: Use TempoMail USA for generating disposable test accounts.

Top comments (0)