NAME

    checkmail - check deliverability of a mail address

SYNOPSIS

    checkmail [-Vhqlr] [-m *host*] *address*|-f *file*

REQUIREMENTS

    - Perl 5.8 or later

    - File::Basename

    - Getopt::Std

    - Net::DNS *(CPAN)*

    - Net::SMTP

    Furthermore you'll need a working DNS installation.

DESCRIPTION

    checkmail checks the vailidity / deliverability of a mail address. You
    may submit just one address as the last argument or a file containing
    one address on each line using the -f option.

  Configuration

    For the time being, all configuration is done in the script. You have to
    set the following elements of the %config hash:

    $config{'helo'}
        The hostname to be used for *HELO* or *EHLO* in the SMTP dialog.

    $config{'from'}
        The sender address to be used for *MAIL FROM* while testing.

    $config{'rand'}
        A "random" local part to construct a reliably invalid address for
        use with the -r option.

  Usage

    After configuring the script you may run your first test with

        checkmail user@example.org

    checkmail will try to determine the mail exchanger(s) (MX) responsible
    for *example.org* by querying the DNS for the respective MX records and
    then try to connect via SMTP (on port 25) to each of them in order of
    precedence (if necessary). It will run through the SMTP dialog until
    just before the *DATA* stage, i.e. doing *EHLO*, *MAIL FROM* and *RCPT
    TO*. If no MX is defined, checkmail will fall back to the *example.org*
    host itself, provided there is at least one A record defined in the DNS.
    If there are neither MX nor A records for *example.org*, mail is not
    deliverable and checkmail will fail accordingly. If no host can be
    reached, checkmail will fail, too. Finally checkmail will fail if mail
    to the given recipient is not accepted by the respective host.

    If checkmail fails, you'll not be able to deliver mail to that address -
    at least not using the configured sender address and from the host
    you're testing from. However, the opposite is not true: a mail you send
    may still not be delivered even if a test via checkmail succeeds. The
    receiving entity may reject your mail after the *DATA* stage, due to
    content checking or without any special reason, or it may even drop,
    filter or bounce your mail after finally accepting it. There is no way
    to be sure a mail will be accepted short of sending a real mail to the
    address in question.

    You may, however, try to detect hosts that will happily accept any and
    all recipient in the SMTP dialog and just reject your mail later on, for
    example to defeat exactly the kind of check you try to do. checkmail
    will do that by submitting a recipient address that is known to be
    invalid; if that address is accepted, too, you'll know that you can't
    reliably check the validity of any address on that host. You can force
    that check by using the -r option.

    If you don't want to see just the results of your test, you can get a
    complete log of the SMTP dialog by using the -l option. That may be
    helpful to test for temporary failure conditions.

    On the other hand you may use the -q option to suppress all output;
    checkmail will then terminate with one of the following exit status:

    0   address(es) seem/seems to be valid

    1   temporary error (connection failure or temporary failure)

    2   address is invalid

    3   address cannot reliably be checked (test using -r failed)

    You can do batch processing using -f and submitting a file with one
    address on each line. In that case the exit status is set to the highest
    value generated by testing all addresses, i.e. it is set to 0 if and
    only if no adress failed, but to 2 if even one address failed and to 3
    if even one addresses couldn't reliably be checked.

    And finally you can suppress DNS lookups for MX and A records and just
    force checkmail to connect to a particular host using the -m option.

    Please note: You shouldn't try to validate addresses while working from
    a dial-up or blacklisted host. If in doubt, use the -l option to have a
    closer look on the SMTP dialog yourself.

OPTIONS

    -V (version)
       Print out version and copyright information on checkmail and exit.

    -h (help)
       Print this man page and exit.

    -q (quit)
       Suppress output and just terminate with a specific exit status.

    -l (log)
       Log and print out the whole SMTP dialog.

    -r (random address)
       Also try a reliably invalid address - defined in $config{'rand'} - to
       catch hosts that try undermine address verification.

    -m *host* (MX to use)
       Force a connection to *host* to check deliverability to that
       particular host irrespective of DNS entries. For example:

           checkmail -m test.host.example user@domain.example

    -f *file* (file)
       Process all addresses from *file* (one on each line).

INSTALLATION

    Just copy checkmail to some directory and get started.

    You can run your first test with

        checkmail user@example.org

ENVIRONMENT

    See documentation of *Net::DNS::Resolver*.

FILES

    checkmail.pl
        The script itself.

BUGS

    Please report any bugs or feature request to the author or use the bug
    tracker at <http://bugs.th-h.de/>!

SEE ALSO

    <http://th-h.de/download/scripts.php> will have the current version of
    this program.

    This program is maintained using the Git version control system. You may
    clone <git://code.th-h.de/mail/checkmail.git> to check out the current
    development tree or browse it on the web via
    <http://code.th-h.de/?p=mail/checkmail.git>.

AUTHOR

    Thomas Hochstein <thh@inter.net>

COPYRIGHT AND LICENSE

    Copyright (c) 2002-2010 Thomas Hochstein <thh@inter.net>

    This program is free software; you may redistribute it and/or modify it
    under the same terms as Perl itself.

