DEV Community

Cover image for EmailSpamChecker class for .NET Framework 4.7
Ravi Vishwakarma
Ravi Vishwakarma

Posted on

EmailSpamChecker class for .NET Framework 4.7

Here’s a complete and reusable EmailSpamChecker class for .NET Framework 4.7, which performs:

  • Syntax validation
  • Blacklisted domain check
  • MX record verification (requires DnsClient NuGet)
  • Scoring logic for spam suspicion
  • Customizable domain block list

Step 1: Install DnsClient NuGet Package

From NuGet Package Manager Console:

Install-Package DnsClient
Enter fullscreen mode Exit fullscreen mode

Step 2: EmailSpamChecker Class

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Text.RegularExpressions;
using DnsClient;

public class EmailSpamChecker
{
    private static readonly string[] _blacklistedDomains = new[]
    {
        "mailinator.com", "10minutemail.com", "guerrillamail.com",
        "tempmail.com", "desy.xyz", "yopmail.com", "trashmail.com"
    };

    private static readonly string[] _suspiciousTlds = new[]
    {
        ".xyz", ".tk", ".gq", ".ml", ".cf"
    };

    public class SpamCheckResult
    {
        public bool IsValid { get; set; }
        public int SpamScore { get; set; }
        public List<string> Issues { get; set; } = new List<string>();
    }

    public static SpamCheckResult CheckEmail(string email)
    {
        var result = new SpamCheckResult();

        // Check basic syntax
        if (!IsValidSyntax(email))
        {
            result.Issues.Add("Invalid email syntax.");
            result.SpamScore += 2;
            result.IsValid = false;
            return result;
        }

        string domain = email.Split('@')[1].ToLower();

        // Check blacklist
        if (_blacklistedDomains.Contains(domain))
        {
            result.Issues.Add("Domain is blacklisted.");
            result.SpamScore += 3;
        }

        // Check suspicious TLD
        if (_suspiciousTlds.Any(tld => domain.EndsWith(tld)))
        {
            result.Issues.Add("Suspicious top-level domain.");
            result.SpamScore += 1;
        }

        // Check if it looks random (e.g., [email protected])
        if (IsRandomLooking(email))
        {
            result.Issues.Add("Username looks auto-generated or random.");
            result.SpamScore += 1;
        }

        // Check MX record
        if (!HasValidMxRecord(domain))
        {
            result.Issues.Add("Domain has no MX record (may not receive emails).");
            result.SpamScore += 2;
        }

        result.IsValid = result.SpamScore < 3;
        return result;
    }

    private static bool IsValidSyntax(string email)
    {
        try
        {
            var addr = new MailAddress(email);
            return addr.Address == email;
        }
        catch
        {
            return false;
        }
    }

    private static bool HasValidMxRecord(string domain)
    {
        try
        {
            var lookup = new LookupClient();
            var result = lookup.Query(domain, QueryType.MX);
            return result.Answers.MxRecords().Any();
        }
        catch
        {
            return false;
        }
    }

    private static bool IsRandomLooking(string email)
    {
        string user = email.Split('@')[0];

        // Count digits and special chars
        int digitCount = user.Count(char.IsDigit);
        int symbolCount = user.Count(c => !char.IsLetterOrDigit(c));

        // Very short or too random
        return user.Length < 5 || digitCount + symbolCount > 4;
    }
}
Enter fullscreen mode Exit fullscreen mode

Usage Example

string inputEmail = "[email protected]";
var result = EmailSpamChecker.CheckEmail(inputEmail);

if (!result.IsValid)
{
    Console.WriteLine("Potential spam or invalid email:");
    foreach (var issue in result.Issues)
        Console.WriteLine($"- {issue}");
}
else
{
    Console.WriteLine("Email looks clean.");
}
Enter fullscreen mode Exit fullscreen mode

Output Example

Potential spam or invalid email:

  • Domain is blacklisted.
  • Suspicious top-level domain.
  • Domain has no MX record (may not receive emails).

Thanks
Keep Coding.

Top comments (1)

Collapse
 
anna_hajare_9520a4c4d15ee profile image
Anna Hajare • Edited

Great