DEV Community

Mohammad Waseem
Mohammad Waseem

Posted on

Automating Email Flow Validation with JavaScript and Open Source Tools

Ensuring the reliability of email flows is critical for maintaining user engagement and trust. As a Lead QA Engineer, I recently tackled the challenge of validating complex email sequences — from welcome emails to transactional notifications — using JavaScript and open source tools to create a robust, automated testing framework.

The Challenge

Traditional manual testing of email flows is time-consuming and error-prone, especially when dealing with multiple environments or frequent updates. Our goal was to verify that emails are being sent correctly, contain accurate content, and follow the intended flow, all without relying heavily on proprietary or commercial email testing services.

Approach Overview

Leveraging JavaScript's flexibility and a suite of open source tools, I built an automated validation process that captures email content, verifies flow triggers, and ensures consistency across deployments.

Key Components

  • Nodemailer: A module for intercepting outgoing emails in a test environment.
  • MailHog: An open source email testing tool that acts as a local SMTP server, capturing emails for inspection.
  • Jest: A test runner framework for orchestrating validation tests.
  • Cheerio: For parsing and verifying email HTML contents.

Implementation Steps

  1. Set Up MailHog as SMTP Server

MailHog runs locally and captures all outgoing emails for inspection without sending real emails:

# Run MailHog
docker run -d -p 1025:1025 -p 8025:8025 mailhog/mailhog
Enter fullscreen mode Exit fullscreen mode

Configure environment variables in your test environment to point email sending functions to MailHog's SMTP port.

  1. Intercept Emails with Nodemailer

Nodemailer allows us to programmatically send emails within tests, and with a custom transport, prevent actual delivery:

const nodemailer = require('nodemailer');

const transporter = nodemailer.createTransport({
  host: 'localhost',
  port: 1025,
  ignoreTLS: true
});

async function sendTestEmail() {
  const info = await transporter.sendMail({
    from: 'test@company.com',
    to: 'user@example.com',
    subject: 'Welcome!',
    html: '<h1>Welcome to Our Service</h1><p>Thanks for signing up.</p>'
  });
  console.log('Email sent:', info.messageId);
}
Enter fullscreen mode Exit fullscreen mode
  1. Retrieve and Parse Captured Emails

Use axios or node-fetch to access MailHog's API and retrieve captured emails:

const fetch = require('node-fetch');

async function getEmails() {
  const response = await fetch('http://localhost:8025/api/v2/messages');
  const data = await response.json();
  return data.items;
}

// Validate email content
async function validateEmailContent() {
  const emails = await getEmails();
  emails.forEach(email => {
    const htmlContent = email.Content.Body;
    const $ = cheerio.load(htmlContent);
    const heading = $('h1').text();
    expect(heading).toBe('Welcome to Our Service');
  });
}
Enter fullscreen mode Exit fullscreen mode
  1. Automate Flow Validation with Jest

Combine the above steps into a Jest test suite:

describe('Email Flow Validation', () => {
  beforeAll(async () => {
    await sendTestEmail();
  });

  test('Received email should contain correct header', async () => {
    const emails = await getEmails();
    expect(emails.length).toBeGreaterThan(0);
    const htmlContent = emails[0].Content.Body;
    const $ = cheerio.load(htmlContent);
    expect($('h1').text()).toBe('Welcome to Our Service');
  });
});
Enter fullscreen mode Exit fullscreen mode

Benefits of This Approach

  • Open source ecosystem minimizes costs.
  • Automation reduces manual effort and increases test coverage.
  • Realistic simulation with MailHog captures email flows accurately.
  • Extensibility allows for complex flow validation and content checks.

Final Thoughts

Validating email flows using JavaScript with open source tools offers a scalable, cost-effective solution. By intercepting emails with MailHog, programmatically sending and retrieving them with Nodemailer and fetch, and validating content with Cheerio within Jest tests, QA teams can dramatically improve their email reliability assurance.

This approach fosters rapid feedback and continuous integration, ensuring that email interactions are always in line with expectations, ultimately enhancing user experience and trust.


🛠️ QA Tip

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

Top comments (0)