+syntax '"nickname"!' to force $name to be 'nickname'
[PerlMail.git] / perlmail-accept
index 9ba5cf5..9cea4a8 100755 (executable)
@@ -75,6 +75,7 @@ our $procmailFROM_MAILER=qr'^(((Resent-)?(From|Sender)|X-Envelope-From):|>?From
 my $opt_mode;
 my $opt_smstest;       # 1 or $smscount
 my $opt_idle;
+my $opt_dry;
 
 
 sub process;
@@ -431,10 +432,9 @@ sub smssend
 {
 my($ignorenewmail,$smscount,%args)=@_;
 
-       my %aliases=muttrc_aliases();
        my $text=audit_sms(
                        "subject"=>unmime($Audit->subject()),
-                       "from"=>[ map({ $_=$_->address(); $_="\L$_"; $aliases{$_} || $_; } Mail::Address->parse(unmime($Audit->from()))) ],
+                       "from"=>[ Mail::Address->parse(unmime($Audit->from())) ],
                        "body"=>substr(body_simple(),0,$MaxBodySMS*(1+0.25*$smscount)),
                        %args);
        my $texthead="";
@@ -526,15 +526,16 @@ my($folder,$profile,%args)=@_;
 
        $profile=$store_profile if !$profile;
        my %do=map({ (!/=/ ? ($_=>1) : ($`=>$')); } profile_eval($profile));
-       Sys::Syslog::syslog("info","%s%s: %s: %s",
+       Sys::Syslog::syslog("info","%s%s%s: %s: %s",
+                                       (!$opt_dry ? "" : "--dry: "),
                                        (!$store_ignore ? "" : "IGNORED[$store_ignore]: "),
                                        map({ cut($_); } $folder,address_show(unmime($Audit->from())),unmime($Audit->subject())),
                                        )
-                       if $do{"syslog"};
+                       if $do{"syslog"} || $opt_dry;
        $folder=~s/;.*$//s;
        $folder="$Mail/".$' if $folder=~/^=/;
        push @AuditStored,$folder if $do{"did"};
-       return if $store_ignore;
+       return if $store_ignore || $opt_dry;
        $DoBell++ if $do{"bell"};
        write_message($folder);
        smssend_tryall $store_ignorenewmail,$do{"sms"},%args if $do{"sms"};
@@ -559,6 +560,7 @@ sub write_message
 {
 my($folder)=@_;
 
+       return if $opt_dry;
        local *F;
        open F,">>$folder" or do { warn "Append \"$folder\": $!"; return 0; };
        {
@@ -636,7 +638,8 @@ sub Received_for
                my($for)=($hdr=~/\bfor\s+\<?(\S+)\>?\b/);
                return $for if !wantarray();
                push @r,$for if $for;
-               my($from,$fromaddr)=($hdr=~/\bfrom\s+(\S+)\b.*?\[((?:\d{1,3}\.){3}\d{1,3})\]/);
+               my($from,$fromaddr)=($hdr=~/\bfrom\s+(?:(\S+)\b.*?)??\[((?:\d{1,3}\.){3}\d{1,3})\]/);
+               $from=$fromaddr if !defined $from;
                push @r,"$from:$fromaddr" if $from;
                }
        return @r;
@@ -742,7 +745,7 @@ sub muttrc_aliases
                for my $addrobj (Mail::Address->parse($')) {
                        my $addr=$addrobj->address();
                        my $ref=\$r{"\L$addr"};
-                       $$ref=$key;     # use always the last occurence to prefer nicks
+                       $$ref=$key if !$$ref;   # use always the first occurence to prefer nicks
                        }
                }
        return %r;
@@ -866,6 +869,7 @@ $Getopt::Long::ignorecase=0;
 die "GetOptions error" if !Getopt::Long::GetOptions(
                  "inetd"    ,sub { $opt_mode=\&inetd; },
                  "stdin"    ,sub { $opt_mode=\&stdin; },
+                 "dry"      ,\$opt_dry,
                  "smstest:s",sub { $opt_mode=\&stdin; $opt_smstest=($_[1] || 1); },
                  "idle!"    ,\$opt_idle,
                  "idletest" ,sub { syslogging_restore(); print((defined($_=useridle()) ? $_ : "<undef>")."\n"); exit 0; },