Email-Find

 view release on metacpan or  search on metacpan

lib/Email/Find.pm  view on Meta::CPAN


  use Email::Find;

  # new object oriented interface
  my $finder = Email::Find->new(\&callback);
  my $num_found - $finder->find(\$text);

  # good old functional style
  $num_found = find_emails($text, \&callback);

=head1 DESCRIPTION

Email::Find is a module for finding a I<subset> of RFC 822 email
addresses in arbitrary text (see L</"CAVEATS">).  The addresses it
finds are not guaranteed to exist or even actually be email addresses
at all (see L</"CAVEATS">), but they will be valid RFC 822 syntax.

Email::Find will perform some heuristics to avoid some of the more
obvious red herrings and false addresses, but there's only so much
which can be done without a human.

=head1 METHODS

=over 4

=item new

  $finder = Email::Find->new(\&callback);

Constructs new Email::Find object. Specified callback will be called
with each email as they're found.

=item find

  $num_emails_found = $finder->find(\$text);

Finds email addresses in the text and executes callback registered.

The callback is given two arguments.  The first is a Mail::Address
object representing the address found.  The second is the actual
original email as found in the text.  Whatever the callback returns
will replace the original text.

=head1 FUNCTIONS

For backward compatibility, Email::Find exports one function,
find_emails(). It works very similar to URI::Find's find_uris().

=head1 EXAMPLES

  use Email::Find;

  # Simply print out all the addresses found leaving the text undisturbed.
  my $finder = Email::Find->new(sub {
				    my($email, $orig_email) = @_;
				    print "Found ".$email->format."\n";
				    return $orig_email;
				});
  $finder->find(\$text);

  # For each email found, ping its host to see if its alive.
  require Net::Ping;
  $ping = Net::Ping->new;
  my %Pinged = ();
  my $finder = Email::Find->new(sub {
  				    my($email, $orig_email) = @_;
  				    my $host = $email->host;
  				    next if exists $Pinged{$host};
  				    $Pinged{$host} = $ping->ping($host);
  				});

  $finder->find(\$text);

  while( my($host, $up) = each %Pinged ) {
      print "$host is ". $up ? 'up' : 'down' ."\n";
  }

  # Count how many addresses are found.
  my $finder = Email::Find->new(sub { $_[1] });
  print "Found ", $finder->find(\$text), " addresses\n";

  # Wrap each address in an HTML mailto link.
  my $finder = Email::Find->new(
      sub {
  	  my($email, $orig_email) = @_;
  	  my($address) = $email->format;
  	  return qq|<a href="mailto:$address">$orig_email</a>|;
      },
  );
  $finder->find(\$text);

=head1 SUBCLASSING

If you want to change the way this module works in finding email
address, you can do it by making your subclass of Email::Find, which
overrides C<addr_regex> and C<do_validate> method.

For example, the following class can additionally find email addresses
with dot before at mark. This is illegal in RFC822, see
L<Email::Valid::Loose> for details.

  package Email::Find::Loose;
  use base qw(Email::Find);
  use Email::Valid::Loose;

  # should return regex, which Email::Find will use in finding
  # strings which are "thought to be" email addresses
  sub addr_regex {
      return $Email::Valid::Loose::Addr_spec_re;
  }

  # should validate $addr is a valid email or not.
  # if so, return the address as a string.
  # else, return undef
  sub do_validate {
      my($self, $addr) = @_;
      return Email::Valid::Loose->address($addr);
  }

Let's see another example, which validates if the address is an
existent one or not, with Mail::CheckUser module.



( run in 0.563 second using v1.01-cache-2.11-cpan-39bf76dae61 )