views:

201

answers:

6

I have a client with 5000 emails from an old list he has that he wants to promote his services to. He wants to know which emails on the list are still valid. I want to check them for him - without sending out 5K emails randomly and then being listed as a spammer or something. Ideas?

A: 

I think you'll have to send email to them. If you're worried about being flagged as a spammer you might try sending them in short bursts.

Brendan Enrick
+1  A: 

You'll have to email them at least once.

  • Create a new email list. Send the old list an email with a link they need to click on to continue receiving messages (re-subscribe).
  • Send them all an email and collect all reply-to bounces on a real email account, then purge those bounced emails from your main list.
  • Send them all an HTML email, and one of the images is remotely hosted and requires a unique ID to request it that you set in each email. When your web server returns that image to their client, you can then consider that email as active. This is called a web bug, and will only work if the person automatically loads remote images in their client.
Mike Atlas
The image validation doesn't always work, since most organizations (I know of) suppress remove images by default. Your second option is fine... it's a nice way to get the users to opt in on further correspondence.
Gert G
Yeah, it might be only one of several methods the OP might want to employ to determine stale emails. I moved option #2 to #1 :)
Mike Atlas
+1  A: 

I think you need to send the emails to find out. Also, this is pretty much exactly what a spammer is, thus the reason for getting put on spammer lists. Sending in bursts will help you hide this fact though.

Andrew Hubbs
+2  A: 

You can validate the email via SMTP without sending an actual email.

http://code.google.com/p/php-smtp-email-validation/

You could also send emails out, and check for bounces.

bucabay
A: 

If it was me I would:

  • Validate the email with a regular expression. Good example here.
  • Ping or Whois the server to see if it is a valid domain. (This won't be 100% but should get one step closer)
  • Send an email to the remaining addresses that are still in doubt.
Jason Webb
+2  A: 

bucabay's answer is the way forward. What a library like that essentially does is checking for existing DNS record for (mail) servers at specified domains (A, MX, or AAAA). After that, it do what's termed callback verification. That's where you connect to the mail server, tell it you want to send to a particular email address and see if they say OK.

For callback verification, you should note greylisting servers say OK to everything so there is no 100% guarantee possible without actually sending the emails out. Here's some code I used when I did this manually. It's a patch onto the email address parser from here.

    #
    # Email callback verification
    # Based on http://uk2.php.net/manual/en/function.getmxrr.php
    #

    if (strlen($bits['domain-literal'])){
        $records = array($bits['domain-literal']);
    }elseif (!getmxrr($bits['domain'], $mx_records, $mx_weight)){
        $records = array($bits['domain']);
    }else{
        $mxs = array();

        for ($i = 0; $i < count($mx_records); $i++){
            $mxs[$mx_records[$i]] = $mx_weight[$i];
        }

        asort($mxs);

        $records = array_keys($mxs);
    }

    $user_okay = false;
    for ($j = 0; $j < count($records) && !$user_okay; $j++){
        $fp = @fsockopen($records[$j], 25, $errno, $errstr, 2);
        if($fp){
            $ms_resp = "";

            $ms_resp .= send_command($fp, "HELO ******.com");
            $ms_resp .= send_command($fp, "MAIL FROM:<>");

            $rcpt_text = send_command($fp, "RCPT TO:<" . $email . ">");
            $ms_resp .= $rcpt_text;

            $ms_code = intval(substr($rcpt_text, 0, 3));
            if ($ms_code == 250 || $ms_code == 451){ // Accept all user account on greylisting server
                $user_okay = true;
            }

            $ms_resp .= send_command($fp, "QUIT");

            fclose($fp);
        }
    }

return $user_okay ? 1 : 0;
KTC