2002-06-26 15:50:47 +00:00
|
|
|
#!/usr/bin/perl
|
|
|
|
|
|
|
|
# b2m.pl - Script to convert a Babyl file to an mbox file
|
|
|
|
|
2008-01-07 08:42:46 +00:00
|
|
|
# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008
|
2007-01-28 00:46:46 +00:00
|
|
|
# Free Software Foundation, Inc.
|
|
|
|
|
2002-06-26 15:50:47 +00:00
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU General Public License as published by
|
2007-07-25 05:08:27 +00:00
|
|
|
# the Free Software Foundation; either version 3, or (at your option)
|
|
|
|
# any later version.
|
2002-06-26 15:50:47 +00:00
|
|
|
|
|
|
|
# This program is distributed in the hope that it will be useful, but
|
|
|
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
# General Public License for more details.
|
|
|
|
|
|
|
|
# You should have received a copy of the GNU General Public License
|
2007-07-25 05:08:27 +00:00
|
|
|
# along with this program; see the file COPYING. If not, write to the
|
|
|
|
# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
|
|
# Boston, MA 02110-1301 USA.
|
2002-06-26 15:50:47 +00:00
|
|
|
|
|
|
|
# Maintained by Jonathan Kamens <jik@kamens.brookline.ma.us>.
|
|
|
|
|
|
|
|
# Requires CPAN modules: MailTools (for Mail::Address), TimeDate (for
|
|
|
|
# Date::Parse).
|
|
|
|
|
|
|
|
use warnings;
|
|
|
|
use strict;
|
|
|
|
use File::Basename;
|
|
|
|
use Getopt::Long;
|
|
|
|
use Mail::Address;
|
|
|
|
use Date::Parse;
|
|
|
|
|
|
|
|
my($whoami) = basename $0;
|
2005-07-04 15:47:28 +00:00
|
|
|
my($version) = '$Revision$';
|
2002-06-26 15:50:47 +00:00
|
|
|
my($usage) = "Usage: $whoami [--help] [--version] [--[no]full-headers] [Babyl-file]
|
|
|
|
\tBy default, full headers are printed.\n";
|
|
|
|
|
|
|
|
my($opt_help, $opt_version);
|
|
|
|
my($opt_full_headers) = 1;
|
|
|
|
|
|
|
|
die $usage if (! GetOptions(
|
|
|
|
'help' => \$opt_help,
|
|
|
|
'version' => \$opt_version,
|
|
|
|
'full-headers!' => \$opt_full_headers,
|
|
|
|
));
|
|
|
|
|
|
|
|
if ($opt_help) {
|
|
|
|
print $usage;
|
|
|
|
exit;
|
|
|
|
}
|
|
|
|
elsif ($opt_version) {
|
|
|
|
print "$whoami version: $version\n";
|
|
|
|
exit;
|
|
|
|
}
|
|
|
|
|
|
|
|
die $usage if (@ARGV > 1);
|
|
|
|
|
|
|
|
$/ = "\n\037";
|
|
|
|
|
|
|
|
if (<> !~ /^BABYL OPTIONS:/) {
|
|
|
|
die "$whoami: $ARGV is not a Babyl file\n$usage";
|
|
|
|
}
|
|
|
|
|
|
|
|
while (<>) {
|
|
|
|
my($msg_num) = $. - 1;
|
2002-07-05 19:56:34 +00:00
|
|
|
my($labels, $pruned, $full_header, $header);
|
2002-06-26 15:50:47 +00:00
|
|
|
my($from_line, $from_addr);
|
|
|
|
my($time);
|
|
|
|
|
|
|
|
# This will strip the initial form feed, any whitespace that may
|
|
|
|
# be following it, and then a newline
|
|
|
|
s/^\s+//;
|
|
|
|
# This will strip the ^_ off of the end of the message
|
|
|
|
s/\037$//;
|
|
|
|
|
|
|
|
if (! s/(.*)\n//) {
|
|
|
|
malformatted:
|
|
|
|
warn "$whoami: message $msg_num in $ARGV is malformatted\n";
|
|
|
|
next;
|
|
|
|
}
|
|
|
|
$labels = $1;
|
|
|
|
|
2002-07-05 19:56:34 +00:00
|
|
|
# Strip the integer indicating whether the header is pruned
|
2003-02-04 14:56:31 +00:00
|
|
|
$labels =~ s/^(\d+)[,\s]*//;
|
2002-07-05 19:56:34 +00:00
|
|
|
$pruned = $1;
|
|
|
|
|
|
|
|
s/(?:((?:.+\n)+)\n*)?\*\*\* EOOH \*\*\*\n+// || goto malformatted;
|
2002-06-26 15:50:47 +00:00
|
|
|
$full_header = $1;
|
|
|
|
|
|
|
|
if (s/((?:.+\n)+)\n+//) {
|
|
|
|
$header = $1;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
# Message has no body
|
|
|
|
$header = $_;
|
|
|
|
$_ = '';
|
|
|
|
}
|
|
|
|
|
2002-07-05 19:56:34 +00:00
|
|
|
# "$pruned eq '0'" is different from "! $pruned". We want to make
|
|
|
|
# sure that we found a valid label line which explicitly indicated
|
|
|
|
# that the header was not pruned.
|
|
|
|
if ((! $full_header) || ($pruned eq '0')) {
|
2002-06-26 15:50:47 +00:00
|
|
|
$full_header = $header;
|
|
|
|
}
|
|
|
|
|
2002-12-11 23:32:41 +00:00
|
|
|
# End message with two newlines (some mbox parsers require a blank
|
|
|
|
# line before the next "From " line).
|
|
|
|
s/\s+$/\n\n/;
|
2002-06-26 15:50:47 +00:00
|
|
|
|
|
|
|
# Quote "^From "
|
|
|
|
s/(^|\n)From /$1>From /g;
|
|
|
|
|
|
|
|
# Strip extra commas and whitespace from the end
|
|
|
|
$labels =~ s/[,\s]+$//;
|
|
|
|
# Now collapse extra commas and whitespace in the remaining label string
|
|
|
|
$labels =~ s/[,\s]+/, /g;
|
2003-02-04 14:56:31 +00:00
|
|
|
|
2002-06-26 15:50:47 +00:00
|
|
|
foreach my $rmail_header qw(summary-line x-coding-system) {
|
|
|
|
$full_header =~ s/(^|\n)$rmail_header:.*\n/$1/i;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($full_header =~ s/(^|\n)mail-from:\s*(From .*)\n/$1/i) {
|
|
|
|
($from_line = $2) =~ s/\s*$/\n/;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
foreach my $addr_header qw(return-path from really-from sender) {
|
2002-07-29 20:05:34 +00:00
|
|
|
if ($full_header =~ /(?:^|\n)$addr_header:\s*(.*\n(?:\B.*\n)*)/i) {
|
2002-06-26 15:50:47 +00:00
|
|
|
my($addr) = Mail::Address->parse($1);
|
|
|
|
$from_addr = $addr->address($addr);
|
|
|
|
last;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (! $from_addr) {
|
|
|
|
$from_addr = "Babyl_to_mail_by_$whoami\@localhost";
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($full_header =~ /(?:^|\n)date:\s*(\S.*\S)/i) {
|
|
|
|
$time = str2time($1);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (! $time) {
|
|
|
|
# No Date header or we failed to parse it
|
|
|
|
$time = time;
|
|
|
|
}
|
|
|
|
|
|
|
|
$from_line = "From " . $from_addr . " " . localtime($time) . "\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
print($from_line, ($opt_full_headers ? $full_header : $header),
|
|
|
|
($labels ? "X-Babyl-Labels: $labels\n" : ""), "\n",
|
|
|
|
$_) || die "$whoami: error writing to stdout: $!\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
close(STDOUT) || die "$whoami: Error closing stdout: $!\n";
|
2003-09-01 15:45:59 +00:00
|
|
|
|
|
|
|
# arch-tag: 8c7c8ab0-721c-46d7-ba3e-139801240aa8
|