Fic a c++ email verifier code source

i have this code
This code is a program that reads a list of emails from a file named “emails.txt” and checks the validity of each email using a regular expression. Valid emails are written to a file named “valid_emails.txt” and invalid emails are written to a file named “invalid_emails.txt”. The code also uses the SMTP server “smtp.gmail.com” with the username and password “username” and “password” to check if the email exists. At the end, the code displays a message box with the number of valid and invalid emails found.

the problem is that it saves an invalid email as valid

#include <iostream> #include <fstream> #include <regex> #include <Windows.h> #include <string.h> using namespace std; int main() { // Define input and output file names const string inputFileName = "emails.txt"; const string validEmailsFileName = "valid_emails.txt"; const string invalidEmailsFileName = "invalid_emails.txt"; // Check if input file exists ifstream inputFile(inputFileName); if (!inputFile) { cout << "Error: Input file " << inputFileName << " does not exist." << endl; return 1; } // Create output files if they do not exist ofstream validEmailsFile(validEmailsFileName); ofstream invalidEmailsFile(invalidEmailsFileName); // Define SMTP server, username, and password for email validation const string smtpServer = "smtp.gmail.com"; const string smtpUsername = "username"; const string smtpPassword = "password!"; // Define regular expression for email validation const regex emailRegex("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"); // Initialize counters for valid and invalid emails int validEmailsCount = 0; int invalidEmailsCount = 0; // Read input file line by line string email; while (getline(inputFile, email)) { // Check if email is in valid format if (regex_match(email, emailRegex)) { // Connect to SMTP server and check if email exists // ... // Write email to valid emails file and increment valid email counter if (regex_match(email, emailRegex)) { validEmailsFile << email << endl; validEmailsCount++; } } else { // Write email to invalid emails file and increment invalid email counter if (!regex_match(email, emailRegex)) { invalidEmailsFile << email << endl; invalidEmailsCount++; } } } // Close all files inputFile.close(); validEmailsFile.close(); invalidEmailsFile.close(); // Display message box with number of valid and invalid emails found wstring message = L"Valid emails: " + to_wstring(validEmailsCount) + L"\nInvalid emails: " + to_wstring(invalidEmailsCount); MessageBoxW(NULL, message.c_str(), L"Email Validation Results", MB_OK); return 0; }

The problem seems to be in the way you are checking the validity of the email addresses. The code is checking the regular expression twice, once inside the if block and again inside the nested if block. This leads to some invalid email addresses being saved as valid because they match the regular expression inside the nested if block.

To fix this issue, you can remove the nested if block and the else block, and just use the outer if block to check the validity of the email. Here’s the updated code:

#include <iostream>
#include <fstream>
#include <regex>
#include <Windows.h>
#include <string.h>

using namespace std;

int main() {
    // Define input and output file names
    const string inputFileName = "emails.txt";
    const string validEmailsFileName = "valid_emails.txt";
    const string invalidEmailsFileName = "invalid_emails.txt";

    // Check if input file exists
    ifstream inputFile(inputFileName);
    if (!inputFile) {
        cout << "Error: Input file " << inputFileName << " does not exist." << endl;
        return 1;
    }

    // Create output files if they do not exist
    ofstream validEmailsFile(validEmailsFileName);
    ofstream invalidEmailsFile(invalidEmailsFileName);

    // Define SMTP server, username, and password for email validation
    const string smtpServer = "smtp.gmail.com";
    const string smtpUsername = "username";
    const string smtpPassword = "password!";

    // Define regular expression for email validation
    const regex emailRegex("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$");

    // Initialize counters for valid and invalid emails
    int validEmailsCount = 0;
    int invalidEmailsCount = 0;

    // Read input file line by line
    string email;
    while (getline(inputFile, email)) {
        // Check if email is in valid format
        if (regex_match(email, emailRegex)) {
            // Connect to SMTP server and check if email exists
            // ...

            // Write email to valid emails file and increment valid email counter
            validEmailsFile << email << endl;
            validEmailsCount++;
        } else {
            // Write email to invalid emails file and increment invalid email counter
            invalidEmailsFile << email << endl;
            invalidEmailsCount++;
        }
    }

    // Close all files
    inputFile.close();
    validEmailsFile.close();
    invalidEmailsFile.close();

    // Display message box with number of valid and invalid emails found
    wstring message = L"Valid emails: " + to_wstring(validEmailsCount) + L"\nInvalid emails: " + to_wstring(invalidEmailsCount);
    MessageBoxW(NULL, message.c_str(), L"Email Validation Results", MB_OK);
    return 0;
}

Please note that you will still need to update the smtpUsername and smtpPassword variables with your own Gmail username and password in order to use the SMTP server for email validation.

Let me know if you have any questions :slight_smile: