Created
July 1, 2015 07:02
-
-
Save komeda-shinji/f0515dbbc0c48a3b3afe to your computer and use it in GitHub Desktop.
forward mail body part only
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/perl | |
| use Getopt::Long; | |
| $TRUNCATE_AT = 32000; | |
| $OMIT_RECEIVED = 1; | |
| $OMIT_MESSAGE_ID = 0; | |
| $OMIT_RESENT_ANY = 0; | |
| @char64 = ( | |
| -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, | |
| -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, | |
| -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63, | |
| 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1,-1,-1,-1, | |
| -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14, | |
| 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1, | |
| -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, | |
| 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1 | |
| ); | |
| sub decode_b($) | |
| { | |
| my @char = split(//, shift); | |
| my $buf = ""; | |
| while ($#char >= 0) { | |
| $c1 = shift(@char); | |
| $c2 = shift(@char); | |
| $c3 = shift(@char); | |
| $c4 = shift(@char); | |
| $c1 = $char64[ord($c1)]; | |
| $c2 = $char64[ord($c2)]; | |
| $ch = (($c1<<2) | (($c2&0x30)>>4)); | |
| $buf .= sprintf('%c', $ch); | |
| if ($c3 ne "=") { | |
| $c3 = $char64[ord($c3)]; | |
| $ch = ((($c2&0x0f) << 4) | (($c3&0x3c) >> 2)); | |
| $buf .= sprintf('%c', $ch); | |
| if ($c4 ne "=") { | |
| $c4 = $char64[ord($c4)]; | |
| $ch = ((($c3&0x03) <<6) | $c4); | |
| $buf .= sprintf('%c', $ch); | |
| } | |
| } | |
| } | |
| return $buf; | |
| } | |
| sub decode_qp ($) | |
| { | |
| my $res = shift; | |
| $res =~ s/=([\da-fA-F]{2})/pack("C", hex($1))/ge; | |
| $res; | |
| } | |
| sub decode_mime($$) | |
| { | |
| my $type = shift; | |
| my $encoded = shift; | |
| if ($type =~ /[Bb]/) { | |
| return decode_b($encoded); | |
| } elsif ($type =~ /[Qq]/) { | |
| return decode_qp($encoded); | |
| } | |
| } | |
| sub decode_header($) | |
| { | |
| my $buf = ""; | |
| my $post; | |
| foreach (split(/\s+/, shift)) { | |
| s/=\?ISO-2022-JP\?([BQ])\?([^?]*)\?=/decode_mime($1,$2)/ieg; | |
| $buf .= "$_ "; | |
| } | |
| $buf =~ s/\s+$//; | |
| return $buf; | |
| } | |
| sub process_header() | |
| { | |
| my($OMIT) = 0; | |
| while(<STDIN>) { | |
| last if (/^$/); | |
| if (/^From /i) { | |
| $field = "UNIX From"; | |
| $OMIT = 0; | |
| } elsif (/^(\S+): /) { | |
| $field = $1; | |
| $field =~ tr/a-z/A-Z/; | |
| if ($field eq "RECEIVED") { | |
| $OMIT = $OMIT_RECEIVED; | |
| } elsif ($field eq "MESSAGE-ID") { | |
| $OMIT = $OMIT_MESSAGE_ID; | |
| } elsif ($field eq "FROM") { | |
| if ($REPLACE_FROM) { | |
| $OMIT = 1; | |
| $HEADER .= "$REPLACE_FROM\n"; | |
| $REPLACE_FROM = undef; | |
| } else { | |
| $OMIT = 0; | |
| } | |
| } elsif ($field eq "SENDER") { | |
| if ($REPLACE_SENDER) { | |
| $OMIT = 1; | |
| $HEADER .= "$REPLACE_SENDER\n"; | |
| $REPLACE_SENDER = undef; | |
| } else { | |
| $OMIT = 0; | |
| } | |
| } elsif ($field eq "ERRORS-TO") { | |
| if ($REPLACE_ERRORS_TO) { | |
| $OMIT = 1; | |
| $HEADER .= "$REPLACE_ERRORS_TO\n"; | |
| $REPLACE_ERRORS_TO = undef; | |
| } else { | |
| $OMIT = 0; | |
| } | |
| } elsif ($field eq "CONTENT-TYPE") { | |
| $OMIT = 1; | |
| } elsif ($field =~ /^RESENT-/i) { | |
| $OMIT = $OMIT_RESENT_ANY; | |
| } elsif ($field eq "X-OPENMAIL-HOPS") { | |
| $CANDY_HACK = 1; | |
| } elsif ($field eq "X-MAILER" && /ccMail/) { | |
| $CCMAIL = 1; | |
| } else { | |
| $OMIT = 0; | |
| } | |
| } | |
| $HEADER{$field} .= $_; | |
| if (!$OMIT) { | |
| $HEADER .= "$_"; | |
| } | |
| } | |
| if ($_ = $HEADER{"MIME-VERSION"}) { | |
| /^MIME-Version:\s+(\d[\d\.]+)/i; | |
| $MIME_VERSION = $1; | |
| } | |
| if ($_ = $HEADER{"CONTENT-TYPE"}) { | |
| if (/^Content-Type:\s+([^;\s]+)/i) { | |
| $MIME_TYPE = lc($1); | |
| } | |
| if (/boundary=\"([^\"]*)\"/i || /boundary=(\S+)/i) { | |
| $BOUNDARY = $1; | |
| $BOUNDARY_LEN = length($BOUNDARY) + 2; | |
| } | |
| $HEADER .= "Content-Type: text/plain\n"; | |
| } | |
| } | |
| sub print_header() | |
| { | |
| print $HEADER; | |
| } | |
| sub additional_header() | |
| { | |
| print "$REPLACE_SENDER\n" if ($REPLACE_SENDER); | |
| print "$REPLACE_ERRORS_TO\n" if ($REPLACE_ERRORS_TO); | |
| print "\n"; | |
| } | |
| sub print_plain($) | |
| { | |
| my $boundary = shift; | |
| my $boundary_len = length($boundary) + 2; | |
| my @body; | |
| while (<STDIN>) { | |
| if (substr($_, 0, $boundary_len) eq "--$boundary") { | |
| last if (substr($_, $boundary_len) =~ /^(--|)$/); | |
| } | |
| if (defined($MOBILE_MAIL)) { | |
| s/^\s+// if ($CCMAIL); | |
| next if (/^[>|]/); | |
| next if (/^<\S+\@\S+>/); | |
| next if (/^\s+<\S+\@\S+>.*[:,]$/); | |
| next if (/\s+<\S+\@\S+>\s+\x1b\$[\@B]\$5\$s!\"\x1b\([BJ]$/); | |
| next if (/ writes:$/); | |
| next if (/ wrote:$/); | |
| next if (/^At .* wrote:$/); | |
| next if (/^On .* wrote:$/); | |
| next if (/^(On)?\s+\S{3}, \d{2} \S{3} \d{4} \d{2}:\d{2}:\d{2} (\(\?S{3}\)?|[-+]\d{4}),$/); | |
| next if (/^\S+\@\S+\s+\((.*)\)/); | |
| next if (/^(From|Subject|Date|Message-Id): /); | |
| s/([-#%]){10,}/$1/g; | |
| s/[ \t]+/ /g; | |
| s/^(\x1b\$B)(!!)+/$1/; | |
| if (/^$/) { | |
| next if ($BLANK_LINE); | |
| $BLANK_LINE = 1; | |
| } else { | |
| $_ =~ s/^\s+//; | |
| $BLANK_LINE = 0; | |
| } | |
| } | |
| $LENGTH += length($_); | |
| push(@body, $_) if ($TRUNCATE_AT <= 0 || $LENGTH < $TRUNCATE_AT); | |
| } | |
| if ($TRUNCATE_AT <= 0 || $LENGTH < $TRUNCATE_AT) { | |
| pop(@body) while ($body[-1] =~ /^\s+$/); | |
| my $line = $body[-1]; | |
| my $n; | |
| for (my $i = 2; $i <= 16 && @body - $i >= 0; $i++) { | |
| $n = $i if ($body[-$i] eq $line); | |
| } | |
| if ($n) { | |
| splice(@body, -$n, $n); | |
| } else { | |
| for (my $i = 1; $i <= 16 && @body - $i >= 0; $i++) { | |
| if ($body[-$i] =~ /^-{2,} ?$/) { | |
| splice(@body, -$i, $i); | |
| last; | |
| } | |
| } | |
| } | |
| } | |
| print @body; | |
| } | |
| sub print_quoted($) | |
| { | |
| my $boundary = shift; | |
| my $boundary_len = length($boundary) + 2; | |
| while (<STDIN>) { | |
| if (substr($_, 0, $boundary_len) eq "--$boundary") { | |
| return if (substr($_, $boundary_len) =~ /^(--|)$/); | |
| } | |
| s/=\n//; | |
| s/=([0-9A-Fa-f]{2})/pack("H2", $1)/ge; | |
| $LENGTH += length($_); | |
| print if ($TRUNCATE_AT <= 0 || $LENGTH < $TRUNCATE_AT); | |
| } | |
| } | |
| sub print_base64($) | |
| { | |
| my $boundary = shift; | |
| my $boundary_len = length($boundary) + 2; | |
| my($buf, $ch); | |
| $buf = ""; | |
| while (<STDIN>) { | |
| if (substr($_, 0, $boundary_len) eq "--$boundary") { | |
| return if (substr($_, $boundary_len) =~ /^(--|)$/); | |
| } | |
| chomp; | |
| @char = split(//, $_); | |
| while ($#char >= 0) { | |
| $c1 = shift(@char); | |
| $c2 = shift(@char); | |
| $c3 = shift(@char); | |
| $c4 = shift(@char); | |
| $c1 = $char64[ord($c1)]; | |
| $c2 = $char64[ord($c2)]; | |
| $ch = (($c1<<2) | (($c2&0x30)>>4)); | |
| $buf .= sprintf('%c', $ch); | |
| if ($ch == 0x0a) { | |
| $LENGTH += length($buf); | |
| print $buf if ($TRUNCATE_AT <= 0 || $LENGTH < $TRUNCATE_AT); | |
| $buf = ""; | |
| } | |
| if ($c3 ne "=") { | |
| $c3 = $char64[ord($c3)]; | |
| $ch = ((($c2&0x0f) << 4) | (($c3&0x3c) >> 2)); | |
| $buf .= sprintf('%c', $ch); | |
| if ($ch == 0x0a) { | |
| $LENGTH += length($buf); | |
| print $buf if ($TRUNCATE_AT <= 0 || $LENGTH < $TRUNCATE_AT); | |
| $buf = ""; | |
| } | |
| if ($c4 ne "=") { | |
| $c4 = $char64[ord($c4)]; | |
| $ch = ((($c3&0x03) <<6) | $c4); | |
| $buf .= sprintf('%c', $ch); | |
| if ($ch == 0x0a) { | |
| $LENGTH += length($buf); | |
| print $buf if ($TRUNCATE_AT <= 0 || $LENGTH < $TRUNCATE_AT); | |
| $buf = ""; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| sub skip_part($) | |
| { | |
| my $boundary = shift; | |
| my $boundary_len = length($boundary) + 2; | |
| while (<STDIN>) { | |
| if (substr($_, 0, $boundary_len) eq "--$boundary") { | |
| return if (substr($_, $boundary_len) =~ /^(--|)$/); | |
| } | |
| } | |
| } | |
| sub mime_part(@) | |
| { | |
| my(%CONTENT_INFO) = (); | |
| my($field) = undef; | |
| my($CONTENT_TYPE) = undef; | |
| my $DISPOSITION; | |
| my $FILENAME; | |
| while (<STDIN>) { | |
| last if (/^$/); | |
| if (/^(\S+): /) { | |
| $field = $1; | |
| $field =~ tr/a-z/A-Z/; | |
| } | |
| $CONTENT_INFO{$field} .= $_; | |
| } | |
| if ($_ = $CONTENT_INFO{"CONTENT-TYPE"}) { | |
| if (/^Content-Type:\s+([^;\s]+)/i) { | |
| $CONTENT_TYPE = lc($1); | |
| } | |
| } | |
| if ($_ = $CONTENT_INFO{"CONTENT-DISPOSITION"}) { | |
| if (/^Content-Disposition:\s+([^;\s]+)/i) { | |
| $DISPOSITION = $1; | |
| ($FILENAME) = /filename="([^"]+)"/; | |
| $FILENAME = decode_header($FILENAME); | |
| } | |
| } | |
| if ($_ = $CONTENT_INFO{"CONTENT-TRANSFER-ENCODING"}) { | |
| if (/^Content-Transfer-Encoding:\s+(\S+)/i) { | |
| $ENCODING = $1; | |
| } | |
| } | |
| if ($CONTENT_TYPE =~ ?^text/plain?i) { | |
| if ($DISPOSITION =~ /^attachment$/i) { | |
| &part_skip(@_); | |
| } else { | |
| if ($ENCODING =~ /base64/i) { | |
| &print_base64(@_); | |
| } elsif ($ENCODING =~ /quoted-printable/i) { | |
| &print_quoted(@_); | |
| } else { | |
| &print_plain(@_); | |
| } | |
| } | |
| } elsif ($CONTENT_TYPE =~ m!(message/)?rfc822!i) { | |
| &rfc822($BOUNDARY); | |
| } else { | |
| #print "[$FILENAME]\n" if ($DISPOSITION =~ /^attachment$/i); | |
| &skip_part($BOUNDARY); | |
| } | |
| } | |
| sub rfc822($) | |
| { | |
| my $boundary = shift; | |
| my $boundary_len = length($boundary) + 2; | |
| my %header; | |
| my $field = '-'; | |
| my $mime_version; | |
| my $mime_type; | |
| while(<STDIN>) { | |
| last if (/^$/); | |
| if (/^(\S+): /) { | |
| $field = $1; | |
| $field =~ tr/a-z/A-Z/; | |
| } | |
| $header{$field} .= $_; | |
| } | |
| if ($_ = $header{"MIME-VERSION"}) { | |
| /^MIME-Version:\s+(\d[\d\.]+)/i; | |
| $mime_version = $1; | |
| } | |
| if ($_ = $header{"CONTENT-TYPE"}) { | |
| if (/^Content-Type:\s+([^;\s]+)/i) { | |
| $mime_type = lc($1); | |
| } | |
| if (/boundary=\"([^\"]*)\"/i || /boundary=(\S+)/i) { | |
| $boundary = $1; | |
| $boundary_len = length($boundary) + 2; | |
| } | |
| } | |
| my @context = ($MIME_TYPE, $BOUNDARY, $BOUNDARY_LEN); | |
| my %saved = %HEADER; | |
| ($MIME_TYPE, $BOUNDARY, $BOUNDARY_LEN) = | |
| ($mime_type, $boundary, $boundary_len); | |
| %HEADER = %header; | |
| $LENGTH += 18; | |
| print "[RFC822 INCLUDED]\n" if ($TRUNCATE_AT <= 0 || $LENGTH < $TRUNCATE_AT); | |
| &process_body; | |
| ($MIME_TYPE, $BOUNDARY, $BOUNDARY_LEN) = @context; | |
| %HEADER = %saved; | |
| } | |
| sub candy_part($) | |
| { | |
| my($type) = shift; | |
| candy: { | |
| if ($type =~ /\.xls$/i) { | |
| while (<STDIN>) { | |
| return if (/^\.{71}$/); | |
| if (/^Item Subject: (.*)$/) { | |
| $type = $1; | |
| redo candy; | |
| } | |
| } | |
| } elsif ($type eq "TEXT ITEM") { | |
| while (<STDIN>) { | |
| return if (/^\.{71}$/); | |
| $_ =~ s/^\s+//; | |
| $LENGTH += length($_); | |
| print if ($TRUNCATE_AT <= 0 || $LENGTH < $TRUNCATE_AT); | |
| } | |
| } else { | |
| while (<STDIN>) { | |
| return if (/^\.{71}$/); | |
| if (/^Item Subject: (.*)$/) { | |
| $type = $1; | |
| redo candy; | |
| } | |
| $_ =~ s/^\s+//; | |
| $LENGTH += length($_); | |
| print if ($TRUNCATE_AT <= 0 || $LENGTH < $TRUNCATE_AT); | |
| } | |
| } | |
| } | |
| } | |
| sub uuencode_part($) | |
| { | |
| my($type) = shift; | |
| if ($type eq "TEXT ITEM") { | |
| } else { | |
| } | |
| while (<STDIN>) { | |
| return if (/^end$/); | |
| } | |
| } | |
| sub multipart_mixed($) | |
| { | |
| my $boundary = shift; | |
| my $boundary_len = length($boundary) + 2; | |
| for ($_ = <STDIN> ; $_ ; $_ = <STDIN>) { | |
| if ($_ eq "--$boundary\n") { | |
| &mime_part($boundary); | |
| redo; | |
| } | |
| } | |
| } | |
| sub multipart_alternative($) | |
| { | |
| my $boundary = shift; | |
| my $boundary_len = length($boundary) + 2; | |
| for ($_ = <STDIN> ; $_ ; $_ = <STDIN>) { | |
| if ($_ eq "--$boundary\n") { | |
| &mime_part($boundary); | |
| redo; | |
| } | |
| } | |
| } | |
| sub multipart_related() | |
| { | |
| my(%CONTENT_INFO) = (); | |
| my($field) = undef; | |
| my($CONTENT_TYPE) = undef; | |
| my($CONTENT_BOUNDARY) = undef; | |
| while (<STDIN>) { | |
| last if (/^$/); | |
| if (/^(\S+): /) { | |
| $field = $1; | |
| $field =~ tr/a-z/A-Z/; | |
| } | |
| $CONTENT_INFO{$field} .= $_; | |
| } | |
| if ($_ = $CONTENT_INFO{"CONTENT-TYPE"}) { | |
| if (/^Content-Type:\s+([^;\s]+)/i) { | |
| $CONTENT_TYPE = $1; | |
| } | |
| if (/boundary=\"([^\"]*)\"/i || /boundary=(\S+)/i) { | |
| $CONTENT_BOUNDARY = $1; | |
| $CONTENT_BOUNDARY_LEN = length($CONTENT_BOUNDARY) + 2; | |
| } | |
| } | |
| if ($_ = $CONTENT_INFO{"CONTENT-DISPOSITION"}) { | |
| if (/^Content-Disposition:\s+([^;\s]+)/i) { | |
| $DISPOSITION = $1; | |
| } | |
| } | |
| if ($_ = $CONTENT_INFO{"CONTENT-TRANSFER-ENCODING"}) { | |
| if (/^Content-Transfer-Encoding:\s+(\S+)/i) { | |
| $ENCODING = $1; | |
| } | |
| } | |
| for ($_ = <STDIN> ; $_ ; $_ = <STDIN>) { | |
| if ($_ eq "--$CONTENT_BOUNDARY\n") { | |
| &mime_part($CONTENT_BOUNDARY); | |
| redo; | |
| } | |
| } | |
| } | |
| sub singlepart($) | |
| { | |
| my $boundary = shift; | |
| my $boundary_len = length($boundary) + 2; | |
| my @body; | |
| if ($_ = $HEADER{"CONTENT-TRANSFER-ENCODING"}) { | |
| /^Content-Transfer-Encoding:\s+(\S+)/; | |
| $ENCODING = $1; | |
| if ($ENCODING =~ /base64/i) { | |
| &print_base64($boundary); | |
| } elsif ($ENCODING =~ /quoted-printable/i) { | |
| &print_quoted($boundary); | |
| } else { | |
| &print_plain($boundary); | |
| } | |
| } else { | |
| while(<STDIN>) { | |
| if ($boundary && substr($_, 0, $boundary_len) eq "--$boundary") { | |
| last if (substr($_, $boundary_len) =~ /^(--|)$/); | |
| } | |
| if (/^begin \d\d\d /) { | |
| &uuencode_part(); | |
| next; | |
| } elsif ($CANDY_HACK && /^Item Subject: (.*)$/) { | |
| &candy_part($1); | |
| next; | |
| } | |
| if (defined($MOBILE_MAIL)) { | |
| s/^\s+// if ($CCMAIL); | |
| next if (/^[>|]/); | |
| next if (/^<\S+\@\S+>/); | |
| next if (/^\s+<\S+\@\S+>.*[:,]$/); | |
| next if (/\s+<\S+\@\S+>\s+\x1b\$[\@B]\$5\$s!\"\x1b\([BJ]$/); | |
| next if (/ writes:$/); | |
| next if (/ wrote:$/); | |
| next if (/^At .* wrote:$/); | |
| next if (/^On .* wrote:$/); | |
| next if (/^(On)?\s+\S{3}, \d{2} \S{3} \d{4} \d{2}:\d{2}:\d{2} (\(\?S{3}\)?|[-+]\d{4}),$/); | |
| next if (/^\s+<\S+\@\S+>,$/); | |
| next if (/^\S+\@\S+\s+\((.*)\)/); | |
| next if (/^(From|Subject|Date|Message-Id): /); | |
| last if (/^-{2,}$/); | |
| s/([-#%]){10,}/$1/g; | |
| s/[ \t]+/ /g; | |
| if (/^$/) { | |
| next if ($BLANK_LINE); | |
| $BLANK_LINE = 1; | |
| } else { | |
| $_ =~ s/^\s+//; | |
| $BLANK_LINE = 0; | |
| } | |
| } | |
| $LENGTH += length($_); | |
| push(@body, $_) if ($TRUNCATE_AT <= 0 || $LENGTH < $TRUNCATE_AT); | |
| } | |
| if ($TRUNCATE_AT <= 0 || $LENGTH < $TRUNCATE_AT) { | |
| pop(@body) while ($body[-1] =~ /^\s+$/); | |
| my $line = $body[-1]; | |
| my $n; | |
| for (my $i = 2; $i <= 16 && @body - $i >= 0; $i++) { | |
| $n = $i if ($body[-$i] eq $line); | |
| } | |
| if ($n) { | |
| splice(@body, -$n, $n); | |
| } else { | |
| for (my $i = 1; $i <= 16 && @body - $i >= 0; $i++) { | |
| if ($body[-$i] =~ /^-{2,} ?$/) { | |
| splice(@body, -$i, $i); | |
| last; | |
| } | |
| } | |
| } | |
| } | |
| print @body; | |
| } | |
| } | |
| sub process_body() | |
| { | |
| if ($MIME_TYPE eq 'multipart/mixed') { | |
| &multipart_mixed($BOUNDARY); | |
| } elsif ($MIME_TYPE eq 'multipart/alternative') { | |
| &multipart_alternative($BOUNDARY); | |
| } elsif ($MIME_TYPE eq 'multipart/related') { | |
| for ($_ = <STDIN> ; $_ ; $_ = <STDIN>) { | |
| if ($_ eq "--$BOUNDARY\n") { | |
| &multipart_related(); | |
| redo; | |
| } | |
| } | |
| } else { | |
| &singlepart($BOUNDARY); | |
| } | |
| } | |
| sub process_opts() | |
| { | |
| %optctl = ( | |
| ); | |
| &GetOptions( | |
| "limit=i" => \$TRUNCATE_AT, | |
| "errors=s" => \$ERRORS_TO, | |
| "sender=s" => \$SENDER, | |
| "skywalker" => \$SKYWALKER, | |
| "ezweb" => \$EZWEB, | |
| "imode" => \$IMODE, | |
| "foma" => \$FOMA, | |
| "pmaildx" => \$PMAILDX | |
| ); | |
| if ($SKYWALKER) { | |
| $MOBILE_MAIL = 1; | |
| $TRUNCATE_AT = 350; | |
| $SENDER = $MAIL_ADDR; | |
| $ERRORS_TO = $MAIL_ADDR; | |
| } | |
| if ($PMAILDX) { | |
| $MOBILE_MAIL = 1; | |
| $TRUNCATE_AT = 5000; | |
| $SENDER = $MAIL_ADDR; | |
| $ERRORS_TO = $MAIL_ADDR; | |
| } | |
| if ($IMODE) { | |
| $MOBILE_MAIL = 1; | |
| $TRUNCATE_AT = 4000; | |
| $SENDER = $MAIL_ADDR; | |
| $ERRORS_TO = $MAIL_ADDR; | |
| $REPLACE_FROM = "From: \$MAIL_ADDR"; | |
| } | |
| if ($FOMA) { | |
| $MOBILE_MAIL = 1; | |
| $TRUNCATE_AT = 10000; | |
| $SENDER = $MAIL_ADDR; | |
| $ERRORS_TO = $MAIL_ADDR; | |
| $REPLACE_FROM = "From: \$MAIL_ADDR"; | |
| } | |
| if ($EZWEB) { | |
| $MOBILE_MAIL = 1; | |
| $TRUNCATE_AT = 10000; | |
| $SENDER = $MAIL_ADDR; | |
| $ERRORS_TO = $MAIL_ADDR; | |
| $REPLACE_FROM = "From: \$MAIL_ADDR"; | |
| } | |
| $REPLACE_SENDER = "Sender: $SENDER" if ($SENDER); | |
| $REPLACE_ERRORS_TO = "Errors-To: $ERRORS_TO" if ($ERRORS_TO); | |
| } | |
| sub main() | |
| { | |
| &process_opts; | |
| $MAIL_ADDR = $ARGV[0] || $ENV{USER} || $ENV{LOGNAME}; | |
| #$REPLACE_SENDER = "Sender: $ARGV[0]"; | |
| #$REPLACE_ERRORS_TO = 'Errors-To: "$ARGV[0]"; | |
| if ($REPLACE_FROM) { | |
| eval "\$REPLACE_FROM = \"$REPLACE_FROM\""; | |
| } | |
| &process_header; | |
| if (defined($HEADER{"CONTENT-DISPOSITION"})) { | |
| $_ = $HEADER{"CONTENT-DISPOSITION"}; | |
| if (/^Content-Disposition:\s+([^;\s]+)/i) { | |
| $CONTENT_DISPOSITION = $1; | |
| exit 75 if ($CONTENT_DISPOSITION =~ /^attachment$/i); | |
| } | |
| } | |
| &print_header; | |
| &additional_header; | |
| if ($SKYWALKER || $IMODE) { | |
| $_ = $HEADER{"FROM"}; | |
| if ($SKYWALKER) { | |
| s/\n/ /g; | |
| if (/From:\s+\S+\s+\((.*)\)/i) { | |
| $_ = $1; | |
| } elsif (/From:\s+(.*)\s+<\S+>/i) { | |
| $_ = $1; | |
| } else { | |
| /From:\s+(\S+)/i; | |
| $_ = $1; | |
| $_ =~ s/(\@[^.]*)\..*$/$1/; | |
| } | |
| } | |
| $_ = decode_header($_); | |
| $LENGTH += length($_); | |
| print "$_"; | |
| if ($SKYWALKER) { | |
| if (defined($HEADER{"SUBJECT"})) { | |
| $_ = $HEADER{"SUBJECT"}; | |
| s/\n/ /g; | |
| /^Subject:\s+(.*)$/i; | |
| $_ = "$1"; | |
| $_ = decode_header($_); | |
| $LENGTH += length($_); | |
| print "/$_"; | |
| } | |
| } | |
| print "\n"; | |
| } | |
| $LENGTH = 0; | |
| &process_body; | |
| } | |
| &main; | |
| exit(0); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment