]> git.donarmstrong.com Git - bin.git/blobdiff - delay_mail
fix message-id regex
[bin.git] / delay_mail
index c7d1799cda10b51b2af00d920814b818731ed51e..9b5ef44c74af5815812f9a283ef8fe915bc91eb8 100755 (executable)
@@ -49,9 +49,12 @@ The delay option is actually an email address; apply the following
 regex to parse it:
 
     $delay =~ m/[+-]d(?:ela?y?)?[-+]([^\@]+)/;
-    $delay = $1; $delay =~ s/_/ /;
+    $delay = $1;
+    $delay =~ s/_/ /g;
+    $delay =~ s/=/:/g;
 
-Thus, foo-delay-now+5_min@bar.baz becomes now+5 min
+Thus, foo-delay-now+5_min@bar.baz becomes now+5 min and
+foo-del+00=30=00@bar.baz becomes 00:30:00
 
 =item B<--list>
 
@@ -156,32 +159,35 @@ if (exists $options{enqueue}) {
      $delay =~ s/\n//g;
      if ($options{email}) {
          $delay =~ m/[+-]d(?:ela?y?)?[-+]([^\@]+)/;
-         $delay = $1; $delay =~ s/_/ /;
+         $delay = $1;
+         $delay =~ s/_/ /g;
+         $delay =~ s/=/:/g;
      }
      # slurp email
      local $/;
      my $email = <STDIN>;
      # rip subject out of email
      # we cheat for now; this isn't correct at all.
-     my ($subject) = $email =~ /^Subject:\s*(.+)/i;
+     my ($subject) = $email =~ /^Subject:\s*(.+)/mi;
      $subject = decode_rfc1522($subject);
      $subject =~ s/\n//g;
+     my $time = time;
      # create a queue entry
-     my $queue_fn = time . $$;
+     my $queue_fn = $time . $$;
      my $q_fh = IO::File->new("$options{queue}/$queue_fn",'w') or
          die "Unable to open $options{queue}/$queue_fn for writing";
      print {$q_fh} "delay: $delay\n";
+     print {$q_fh} "time: $time\n";
      print {$q_fh} "mailto: $options{mailto}\n";
      print {$q_fh} "entry: $queue_fn\n";
      print {$q_fh} "subject: $subject\n";
      print {$q_fh} "#####\n";
      print {$q_fh} $email;
      my $at_fh;
-     open($at_fh,'|-','at',$delay) or exit 1;
+     my $pid = open($at_fh,'|-','at',$delay) or exit 1;
      print {$at_fh} "$0 '--queue' '$options{queue}' '--process' '$queue_fn';\n";
-     close $at_fh;
-     waitpid(-1,0);
-     exit $?;
+     close $at_fh or exit $?;
+     exit 0;
 }
 elsif ($options{list}) {
      my $dir = IO::Dir->new($options{queue}) or
@@ -194,11 +200,13 @@ elsif ($options{list}) {
          last if not defined $entry;
          next if $entry !~ /^\d+$/;
          # they're also just readable files
-         next if not -f $entry or not -r $entry;
+         next if not -f "$options{queue}/$entry" or not -r "$options{queue}/$entry";
+         print STDERR "Still dealing with $entry\n" if $DEBUG;
          push @queue,parse_queue_entry($entry);
      }
      for my $q_e (@queue) {
-         print "$q_e->{entry}: send $q_e->{subject} to $q_e->{mailto} at $q_e->{delay}\n";
+         $q_e->{time} ||='';
+         print "$q_e->{entry}: send $q_e->{subject} to $q_e->{mailto} at $q_e->{delay} ($q_e->{time})\n";
      }
 }
 elsif ($options{dequeue}) {
@@ -211,18 +219,17 @@ elsif ($options{dequeue}) {
      }
 }
 elsif ($options{process}) {
-     my $q_e;
      if (-e "$options{queue}/$options{process}") {
          my $q_e = parse_queue_entry($options{process});
          if (not defined $q_e) {
               die "Unable to parse $options{process}";
          }
          # munge the message id
-         my ($message_id) = $q_e->{email} =~ m/^Message-Id:\s*(.+)/;
+         my ($message_id) = $q_e->{email} =~ m/^Message-Id:\s*(.+)/mi;
          if (not $message_id =~ s/\@/delay$q_e->{entry}@/){
               $message_id =~ s/(\w)/delay$q_e->{entry}$1/;
          }
-         $q_e->{email} =~ s/^(Message-Id:\s*)(.+)/$1$message_id/;
+         $q_e->{email} =~ s/^(Message-Id:\s*)(.+)/$1$message_id/mi;
          # send the message
          my $sendmail_fh;
          open($sendmail_fh,'|-','/usr/sbin/sendmail',$q_e->{mailto}) or