* lynx (for converting HTML messages to text)
* Perl and several modules: (Debian package name)
- Date::Parse libtimedate-perl
- - Email::Address libemail-address-perl
- Email::Filter libemail-filter-perl
- Email::MIME libemail-mime-perl
- Email::MIME::ContentType libemail-mime-contenttype-perl
# We also depend on git.
# Keep this sorted and synced to the INSTALL document
'Date::Parse' => 0,
- 'Email::Address' => 0,
'Email::Filter' => 0,
'Email::MIME' => 0,
'Email::MIME::ContentType' => 0,
--- /dev/null
+# Copyright (C) 2016 all contributors <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
+package PublicInbox::Address;
+use strict;
+use warnings;
+
+# very loose regexes, here. We don't need RFC-compliance,
+# just enough to make thing sanely displayable and pass to git
+
+sub emails { ($_[0] =~ /([^<\s]+\@[^>\s]+)/g) }
+
+sub from_name {
+ my ($val) = @_;
+ my $name = $val;
+ $name =~ s/\s*\S+\@\S+\s*\z//;
+ if ($name !~ /\S/ || $name =~ /[<>]/) { # git does not like [<>]
+ ($name) = emails($val);
+ $name =~ s/\@.*//;
+ }
+ $name =~ tr/\r\n\t/ /;
+ $name =~ s/\A\s*//;
+ $name;
+}
+
+1;
package PublicInbox::Feed;
use strict;
use warnings;
-use Email::Address;
use Email::MIME;
use Date::Parse qw(strptime);
use PublicInbox::Hval qw/ascii_html/;
use PublicInbox::Git;
use PublicInbox::View;
use PublicInbox::MID qw/mid_clean mid2path/;
+use PublicInbox::Address;
use POSIX qw/strftime/;
use constant {
DATEFMT => '%Y-%m-%dT%H:%M:%SZ', # Atom standard
sub end_feed {
my ($fh) = @_;
- Email::Address->purge_cache;
$fh->write('</feed>');
$fh->close;
}
PublicInbox::View::index_entry($mime, 0, $state);
1;
});
- Email::Address->purge_cache;
$last;
}
$title = title_tag($title);
my $from = $header_obj->header('From') or return 0;
- my @from = Email::Address->parse($from) or return 0;
- my $name = ascii_html($from[0]->name);
- my $email = $from[0]->address;
+ my ($email) = PublicInbox::Address::emails($from);
+ my $name = PublicInbox::Address::from_name($from);
+ $name = ascii_html($name);
$email = ascii_html($email);
if (delete $feed_opts->{emit_header}) {
use strict;
use warnings;
use Fcntl qw(:flock :DEFAULT);
-use Email::Address;
use PublicInbox::Spawn qw(spawn);
use PublicInbox::MID qw(mid_mime mid2path);
my ($self, $mime) = @_; # mime = Email::MIME
my $from = $mime->header('From');
- my @from = Email::Address->parse($from);
- my $name = $from[0]->name;
- my $email = $from[0]->address;
- my $date = $mime->header('Date');
- my $subject = $mime->header('Subject');
- $subject = '(no subject)' unless defined $subject;
- my $mid = mid_mime($mime);
- my $path = mid2path($mid);
-
+ my ($email) = ($from =~ /([^<\s]+\@[^>\s]+)/g);
+ my $name = $from;
+ $name =~ s/\s*\S+\@\S+\s*\z//;
# git gets confused with:
# "'A U Thor <u@example.com>' via foo" <foo@example.com>
# ref:
# <CAD0k6qSUYANxbjjbE4jTW4EeVwOYgBD=bXkSu=akiYC_CB7Ffw@mail.gmail.com>
$name =~ tr/<>// and $name = $email;
+ my $date = $mime->header('Date');
+ my $subject = $mime->header('Subject');
+ $subject = '(no subject)' unless defined $subject;
+ my $mid = mid_mime($mime);
+ my $path = mid2path($mid);
+
my ($r, $w) = $self->gfi_start;
my $tip = $self->{tip};
if ($tip ne '') {
use strict;
use warnings;
use Email::Simple;
-use Email::Address;
use Date::Parse qw(strptime);
use constant MAX_SIZE => 1024 * 500; # same as spamc default, should be tunable
use constant MAX_MID_SIZE => 244; # max term size - 1 in Xapian
my @address = ref($address) eq 'ARRAY' ? @$address : ($address);
my %ok = map {
- my @recip = Email::Address->parse($_);
- lc(__drop_plus($recip[0]->address)) => 1;
+ lc(__drop_plus($_)) => 1;
} @address;
foreach my $line ($filter->cc, $filter->to) {
- foreach my $addr (Email::Address->parse($line)) {
- if ($ok{lc(__drop_plus($addr->address))}) {
+ my @addrs = ($line =~ /([^<\s]+\@[^>\s]+)/g);
+ foreach my $addr (@addrs) {
+ if ($ok{lc(__drop_plus($addr))}) {
return 1;
}
}
use strict;
use warnings;
use Search::Xapian;
-use Email::Address qw//;
use POSIX qw//;
use Date::Parse qw/str2time/;
use PublicInbox::MID qw/mid_clean/;
+use PublicInbox::Address;
use Encode qw/find_encoding/;
my $enc_utf8 = find_encoding('UTF-8');
our $PFX2TERM_RE = undef;
my ($self) = @_;
my $from = __hdr($self, 'from');
if (defined $from && !defined $self->{from_name}) {
- $from =~ tr/\t\r\n/ /;
- my @from = Email::Address->parse($from);
- $self->{from_name} = $from[0]->name;
+ $self->{from_name} = PublicInbox::Address::from_name($from);
}
$from;
}
$ctx->{searchview} = 1;
tdump_ent($git, $state, $_, 0) for @rootset;
PublicInbox::View::thread_adj_level($state, 0);
- Email::Address->purge_cache;
$fh->write(search_nav_bot($mset, $q). "\n\n" .
foot($ctx). '</pre></body></html>');
use PublicInbox::Linkify;
use PublicInbox::MID qw/mid_clean id_compress mid2path mid_mime/;
use PublicInbox::MsgIter;
+use PublicInbox::Address;
require POSIX;
use constant INDENT => ' ';
$seen->{$id} = "#$id"; # save the anchor for children, later
my $mid = PublicInbox::Hval->new_msgid($mid_raw);
- my $from = $hdr->header('From');
- my @from = Email::Address->parse($from);
- $from = $from[0]->name;
+ my $from = PublicInbox::Address::from_name($hdr->header('From'));
my $root_anchor = $state->{root_anchor} || '';
my $path = $root_anchor ? '../../' : '';
('</ul></li>' x ($max - 1)) . '</ul>');
}
}
- Email::Address->purge_cache;
# there could be a race due to a message being deleted in git
# but still being in the Xapian index:
$v = PublicInbox::Hval->new($v);
if ($h eq 'From') {
- my @from = Email::Address->parse($v->raw);
- $title[1] = ascii_html($from[0]->name);
+ $title[1] = PublicInbox::Address::from_name($v->raw);
} elsif ($h eq 'Subject') {
$title[0] = $v->as_html;
if ($srch) {
foreach my $h (qw(From To Cc)) {
my $v = $hdr->header($h);
defined($v) && ($v ne '') or next;
- my @addrs = Email::Address->parse($v);
- foreach my $recip (@addrs) {
- my $address = $recip->address;
+ my @addrs = PublicInbox::Address::emails($v);
+ foreach my $address (@addrs) {
my $dst = lc($address);
$cc{$dst} ||= $address;
$to ||= $dst;
}
}
- Email::Address->purge_cache;
my @arg;
my $subj = $hdr->header('Subject') || '';
use PublicInbox::Git;
use PublicInbox::Import;
use Email::MIME;
-use Email::Address;
+use PublicInbox::Address;
use IPC::Run qw/run/;
my $train = shift or die "usage: $usage\n";
if ($train !~ /\A(?:ham|spam)\z/) {
# get all recipients
my %dests;
foreach my $h (qw(Cc To)) {
- foreach my $recipient (Email::Address->parse($mime->header($h))) {
- $dests{lc($recipient->address)} = 1;
+ my $val = $mime->header($h) or next;
+ foreach my $email (PublicInbox::Address::emails($val)) {
+ $dests{lc($email)} = 1;
}
}
use Email::Filter;
use Email::MIME;
-use Email::Address;
use File::Path::Expand qw/expand_filename/;
use IPC::Run qw(run);
use PublicInbox::MDA;
local $ENV{GIT_COMMITTER_NAME} = eval {
use PublicInbox::MDA;
+ use PublicInbox::Address;
use Encode qw/encode/;
my $mbox = 't/utf8.mbox';
open(my $fh, '<', $mbox) or die "failed to open mbox: $mbox\n";
$msg = Email::MIME->new($msg->simple->as_string);
my $from = $msg->header('From');
- my @from = Email::Address->parse($from);
- my $author = $from[0]->name;
- my $email = $from[0]->address;
- my $date = $msg ->header('Date');
+ my $author = PublicInbox::Address::from_name($from);
+ my ($email) = PublicInbox::Address::emails($from);
+ my $date = $msg->header('Date');
is('Eléanor',
encode('us-ascii', my $tmp = $author, Encode::HTMLCREF),