Email::Find(3pm)

πŸ“¦
version 0.10-dfsg Β· 4 versions
, in debian bookworm, debian trixie, ubuntu noble, ubuntu resolute, ubuntu stonking

πŸ’– Email::Find πŸ’–

okay so bestie, welcome to Email::Find β€” it's a Perl module, it lives in the User Contributed Perl Documentation section of your man pages (you'll see it filed under Email::Find(3pm)), and it does exactly one iconic thing: it finds RFC 822 email addresses in plain text. that's it. that's the whole vibe. ✨


✨ NAME ✨

Email::Find β€” Find RFC 822 email addresses in plain text πŸ¦‹


πŸŽ€ SYNOPSIS πŸŽ€

  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);

🌸 DESCRIPTION 🌸

So Email::Find is the module you call when you need to find a subset of RFC 822 email addresses hiding in arbitrary text (peep the "CAVEATS" section, bestie, it matters). and listen β€” the addresses it finds are not guaranteed to exist or to even actually be email addresses at all (again: "CAVEATS"), but they will be valid RFC 822 syntax. so it's giving "syntactically correct," not "yes this inbox is real." πŸ’…

Email::Find will do some heuristics to dodge the more obvious red herrings and fake addresses, but like… there's only so much you can do without an actual human in the loop. it's doing its best. 🫢


πŸ”₯ METHODS πŸ”₯

new

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

Constructs a brand new Email::Find object. the callback you hand it gets called with each email as they're found. πŸ‘‘

find

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

Finds email addresses in the text and runs that callback you registered.

The callback gets two arguments. first one is a Mail::Address object representing the address found. second one is the actual original email exactly as it appeared in the text. and whatever the callback returns? that replaces the original text. literally whatever. no cap. πŸ’€


🌈 FUNCTIONS 🌈

for backward compatibility (respect the elders), Email::Find exports exactly one function: find_emails(). it works very similar to URI::Find's find_uris(). ✨


πŸ‘‘ 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);

🧚 SUBCLASSING 🧚

if you wanna change how this module finds email addresses, you do it by making your own subclass of Email::Find that overrides the addr_regex and do_validate methods. main character energy fr fr.

for example, the class below can additionally find email addresses with a dot before the at mark. that's illegal in RFC822 btw β€” see Email::Valid::Loose for the 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);
  }

and let's see another one β€” this one validates whether the address actually exists or not, using the Mail::CheckUser module. πŸ¦‹

  package Email::Find::Existent;
  use base qw(Email::Find);
  use Mail::CheckUser qw(check_email);

  sub do_validate {
      my($self, $addr) = @_;
      return check_email($addr) ? $addr : undef;
  }

πŸ’€ CAVEATS πŸ’€

Why a subset of RFC 822?

I say this module finds a subset of RFC 822 because if I attempted to look for all possible valid RFC 822 addresses, I'd wind up practically matching the entire block of text! 😭 the complete specification is so wide open that it's difficult to construct something that isn't an RFC 822 address.

so to keep myself sane, I look for the 'address spec' or 'global address' part of an RFC 822 address. that's the part most people consider to be an email address (the 'foo@bar.com' part) and it's also the part carrying the information necessary for delivery. πŸ’Œ

Why are some of the matches not email addresses?

alas πŸ˜” β€” so many things that aren't email addresses look like email addresses and parse just fine as them. the biggest headache is email and usenet and email message IDs. I do my best to avoid them, but there's only so much cleverness you can pack into one library.


🫢 AUTHORS 🫢

Copyright 2000, 2001 Michael G Schwern <schwern@pobox.com>. All rights reserved.

Current maintainer is Tatsuhiko Miyagawa <miyagawa@bulknews.net>. πŸ‘‘


πŸ’– THANKS πŸ’–

Schwern thanks to Jeremy Howard for his patch to make it work under 5.005. we love a helpful patch. ✨


πŸ“œ LICENSE πŸ“œ

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

The author STRONGLY SUGGESTS that this module not be used for the purposes of sending unsolicited email (ie. spamming) in any way, shape or form or for the purposes of generating lists for commercial sale.
If you use this module for spamming I reserve the right to make fun of you. 😭 (and honestly? deserved.)

⭐ SEE ALSO ⭐

Email::Valid, RFC 822, URI::Find, Apache::AntiSpam, Email::Valid::Loose


and that's the whole page bestie!! πŸŽ€ this little writeup is from perl v5.34.0, dated 2022-06-13 β€” filed under Email::Find(3pm). go find some emails, slay responsibly, and absolutely do not spam. mwah πŸ’…πŸ’œ

πŸ“¦ where this page comes from