Blame


1 ff07fb88 2023-05-05 op #!/usr/bin/env perl
2 ff07fb88 2023-05-05 op #
3 ff07fb88 2023-05-05 op # gmimport was written by Omar Polo <op@openbsd.org> and is placed in the
4 ff07fb88 2023-05-05 op # public domain. The author hereby disclaims copyright to this source
5 ff07fb88 2023-05-05 op # code.
6 ff07fb88 2023-05-05 op
7 ff07fb88 2023-05-05 op use strict;
8 ff07fb88 2023-05-05 op use warnings;
9 ff07fb88 2023-05-05 op use v5.32;
10 ff07fb88 2023-05-05 op use utf8;
11 ff07fb88 2023-05-05 op
12 ff07fb88 2023-05-05 op use Date::Parse;
13 ff07fb88 2023-05-05 op use File::Basename;
14 ff07fb88 2023-05-05 op
15 ff07fb88 2023-05-05 op use OpenBSD::Pledge;
16 ff07fb88 2023-05-05 op use OpenBSD::Unveil;
17 ff07fb88 2023-05-05 op
18 ff07fb88 2023-05-05 op die "usage: $0 dbpath\n" if @ARGV != 1;
19 ff07fb88 2023-05-05 op my $dbpath = shift @ARGV;
20 ff07fb88 2023-05-05 op
21 ff07fb88 2023-05-05 op open(my $sqlite, "|-", "/usr/local/bin/sqlite3", $dbpath)
22 ff07fb88 2023-05-05 op or die "can't spawn sqlite3";
23 ff07fb88 2023-05-05 op
24 ff07fb88 2023-05-05 op unveil("/usr/local/bin/mshow", "rx") or die "unveil mshow: $!";
25 ff07fb88 2023-05-05 op pledge("stdio proc exec") or die "pledge: $!";
26 ff07fb88 2023-05-05 op
27 ff07fb88 2023-05-05 op say $sqlite ".import --csv /dev/stdin email"
28 ff07fb88 2023-05-05 op or die "can't speak to sqlite: $!";
29 ff07fb88 2023-05-05 op
30 ff07fb88 2023-05-05 op while (<>) {
31 ff07fb88 2023-05-05 op chomp;
32 ff07fb88 2023-05-05 op
33 ff07fb88 2023-05-05 op open(my $fh, "-|", "/usr/local/bin/mshow", "-Atext/plain", "-NF", $_)
34 ff07fb88 2023-05-05 op or die "can't run mshow $_: $!";
35 ff07fb88 2023-05-05 op
36 ff07fb88 2023-05-05 op my $f = $_;
37 ff07fb88 2023-05-05 op my ($time, $id) = split /\./, basename $_;
38 ff07fb88 2023-05-05 op my $mid = "$time.$id";
39 ff07fb88 2023-05-05 op $mid =~ s/"/""/g;
40 ff07fb88 2023-05-05 op
41 ff07fb88 2023-05-05 op my ($from, $subj, $date) = ('', '', undef);
42 ff07fb88 2023-05-05 op while (<$fh>) {
43 ff07fb88 2023-05-05 op chomp;
44 ff07fb88 2023-05-05 op last if /^$/;
45 ff07fb88 2023-05-05 op s/"/""/g;
46 ff07fb88 2023-05-05 op $from = s/.*?: //r if /^From:/;
47 ff07fb88 2023-05-05 op $subj = s/.*?: //r if /^Subject:/;
48 ff07fb88 2023-05-05 op $date = str2time(s/.*?: //r) if /^Date:/;
49 ff07fb88 2023-05-05 op }
50 ff07fb88 2023-05-05 op $date //= time;
51 ff07fb88 2023-05-05 op $from =~ s/ +<.*>//;
52 ff07fb88 2023-05-05 op
53 ff07fb88 2023-05-05 op # leave open for the body
54 ff07fb88 2023-05-05 op print $sqlite "\"$mid\",\"$from\",\"$date\",\"$subj\",\"";
55 ff07fb88 2023-05-05 op
56 ff07fb88 2023-05-05 op while (<$fh>) {
57 ff07fb88 2023-05-05 op s/"/""/g;
58 ff07fb88 2023-05-05 op print $sqlite $_;
59 ff07fb88 2023-05-05 op }
60 ff07fb88 2023-05-05 op say $sqlite '"';
61 ff07fb88 2023-05-05 op
62 ff07fb88 2023-05-05 op close $fh;
63 ff07fb88 2023-05-05 op }
64 ff07fb88 2023-05-05 op
65 ff07fb88 2023-05-05 op close $sqlite;
66 ff07fb88 2023-05-05 op die "sqlite3 exited with $?\n" unless $? == 0;