Upgrade to Pro — share decks privately, control downloads, hide ads and more …

How I Learned To Stop Worrying and Love Email

How I Learned To Stop Worrying and Love Email

Ready? 250 OK! Everybody loves email, right? Right! What better language than Perl for handling all your email needs? None, right? Right! After all, with about nine hundred email modules on the CPAN, the only question is: which tool is right for the job?

This year, the Perl Email Project is going to tell you what's what. We'll see what modules solve what problems, how they differ, and how they (may or my not) work together.

We'll also show what problems aren't well-solved, what is in the works to make it happen, and how you can help.

Ricardo Signes

June 21, 2007
Tweet

More Decks by Ricardo Signes

Other Decks in Programming

Transcript

  1. PEP

  2. use Email::Simple; my $email = Email::Simple->new($string); use Email::Simple::Creator; my $email

    = Email::Simple->create( header => [ To => ‘[email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’,
  3. use Email::Simple; my $email = Email::Simple->new($string); use Email::Simple::Creator; my $email

    = Email::Simple->create( header => [ To => ‘[email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, Keyword => ‘1099’,
  4. use Email::Simple; my $email = Email::Simple->new($string); use Email::Simple::Creator; my $email

    = Email::Simple->create( header => [ To => ‘[email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, Keyword => ‘1099’, Keyword => ‘1040’,
  5. use Email::Simple; my $email = Email::Simple->new($string); use Email::Simple::Creator; my $email

    = Email::Simple->create( header => [ To => ‘[email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, Keyword => ‘1099’, Keyword => ‘1040’, ],
  6. use Email::Simple; my $email = Email::Simple->new($string); use Email::Simple::Creator; my $email

    = Email::Simple->create( header => [ To => ‘[email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, Keyword => ‘1099’, Keyword => ‘1040’, ], body => “[ insert threatening text here ]”
  7. use Email::Simple; my $email = Email::Simple->new($string); use Email::Simple::Creator; my $email

    = Email::Simple->create( header => [ To => ‘[email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, Keyword => ‘1099’, Keyword => ‘1040’, ], body => “[ insert threatening text here ]” );
  8. use Email::Simple; my $email = Email::Simple->new( \$string ); $email->body_set( \$new_body

    ); use Email::Simple::FromHandle; my $email = Email::SimpleFromHandle->new(
  9. use Email::Simple; my $email = Email::Simple->new( \$string ); $email->body_set( \$new_body

    ); use Email::Simple::FromHandle; my $email = Email::SimpleFromHandle->new( $input_handle
  10. use Email::Simple; my $email = Email::Simple->new( \$string ); $email->body_set( \$new_body

    ); use Email::Simple::FromHandle; my $email = Email::SimpleFromHandle->new( $input_handle );
  11. use Email::Simple; my $email = Email::Simple->new( \$string ); $email->body_set( \$new_body

    ); use Email::Simple::FromHandle; my $email = Email::SimpleFromHandle->new( $input_handle ); $email->stream_to($output_handle);
  12. my $email = Email::MIME->new(\$string); use Email::MIME::Creator; my $email = Email::MIME->create(

    header => [ To => ‘[email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, ], attributes =>
  13. my $email = Email::MIME->new(\$string); use Email::MIME::Creator; my $email = Email::MIME->create(

    header => [ To => ‘[email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, ], attributes => { content_type => ‘multipart/mixed’ },
  14. my $email = Email::MIME->new(\$string); use Email::MIME::Creator; my $email = Email::MIME->create(

    header => [ To => ‘[email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, ], attributes => { content_type => ‘multipart/mixed’ }, parts => [
  15. my $email = Email::MIME->new(\$string); use Email::MIME::Creator; my $email = Email::MIME->create(

    header => [ To => ‘[email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, ], attributes => { content_type => ‘multipart/mixed’ }, parts => [ Email::MIME->create(...),
  16. my $email = Email::MIME->new(\$string); use Email::MIME::Creator; my $email = Email::MIME->create(

    header => [ To => ‘[email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, ], attributes => { content_type => ‘multipart/mixed’ }, parts => [ Email::MIME->create(...), Email::MIME->create(...),
  17. my $email = Email::MIME->new(\$string); use Email::MIME::Creator; my $email = Email::MIME->create(

    header => [ To => ‘[email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, ], attributes => { content_type => ‘multipart/mixed’ }, parts => [ Email::MIME->create(...), Email::MIME->create(...), ],
  18. my $email = Email::MIME->new(\$string); use Email::MIME::Creator; my $email = Email::MIME->create(

    header => [ To => ‘[email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, ], attributes => { content_type => ‘multipart/mixed’ }, parts => [ Email::MIME->create(...), Email::MIME->create(...), ], );
  19. my $entity = MIME::Entity->new($input_handle); my $entity = MIME::Entity->new(\@lines); my $entity

    = MIME::Entity->build( To => ‘[email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’,
  20. my $entity = MIME::Entity->new($input_handle); my $entity = MIME::Entity->new(\@lines); my $entity

    = MIME::Entity->build( To => ‘[email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, ‘Keyword:’ => [ 1099, 1040 ],
  21. my $entity = MIME::Entity->new($input_handle); my $entity = MIME::Entity->new(\@lines); my $entity

    = MIME::Entity->build( To => ‘[email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, ‘Keyword:’ => [ 1099, 1040 ], Data => [ “This might be an audit.” ],
  22. my $entity = MIME::Entity->new($input_handle); my $entity = MIME::Entity->new(\@lines); my $entity

    = MIME::Entity->build( To => ‘[email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, ‘Keyword:’ => [ 1099, 1040 ], Data => [ “This might be an audit.” ], );
  23. my $entity = MIME::Entity->new($input_handle); my $entity = MIME::Entity->new(\@lines); my $entity

    = MIME::Entity->build( To => ‘[email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, ‘Keyword:’ => [ 1099, 1040 ], Data => [ “This might be an audit.” ], ); $entity->attach(
  24. my $entity = MIME::Entity->new($input_handle); my $entity = MIME::Entity->new(\@lines); my $entity

    = MIME::Entity->build( To => ‘[email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, ‘Keyword:’ => [ 1099, 1040 ], Data => [ “This might be an audit.” ], ); $entity->attach( Path => ‘./reports/audit-results.pdf’,
  25. my $entity = MIME::Entity->new($input_handle); my $entity = MIME::Entity->new(\@lines); my $entity

    = MIME::Entity->build( To => ‘[email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, ‘Keyword:’ => [ 1099, 1040 ], Data => [ “This might be an audit.” ], ); $entity->attach( Path => ‘./reports/audit-results.pdf’, Type => ‘application/pdf’,
  26. my $entity = MIME::Entity->new($input_handle); my $entity = MIME::Entity->new(\@lines); my $entity

    = MIME::Entity->build( To => ‘[email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, ‘Keyword:’ => [ 1099, 1040 ], Data => [ “This might be an audit.” ], ); $entity->attach( Path => ‘./reports/audit-results.pdf’, Type => ‘application/pdf’, );
  27. my $mail = Mail::Message->read($input_handle); my $mail = Mail::Message->build( To =>

    [email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, Keyword => 1099,
  28. my $mail = Mail::Message->read($input_handle); my $mail = Mail::Message->build( To =>

    [email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, Keyword => 1099, Keyword => 1040,
  29. my $mail = Mail::Message->read($input_handle); my $mail = Mail::Message->build( To =>

    [email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, Keyword => 1099, Keyword => 1040,
  30. my $mail = Mail::Message->read($input_handle); my $mail = Mail::Message->build( To =>

    [email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, Keyword => 1099, Keyword => 1040, data => “This might be an audit.\n”,
  31. my $mail = Mail::Message->read($input_handle); my $mail = Mail::Message->build( To =>

    [email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, Keyword => 1099, Keyword => 1040, data => “This might be an audit.\n”, file => ‘./reports/audit-results.pdf’,
  32. my $mail = Mail::Message->read($input_handle); my $mail = Mail::Message->build( To =>

    [email protected]’, From => ‘IRS <[email protected]>’, Subject => ‘Please See Me’, Keyword => 1099, Keyword => 1040, data => “This might be an audit.\n”, file => ‘./reports/audit-results.pdf’, );
  33. suggestion learn all of Email::Simple and most of Email::MIME for

    sending your own simple emails, use these
  34. learn the basics of Mail::Message use it if you know

    you’ll need to use more of Mail::Box in the future suggestion
  35. learn the basics of Mail::Message use it if you know

    you’ll need to use more of Mail::Box in the future use it if you have complex encoding or MIME-handling requirements suggestion
  36. learn the basics of handling MIME::Entity messages lots of code

    uses them use MIME::Entity when you need to cope with crappy input that nothing else can parse suggestion
  37. suggestion if you write an API that is passed an

    email message, consider using Abstract
  38. suggestion if you write an API that is passed an

    email message, consider using Abstract if it exists primarily for handling email, pick a more complete library to use, and stick to it.
  39. my $maildir = Mail::Box::Maildir->new folder => ‘./Maildir/’, ); my $message

    = $maildir->message(4); $message->delete; my $newmsg = Mail::Message->new(...);
  40. my $maildir = Mail::Box::Maildir->new folder => ‘./Maildir/’, ); my $message

    = $maildir->message(4); $message->delete; my $newmsg = Mail::Message->new(...);
  41. my $maildir = Mail::Box::Maildir->new folder => ‘./Maildir/’, ); my $message

    = $maildir->message(4); $message->delete; my $newmsg = Mail::Message->new(...); $maildir->addMessage($newmsg);
  42. my $maildir = Mail::Box::Maildir->new folder => ‘./Maildir/’, ); my $message

    = $maildir->message(4); $message->delete; my $newmsg = Mail::Message->new(...); $maildir->addMessage($newmsg);
  43. my $maildir = Mail::Box::Maildir->new folder => ‘./Maildir/’, ); my $message

    = $maildir->message(4); $message->delete; my $newmsg = Mail::Message->new(...); $maildir->addMessage($newmsg); $maildir->write;
  44. suggestion if you need to manage mailboxes, just use it

    there isn’t really any alternative
  45. suggestion if you need to manage mailboxes, just use it

    there isn’t really any alternative unless you count...
  46. use Email::FolderType qw(folder_type); my $type = folder_type(‘./Maildir’); # => ‘Mbox’

    my $type = folder_type(‘./Maildir/’); # => ‘Maildir’ my $type = folder_type(‘./Maildir//’);
  47. use Email::FolderType qw(folder_type); my $type = folder_type(‘./Maildir’); # => ‘Mbox’

    my $type = folder_type(‘./Maildir/’); # => ‘Maildir’ my $type = folder_type(‘./Maildir//’); # => Ezmlm
  48. my $reader = Email::Folder->new(“./Maildir/”); while (my $email = $reader->next_message) {

    print “to delete!” if $email->header(‘from’) =~ /Laura/i;
  49. my $reader = Email::Folder->new(“./Maildir/”); while (my $email = $reader->next_message) {

    print “to delete!” if $email->header(‘from’) =~ /Laura/i; }
  50. my $reader = Email::Folder->new(“./Maildir/”); while (my $email = $reader->next_message) {

    $email->delete if $email->header(‘from’) =~ /Laura/i; } NOT REAL CODE
  51. my $reader = Email::Folder->new(“./Maildir/”); $saw_id{ $_->header(‘message-id’) } = 1 while

    my $_ = $reader->next_message; delete_message( from => “./Maildir”,
  52. my $reader = Email::Folder->new(“./Maildir/”); $saw_id{ $_->header(‘message-id’) } = 1 while

    my $_ = $reader->next_message; delete_message( from => “./Maildir”, matching => sub { my $email = shift;
  53. my $reader = Email::Folder->new(“./Maildir/”); $saw_id{ $_->header(‘message-id’) } = 1 while

    my $_ = $reader->next_message; delete_message( from => “./Maildir”, matching => sub { my $email = shift; $email->header(‘references’)
  54. my $reader = Email::Folder->new(“./Maildir/”); $saw_id{ $_->header(‘message-id’) } = 1 while

    my $_ = $reader->next_message; delete_message( from => “./Maildir”, matching => sub { my $email = shift; $email->header(‘references’) and
  55. my $reader = Email::Folder->new(“./Maildir/”); $saw_id{ $_->header(‘message-id’) } = 1 while

    my $_ = $reader->next_message; delete_message( from => “./Maildir”, matching => sub { my $email = shift; $email->header(‘references’) and ! $saw_id{ $email->header(‘references’) }
  56. my $reader = Email::Folder->new(“./Maildir/”); $saw_id{ $_->header(‘message-id’) } = 1 while

    my $_ = $reader->next_message; delete_message( from => “./Maildir”, matching => sub { my $email = shift; $email->header(‘references’) and ! $saw_id{ $email->header(‘references’) } },
  57. my $reader = Email::Folder->new(“./Maildir/”); $saw_id{ $_->header(‘message-id’) } = 1 while

    my $_ = $reader->next_message; delete_message( from => “./Maildir”, matching => sub { my $email = shift; $email->header(‘references’) and ! $saw_id{ $email->header(‘references’) } }, );
  58. my $reader = Email::Folder->new(“./Maildir/”); $saw_id{ $_->header(‘message-id’) } = 1 while

    my $_ = $reader->next_message; delete_message( from => “./Maildir”, matching => sub { my $email = shift; $email->header(‘references’) and ! $saw_id{ $email->header(‘references’) } }, );
  59. my $mailer = Mail::Mailer->new(‘sendmail’); $mailer->open({ To => [ ‘boss@corp’, ‘boss2@corp’

    ], Bcc => ‘the.ceo@corp’, Subject => ‘u sux’, }); print $mailer "Body of message";
  60. my $mailer = Mail::Mailer->new(‘sendmail’); $mailer->open({ To => [ ‘boss@corp’, ‘boss2@corp’

    ], Bcc => ‘the.ceo@corp’, Subject => ‘u sux’, }); print $mailer "Body of message";
  61. my $mailer = Mail::Mailer->new(‘sendmail’); $mailer->open({ To => [ ‘boss@corp’, ‘boss2@corp’

    ], Bcc => ‘the.ceo@corp’, Subject => ‘u sux’, }); print $mailer "Body of message"; $mailer->close;
  62. my $mailer = Mail::Mailer->new(‘sendmail’); $mailer->open({ To => [ ‘boss@corp’, ‘boss2@corp’

    ], Bcc => ‘the.ceo@corp’, Subject => ‘u sux’, }); print $mailer "Body of message"; $mailer->close; # ...and it gets sent
  63. my $sender = Mail::Sender->new({ smtp => ‘smtp.haliburton.gov’, }); $sender->Open({ from

    => '[email protected]', to => '[email protected]', subject => 'HTML test', ctype => "text/html", encoding => "7bit" }) or die $Mail::Sender::Error,"\n"; while (<$input>) { $sender->SendEx($_); # no encoding! }; $sender->Close();
  64. use Mail::Sendmail; sendmail( To => ‘[email protected]’, From => ‘[email protected]’, Subject

    => ‘STFU’, Body => $entire_message_body, ) or die “sendmail: $Mail::Sendmail::error”;
  65. my $sender = Mail::Transport::SMTP->new( hostname => ‘nebu.fleet.zion.gov’, username => ‘[email protected]’,

    password => ‘viagra’, ); $sender->send( $message, from => $env_sender, to => $env_rcpt,
  66. my $sender = Mail::Transport::SMTP->new( hostname => ‘nebu.fleet.zion.gov’, username => ‘[email protected]’,

    password => ‘viagra’, ); $sender->send( $message, from => $env_sender, to => $env_rcpt, );
  67. my $sender = Email::Send->new({ mailer => ‘SMTP’, mailer_args => [

    Host => ‘sir-mx-a-lot.plusplus.com’, username => ‘rjbs’,
  68. my $sender = Email::Send->new({ mailer => ‘SMTP’, mailer_args => [

    Host => ‘sir-mx-a-lot.plusplus.com’, username => ‘rjbs’, password => ‘g0t b4ckUPS’,
  69. my $sender = Email::Send->new({ mailer => ‘SMTP’, mailer_args => [

    Host => ‘sir-mx-a-lot.plusplus.com’, username => ‘rjbs’, password => ‘g0t b4ckUPS’, ],
  70. my $sender = Email::Send->new({ mailer => ‘SMTP’, mailer_args => [

    Host => ‘sir-mx-a-lot.plusplus.com’, username => ‘rjbs’, password => ‘g0t b4ckUPS’, ], });
  71. my $sender = Email::Send->new({ mailer => ‘SMTP’, mailer_args => [

    Host => ‘sir-mx-a-lot.plusplus.com’, username => ‘rjbs’, password => ‘g0t b4ckUPS’, ], });
  72. my $sender = Email::Send->new({ mailer => ‘SMTP’, mailer_args => [

    Host => ‘sir-mx-a-lot.plusplus.com’, username => ‘rjbs’, password => ‘g0t b4ckUPS’, ], }); my $rv = $sender->send($email);
  73. my $sender = Email::Send->new({ mailer => ‘SMTP’, mailer_args => [

    Host => ‘sir-mx-a-lot.plusplus.com’, username => ‘rjbs’, password => ‘g0t b4ckUPS’, ], }); my $rv = $sender->send($email);
  74. my $sender = Email::Send->new({ mailer => ‘SMTP’, mailer_args => [

    Host => ‘sir-mx-a-lot.plusplus.com’, username => ‘rjbs’, password => ‘g0t b4ckUPS’, ], }); my $rv = $sender->send($email); unless ($rv) {
  75. my $sender = Email::Send->new({ mailer => ‘SMTP’, mailer_args => [

    Host => ‘sir-mx-a-lot.plusplus.com’, username => ‘rjbs’, password => ‘g0t b4ckUPS’, ], }); my $rv = $sender->send($email); unless ($rv) { die “failed to send: “ . $rv->string;
  76. my $sender = Email::Send->new({ mailer => ‘SMTP’, mailer_args => [

    Host => ‘sir-mx-a-lot.plusplus.com’, username => ‘rjbs’, password => ‘g0t b4ckUPS’, ], }); my $rv = $sender->send($email); unless ($rv) { die “failed to send: “ . $rv->string; }
  77. problems Return::Value no envelope sender awkward mailer/sender distinction difficult to

    extend api not enough API guaranteed for interchangeability
  78. my $sender = Email::Sender::SMTP->new({ host => ‘sir-mx-a-lot.plusplus.com’, user => ‘rjbs’,

    pass => ‘wishiwereanoscarmeyerweiner’, }); $sender->send( $email,
  79. my $sender = Email::Sender::SMTP->new({ host => ‘sir-mx-a-lot.plusplus.com’, user => ‘rjbs’,

    pass => ‘wishiwereanoscarmeyerweiner’, }); $sender->send( $email, {
  80. my $sender = Email::Sender::SMTP->new({ host => ‘sir-mx-a-lot.plusplus.com’, user => ‘rjbs’,

    pass => ‘wishiwereanoscarmeyerweiner’, }); $sender->send( $email, { to => $env_rcpt, # or \@env_rcpts
  81. my $sender = Email::Sender::SMTP->new({ host => ‘sir-mx-a-lot.plusplus.com’, user => ‘rjbs’,

    pass => ‘wishiwereanoscarmeyerweiner’, }); $sender->send( $email, { to => $env_rcpt, # or \@env_rcpts from => $env_sender,
  82. my $sender = Email::Sender::SMTP->new({ host => ‘sir-mx-a-lot.plusplus.com’, user => ‘rjbs’,

    pass => ‘wishiwereanoscarmeyerweiner’, }); $sender->send( $email, { to => $env_rcpt, # or \@env_rcpts from => $env_sender, }
  83. my $sender = Email::Sender::SMTP->new({ host => ‘sir-mx-a-lot.plusplus.com’, user => ‘rjbs’,

    pass => ‘wishiwereanoscarmeyerweiner’, }); $sender->send( $email, { to => $env_rcpt, # or \@env_rcpts from => $env_sender, } );
  84. key differences Mail::Audit does more Mail::Audit is > 4x the

    size Mail::Audit is totally insane Mail::Audit is better tested
  85. Mail::Procmail It’s like Mail::Audit but exports a bunch of subs

    can be made into a E::F plugin built-in logging
  86. Mail::Sort It’s like Mail::Audit but has lots more methods mostly

    for common matches could be some E::F plugins
  87. Email::Valid address is well-formed domain name is valid domain is

    fqdn in a tld domain actually exists some per-domain rules some fudging allowed
  88. Email::Stuff ->from('Principal Skinner <[email protected]>') ->to('[email protected]') ->text_body(“Please see me after class.”)

    ->header(Keywords => “trouble”) ->header(Keywords => “deep”) ->attach( slurp(‘1099.pdf’),
  89. Email::Stuff ->from('Principal Skinner <[email protected]>') ->to('[email protected]') ->text_body(“Please see me after class.”)

    ->header(Keywords => “trouble”) ->header(Keywords => “deep”) ->attach( slurp(‘1099.pdf’), filename => 'dead_bunbun_proof.gif')
  90. Email::Stuff ->from('Principal Skinner <[email protected]>') ->to('[email protected]') ->text_body(“Please see me after class.”)

    ->header(Keywords => “trouble”) ->header(Keywords => “deep”) ->attach( slurp(‘1099.pdf’), filename => 'dead_bunbun_proof.gif') ->send;
  91. use Email::MIME::CreateHTML; my $email = Email::MIME->create_html( header => [ to

    => ‘[email protected]’, from => ‘[email protected]’, subject => ‘Happy Birthday!’, ], body => $html,
  92. use Email::MIME::CreateHTML; my $email = Email::MIME->create_html( header => [ to

    => ‘[email protected]’, from => ‘[email protected]’, subject => ‘Happy Birthday!’, ], body => $html, );
  93. use Email::MIME::CreateHTML; my $email = Email::MIME->create_html( header => [ to

    => ‘[email protected]’, from => ‘[email protected]’, subject => ‘Happy Birthday!’, ], body => $html, text_body => $text, );
  94. my $markdown = slurp(STDIN); use Email::MIME::CreateHTML; my $email = Email::MIME->create_html(

    header => [ to => ‘[email protected]’, from => ‘[email protected]’, subject => ‘Happy Birthday!’, ], body => markdown($markdown), text_body => $markdown, );
  95. use Email::MIME::XPath; my ($part) = $email->xpath_findnodes(“//plain”); my @images = $email->xpath_findnodes(

    “//png|//jpeg|//gif” ); my $address = $part->xpath_address; die “error in part $address!”;
  96. addressbook = App::Addex::AddressBook::Apple output = App::Addex::Output::Mutt output = App::Addex::Output::Procmail output

    = App::Addex::Output::SpamAssassin [App::Addex::Output::Mutt] filename = mutt/alias-abook
  97. addressbook = App::Addex::AddressBook::Apple output = App::Addex::Output::Mutt output = App::Addex::Output::Procmail output

    = App::Addex::Output::SpamAssassin [App::Addex::Output::Mutt] filename = mutt/alias-abook
  98. addressbook = App::Addex::AddressBook::Apple output = App::Addex::Output::Mutt output = App::Addex::Output::Procmail output

    = App::Addex::Output::SpamAssassin [App::Addex::Output::Mutt] filename = mutt/alias-abook [App::Addex::Output::Procmail]
  99. addressbook = App::Addex::AddressBook::Apple output = App::Addex::Output::Mutt output = App::Addex::Output::Procmail output

    = App::Addex::Output::SpamAssassin [App::Addex::Output::Mutt] filename = mutt/alias-abook [App::Addex::Output::Procmail] filename = procmail/friends.rc
  100. addressbook = App::Addex::AddressBook::Apple output = App::Addex::Output::Mutt output = App::Addex::Output::Procmail output

    = App::Addex::Output::SpamAssassin [App::Addex::Output::Mutt] filename = mutt/alias-abook [App::Addex::Output::Procmail] filename = procmail/friends.rc
  101. addressbook = App::Addex::AddressBook::Apple output = App::Addex::Output::Mutt output = App::Addex::Output::Procmail output

    = App::Addex::Output::SpamAssassin [App::Addex::Output::Mutt] filename = mutt/alias-abook [App::Addex::Output::Procmail] filename = procmail/friends.rc [App::Addex::Output::SpamAssassin]
  102. addressbook = App::Addex::AddressBook::Apple output = App::Addex::Output::Mutt output = App::Addex::Output::Procmail output

    = App::Addex::Output::SpamAssassin [App::Addex::Output::Mutt] filename = mutt/alias-abook [App::Addex::Output::Procmail] filename = procmail/friends.rc [App::Addex::Output::SpamAssassin] filename = spamassassin/whitelists-abook
  103. addressbook = App::Addex::AddressBook::Apple output = App::Addex::Output::Mutt output = App::Addex::Output::Procmail output

    = App::Addex::Output::SpamAssassin [App::Addex::Output::Mutt] filename = mutt/alias-abook [App::Addex::Output::Procmail] filename = procmail/friends.rc [App::Addex::Output::SpamAssassin] filename = spamassassin/whitelists-abook
  104. addressbook = App::Addex::AddressBook::Apple output = App::Addex::Output::Mutt output = App::Addex::Output::Procmail output

    = App::Addex::Output::SpamAssassin [App::Addex::Output::Mutt] filename = mutt/alias-abook [App::Addex::Output::Procmail] filename = procmail/friends.rc [App::Addex::Output::SpamAssassin] filename = spamassassin/whitelists-abook
  105. alias mollymillions [email protected] (Molly Millions) alias mollymillions-home [email protected] (Molly Millions)

    alias mollymillions-work [email protected] (Molly Millions) alias mollymillions-work-1 [email protected] (Molly Millions) mailboxes =friends.molly
  106. alias mollymillions [email protected] (Molly Millions) alias mollymillions-home [email protected] (Molly Millions)

    alias mollymillions-work [email protected] (Molly Millions) alias mollymillions-work-1 [email protected] (Molly Millions) mailboxes =friends.molly save-hook [email protected] =friends.molly save-hook [email protected] =friends.molly save-hook [email protected] =friends.molly
  107. alias mollymillions [email protected] (Molly Millions) alias mollymillions-home [email protected] (Molly Millions)

    alias mollymillions-work [email protected] (Molly Millions) alias mollymillions-work-1 [email protected] (Molly Millions) send-hook [email protected] set signature="~/.sig/ninja" send-hook [email protected] set signature="~/.sig/ninja" send-hook [email protected] set signature="~/.sig/ ninja" mailboxes =friends.molly save-hook [email protected] =friends.molly save-hook [email protected] =friends.molly save-hook [email protected] =friends.molly