~stewart/drizzle/embedded-innodb-create-select-transaction-arrgh

« back to all changes in this revision

Viewing changes to tests/mail_to_db.pl

  • Committer: brian
  • Date: 2008-06-25 05:29:13 UTC
  • Revision ID: brian@localhost.localdomain-20080625052913-6upwo0jsrl4lnapl
clean slate

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/perl -w
 
2
# Copyright Abandoned 1998 TCX DataKonsult AB & Monty Program KB & Detron HB
 
3
# This file is public domain and comes with NO WARRANTY of any kind
 
4
#
 
5
# This program is brought to you by Janne-Petteri Koilo with the 
 
6
# administration of Michael Widenius.
 
7
#
 
8
# Rewritten with a lot of bug fixes by Jani Tolonen and Thimble Smith
 
9
# 15.12.2000
 
10
#
 
11
# This program takes your mails and puts them into your database. It ignores
 
12
# messages with the same from, date and message text.
 
13
# You can use mail-files that are compressed or gzipped and ends with
 
14
# -.gz or -.Z.
 
15
 
 
16
use DBI;
 
17
use Getopt::Long;
 
18
 
 
19
$| = 1;
 
20
$VER = "3.0";
 
21
 
 
22
$opt_help          = 0;
 
23
$opt_version       = 0;
 
24
$opt_debug         = 0;
 
25
$opt_host          = undef();
 
26
$opt_port          = undef();
 
27
$opt_socket        = undef();
 
28
$opt_db            = "mail";
 
29
$opt_user          = undef();
 
30
$opt_password      = undef();
 
31
$opt_max_mail_size = 65536;
 
32
$opt_create        = 0;
 
33
$opt_test          = 0;
 
34
$opt_no_path       = 0;
 
35
$opt_stop_on_error = 0;
 
36
$opt_stdin         = 0;
 
37
 
 
38
my ($dbh, $progname, $mail_no_from_f, $mail_no_txt_f, $mail_too_big,
 
39
    $mail_forwarded, $mail_duplicates, $mail_no_subject_f, $mail_inserted);
 
40
 
 
41
$mail_no_from_f = $mail_no_txt_f = $mail_too_big = $mail_forwarded =
 
42
$mail_duplicates = $mail_no_subject_f = $mail_inserted = 0;
 
43
$mail_fixed=0;
 
44
 
 
45
#
 
46
# Remove the following message-ends from message
 
47
#
 
48
@remove_tail= (
 
49
"\n-*\nSend a mail to .*\n.*\n.*\$",
 
50
"\n-*\nPlease check .*\n.*\n\nTo unsubscribe, .*\n.*\n.*\nIf you have a broken.*\n.*\n.*\$",
 
51
"\n-*\nPlease check .*\n(.*\n){1,3}\nTo unsubscribe.*\n.*\n.*\$",
 
52
"\n-*\nPlease check .*\n.*\n\nTo unsubscribe.*\n.*\$",
 
53
"\n-*\nTo request this thread.*\nTo unsubscribe.*\n.*\.*\n.*\$",
 
54
"\n -*\n.*Send a mail to.*\n.*\n.*unsubscribe.*\$",
 
55
"\n-*\nTo request this thread.*\n\nTo unsubscribe.*\n.*\$"
 
56
);
 
57
 
 
58
# Generate regexp to remove tails where the unsubscribed is quoted
 
59
{
 
60
  my (@tmp, $tail);
 
61
  @tmp=();
 
62
  foreach $tail (@remove_tail)
 
63
  {
 
64
    $tail =~ s/\n/\n[> ]*/g;
 
65
    push(@tmp, $tail);
 
66
  }
 
67
  push @remove_tail,@tmp;
 
68
}
 
69
 
 
70
my %months = ('Jan' => 1, 'Feb' => 2, 'Mar' => 3, 'Apr' => 4, 'May' => 5,
 
71
              'Jun' => 6, 'Jul' => 7, 'Aug' => 8, 'Sep' => 9, 'Oct' => 10,
 
72
              'Nov' => 11, 'Dec' => 12);
 
73
 
 
74
$progname = $0;
 
75
$progname =~ s/.*[\/]//;
 
76
 
 
77
main();
 
78
 
 
79
####
 
80
#### main sub routine
 
81
####
 
82
 
 
83
sub main
 
84
{
 
85
  my ($connect_arg, @args, $ignored, @defops, $i);
 
86
 
 
87
  if (defined(my_which("my_print_defaults")))
 
88
  {
 
89
    @defops = `my_print_defaults mail_to_db`;
 
90
    chop @defops;
 
91
    splice @ARGV, 0, 0, @defops;
 
92
  }
 
93
  else
 
94
  {
 
95
    print "WARNING: No command 'my_print_defaults' found; unable to read\n";
 
96
    print "the my.cnf file. This command is available from the latest MySQL\n";
 
97
    print "distribution.\n";
 
98
  }
 
99
  GetOptions("help","version","host=s","port=i","socket=s","db=s",
 
100
             "user=s","password=s","max_mail_size=i","create","test",
 
101
             "no_path","debug","stop_on_error","stdin")
 
102
  || die "Wrong option! See $progname --help\n";
 
103
 
 
104
  usage($VER) if ($opt_help || $opt_version ||
 
105
                  (!$ARGV[0] && !$opt_create && !$opt_stdin));
 
106
 
 
107
  # Check that the given inbox files exist and are regular files
 
108
  for ($i = 0; ! $opt_stdin && defined($ARGV[$i]); $i++)
 
109
  {
 
110
    die "FATAL: Can't find inbox file: $ARGV[$i]\n" if (! -f $ARGV[$i]);
 
111
  }
 
112
 
 
113
  $connect_arg = "DBI:mysql:";
 
114
  push @args, "database=$opt_db" if defined($opt_db);
 
115
  push @args, "host=$opt_host" if defined($opt_host);
 
116
  push @args, "port=$opt_port" if defined($opt_port);
 
117
  push @args, "mysql_socket=$opt_socket" if defined($opt_socket);
 
118
  push @args, "mysql_read_default_group=mail_to_db";
 
119
  $connect_arg .= join ';', @args;
 
120
  $dbh = DBI->connect("$connect_arg", $opt_user, $opt_password,
 
121
                     { PrintError => 0})
 
122
  || die "Couldn't connect: $DBI::errstr\n";
 
123
 
 
124
  die "You must specify the database; use --db=" if (!defined($opt_db));
 
125
 
 
126
  create_table($dbh) if ($opt_create);
 
127
 
 
128
  if ($opt_stdin)
 
129
  {
 
130
    open(FILE, "-");
 
131
    process_mail_file($dbh, "READ-FROM-STDIN");
 
132
  }
 
133
  else
 
134
  {
 
135
    foreach (@ARGV)
 
136
    {
 
137
      # Check if the file is compressed
 
138
      if (/^(.*)\.(gz|Z)$/)
 
139
      {
 
140
        open(FILE, "zcat $_ |");
 
141
        process_mail_file($dbh, $1);
 
142
      }
 
143
      else
 
144
      {
 
145
        open(FILE, $_);
 
146
        process_mail_file($dbh, $_);
 
147
      }
 
148
    }
 
149
  }
 
150
  $dbh->disconnect if (!$opt_test);
 
151
 
 
152
  $ignored = ($mail_no_from_f + $mail_no_subject_f + $mail_no_txt_f +
 
153
              $mail_too_big + $mail_duplicates + $mail_fixed);
 
154
  print "################################ Mail Report #################################\n\n";
 
155
  print "Mails inserted:\t\t\t\t\t$mail_inserted\n";
 
156
  print "---------------                                ";
 
157
  print "=" . "=" x length("$mail_inserted") . "=\n\n";
 
158
  if ($ignored)
 
159
  {
 
160
    print "Ignored mails\n";
 
161
    print "-------------\n";
 
162
    if ($mail_no_from_f)
 
163
    {
 
164
      print "Reason: mail without \"From:\" -field:\t\t$mail_no_from_f\n";
 
165
    }
 
166
    else
 
167
    {
 
168
      print "";
 
169
    }
 
170
    if ($mail_no_txt_f)
 
171
    {
 
172
      print "Reason: mail without message:\t\t\t$mail_no_txt_f\n";
 
173
    }
 
174
    else
 
175
    {
 
176
      print "";
 
177
    }
 
178
    if ($mail_no_subject_f)
 
179
    {
 
180
      print "Reason: mail without subject:\t\t\t$mail_no_subject_f\n";
 
181
    }
 
182
    else
 
183
    {
 
184
      print "";
 
185
    }
 
186
    if ($mail_too_big)
 
187
    {
 
188
      print "Reason: mail too big, over $opt_max_mail_size bytes:\t\t";
 
189
      print $mail_too_big;
 
190
      print " (see --max_mail_size=#)\n";
 
191
    }
 
192
    else
 
193
    {
 
194
      print "";
 
195
    }
 
196
    if ($mail_duplicates)
 
197
    {
 
198
      print "Reason: duplicate mail, or in db already:\t$mail_duplicates\n";
 
199
    }
 
200
    else
 
201
    {
 
202
      print "";
 
203
    }
 
204
    if ($mail_fixed)
 
205
    {
 
206
      print "Reason: mail was an unsubscribe - mail:\t\t$mail_fixed\n";
 
207
    }
 
208
    else
 
209
    {
 
210
      print "";
 
211
    }
 
212
    print "                                               ";
 
213
    print "=" . "=" x length("$ignored") . "=\n";
 
214
    print "Total number of ignored mails:\t\t\t$ignored\n\n";
 
215
  }
 
216
  print "Total number of mails:\t\t\t\t"; 
 
217
  print $mail_inserted + $ignored;
 
218
  print " (OK: ";
 
219
  print sprintf("%.1f", ($mail_inserted + $ignored) ? (($mail_inserted / ($mail_inserted+$ignored)) * 100) : 0.0);
 
220
  print "% Ignored: ";
 
221
  print sprintf("%.1f", ($mail_inserted + $ignored) ? (($ignored / ($mail_inserted + $ignored)) * 100) : 0);
 
222
  print "%)\n";
 
223
  print "################################ End Report ##################################\n";
 
224
  exit(0);
 
225
}
 
226
 
 
227
####
 
228
#### table creation
 
229
####
 
230
 
 
231
sub create_table
 
232
{
 
233
  my ($dbh)= @_;
 
234
  my ($sth, $query);
 
235
 
 
236
  $query= <<EOF;
 
237
CREATE TABLE my_mail
 
238
(
 
239
 mail_id MEDIUMINT UNSIGNED NOT NULL auto_increment,
 
240
 message_id VARCHAR(255),
 
241
 in_reply_to VARCHAR(255),
 
242
 date DATETIME NOT NULL,
 
243
 time_zone VARCHAR(20),
 
244
 mail_from VARCHAR(120) NOT NULL,
 
245
 reply VARCHAR(120),
 
246
 mail_to TEXT,
 
247
 cc TEXT,
 
248
 sbj VARCHAR(200),
 
249
 txt MEDIUMTEXT NOT NULL,
 
250
 file VARCHAR(64) NOT NULL,
 
251
 hash INTEGER NOT NULL,
 
252
 KEY (mail_id),
 
253
 KEY (message_id),
 
254
 KEY (in_reply_to),
 
255
 PRIMARY KEY (mail_from, date, hash))
 
256
 ENGINE=MyISAM COMMENT=''
 
257
EOF
 
258
  $sth = $dbh->prepare($query) or die $DBI::errstr;
 
259
  $sth->execute() or die "Couldn't create table: $DBI::errstr\n";
 
260
}
 
261
 
 
262
####
 
263
#### inbox processing. Can be either a real file, or standard input.
 
264
####
 
265
 
 
266
sub process_mail_file
 
267
{
 
268
  my ($dbh, $file_name) = @_;
 
269
  my (%values, $type, $check);
 
270
 
 
271
  $file_name =~ s/.*[\/]// if ($opt_no_path);
 
272
 
 
273
  %values = ();
 
274
  $type = "";
 
275
  $check = 0;
 
276
  while (<FILE>)
 
277
  {
 
278
    chop;
 
279
    chop if (substr($_, -1, 1) eq "\r");
 
280
    if ($type ne "message")
 
281
    { 
 
282
      if (/^Reply-To:\s*(.*)/i)
 
283
      {
 
284
        $type = "reply";
 
285
        $values{$type} = $1;
 
286
      }
 
287
      elsif (/^From: (.*)/i)
 
288
      {
 
289
        $type = "from";
 
290
        $values{$type} = $1;
 
291
      }
 
292
      elsif (/^To: (.*)/i)
 
293
      {
 
294
        $type = "to";
 
295
        $values{$type} = $1;
 
296
      }
 
297
      elsif (/^Cc: (.*)/i)
 
298
      {
 
299
        $type = "cc";
 
300
        $values{$type} = $1;
 
301
      }
 
302
      elsif (/^Subject: (.*)/i)
 
303
      {
 
304
        $type = "subject";
 
305
        $values{$type} = $1;
 
306
      }
 
307
      elsif (/^Message-Id:\s*(.*)/i)
 
308
      {
 
309
        $type = "message_id";
 
310
        s/^\s*(<.*>)\s*/$1/;
 
311
        $values{$type} = $1;
 
312
      }
 
313
      elsif (/^In-Reply-To:\s*(.*)/i)
 
314
      {
 
315
        $type = "in_reply_to";
 
316
        s/^\s*(<.*>)\s*/$1/;
 
317
        $values{$type} = $1;
 
318
      }
 
319
      elsif (/^Date: (.*)/i)
 
320
      {
 
321
        date_parser($1, \%values, $file_name);
 
322
        $type = "rubbish";
 
323
      }
 
324
      # Catch those fields that we don't or can't handle (yet)
 
325
      elsif (/^[\w\W-]+:/)
 
326
      {
 
327
        $type = "rubbish";
 
328
      }
 
329
      elsif ($_ eq "")
 
330
      { 
 
331
        $type = "message";
 
332
        $values{$type} = "";
 
333
      }
 
334
      else
 
335
      {
 
336
        s/^\s*/ /;
 
337
        if ($type eq 'message_id' || $type eq 'in_reply_to')
 
338
        {
 
339
          s/^\s*(<.*>)\s*/$1/;
 
340
        }
 
341
        $values{$type} .= $_;
 
342
      }
 
343
    }
 
344
    elsif ($check != 0 && $_ ne "") # in case of forwarded messages
 
345
    {
 
346
      $values{$type} .= "\n" . $_;
 
347
      $check--;
 
348
    }
 
349
    elsif (/^From .* \d\d:\d\d:\d\d\s\d\d\d\d/ ||
 
350
           /^From .* \d\d\d\d\s\d\d:\d\d:\d\d/)
 
351
    {
 
352
      $values{'hash'} = checksum("$values{'message'}");
 
353
      update_table($dbh, $file_name, \%values);
 
354
      %values = ();
 
355
      $type = "";
 
356
      $check = 0;
 
357
    }
 
358
    elsif (/-* forwarded message .*-*/i) # in case of forwarded messages
 
359
    {
 
360
      $values{$type} .= "\n" . $_;
 
361
      $check++;
 
362
      $mail_forwarded++;
 
363
    }
 
364
    else
 
365
    {
 
366
      $values{$type} .= "\n" . $_;
 
367
    }
 
368
  }
 
369
  if (defined($values{'message'}))
 
370
  {
 
371
    $values{'hash'} = checksum("$values{'message'}");
 
372
    update_table($dbh, $file_name, \%values);
 
373
  }
 
374
}
 
375
 
 
376
####
 
377
#### get date and timezone
 
378
####
 
379
 
 
380
sub date_parser
 
381
{
 
382
  my ($date_raw, $values, $file_name, $tmp) = @_;
 
383
 
 
384
  # If you ever need to change this test, be especially careful with
 
385
  # the timezone; it may be just a number (-0600), or just a name (EET), or
 
386
  # both (-0600 (EET), or -0600 (EET GMT)), or without parenthesis: GMT.
 
387
  # You probably should use a 'greedy' regexp in the end
 
388
  $date_raw =~ /^\D*(\d{1,2})\s+(\w+)\s+(\d{2,4})\s+(\d+:\d+)(:\d+)?\s*(\S+.*)?/;
 
389
 
 
390
  if (!defined($1) || !defined($2) || !defined($3) || !defined($4) ||
 
391
      !defined($months{$2}))
 
392
  {
 
393
    if ($opt_debug || $opt_stop_on_error)
 
394
    {
 
395
      print "FAILED: date_parser: 1: $1 2: $2 3: $3 4: $4 5: $5\n";
 
396
      print "months{2}: $months{$2}\n";
 
397
      print "date_raw: $date_raw\n";
 
398
      print "Inbox filename: $file_name\n";
 
399
    }
 
400
    exit(1) if ($opt_stop_on_error);
 
401
    $values->{'date'} = "";
 
402
    $values->{'time_zone'} = "";
 
403
    return;
 
404
  }
 
405
  $tmp = $3 . "-" . $months{$2} . "-" . "$1 $4";
 
406
  $tmp.= defined($5) ? $5 : ":00";
 
407
  $values->{'date'} = $tmp;
 
408
  print "INSERTING DATE: $tmp\n" if ($opt_debug);
 
409
  $values->{'time_zone'} = $6;
 
410
}
 
411
 
 
412
####
 
413
#### Insert to table
 
414
#### 
 
415
 
 
416
sub update_table
 
417
{
 
418
  my($dbh, $file_name, $values) = @_;
 
419
  my($q, $tail, $message);
 
420
 
 
421
  if (!defined($values->{'subject'}) || !defined($values->{'to'}))
 
422
  {
 
423
    $mail_no_subject_f++;
 
424
    return;                     # Ignore these
 
425
  }
 
426
  $message = $values->{'message'};
 
427
  $message =~ s/^\s*//; # removes whitespaces from the beginning 
 
428
 
 
429
 restart:
 
430
  $message =~ s/[\s\n>]*$//; # removes whitespaces and '>' from the end
 
431
  $values->{'message'} = $message;
 
432
  foreach $tail (@remove_tail)
 
433
  {
 
434
    $message =~ s/$tail//;
 
435
  }
 
436
  if ($message ne $values->{'message'})
 
437
  {
 
438
    $message =~ s/\s*$//; # removes whitespaces from the end
 
439
    $mail_fixed++;
 
440
    goto restart;         # Some mails may have duplicated messages
 
441
  }
 
442
 
 
443
  $q = "INSERT INTO my_mail (";
 
444
  $q.= "mail_id,";
 
445
  $q.= "message_id,";
 
446
  $q.= "in_reply_to,";
 
447
  $q.= "date,";
 
448
  $q.= "time_zone,";
 
449
  $q.= "mail_from,";
 
450
  $q.= "reply,";
 
451
  $q.= "mail_to,";
 
452
  $q.= "cc,";
 
453
  $q.= "sbj,";
 
454
  $q.= "txt,";
 
455
  $q.= "file,";
 
456
  $q.= "hash";
 
457
  $q.= ") VALUES (";
 
458
  $q.= "NULL,";
 
459
  $q.= (defined($values->{'message_id'}) ?
 
460
        $dbh->quote($values->{'message_id'}) : "NULL");
 
461
  $q.= ",";
 
462
  $q.= (defined($values->{'in_reply_to'}) ?
 
463
        $dbh->quote($values->{'in_reply_to'}) : "NULL");
 
464
  $q.= ",";
 
465
  $q.= "'" . $values->{'date'} . "',";
 
466
  $q.= (defined($values->{'time_zone'}) ?
 
467
        $dbh->quote($values->{'time_zone'}) : "NULL");
 
468
  $q.= ",";
 
469
  $q.= defined($values->{'from'}) ? $dbh->quote($values->{'from'}) : "NULL";
 
470
  $q.= ",";
 
471
  $q.= defined($values->{'reply'}) ? $dbh->quote($values->{'reply'}) : "NULL";
 
472
  $q.= ",";
 
473
  $q.= defined($values->{'to'}) ? $dbh->quote($values->{'to'}) : "NULL";
 
474
  $q.= ",";
 
475
  $q.= defined($values->{'cc'}) ? $dbh->quote($values->{'cc'}) : "NULL"; 
 
476
  $q.= ","; 
 
477
  $q.= $dbh->quote($values->{'subject'});
 
478
  $q.= ",";
 
479
  $q.= $dbh->quote($message);
 
480
  $q.= ",";
 
481
  $q.= $dbh->quote($file_name);
 
482
  $q.= ",";
 
483
  $q.= "'" . $values->{'hash'} . "'";
 
484
  $q.= ")";
 
485
 
 
486
  # Don't insert mails bigger than $opt_max_mail_size
 
487
  if (length($message) > $opt_max_mail_size)
 
488
  {
 
489
    $mail_too_big++;
 
490
  }
 
491
  # Don't insert mails without 'From' field
 
492
  elsif (!defined($values->{'from'}) || $values->{'from'} eq "")
 
493
  {
 
494
    $mail_no_from_f++;
 
495
  }
 
496
  elsif ($opt_test)
 
497
  {
 
498
    print "$q\n";
 
499
    $mail_inserted++;
 
500
  }
 
501
  # Don't insert mails without the 'message'
 
502
  elsif ($message eq "") 
 
503
  {
 
504
    $mail_no_txt_f++;
 
505
  }
 
506
  elsif ($dbh->do($q))
 
507
  {
 
508
    $mail_inserted++;
 
509
  }
 
510
  # This should never happen. This means that the above q failed,
 
511
  # but it wasn't because of a duplicate mail entry
 
512
  elsif (!($DBI::errstr =~ /Duplicate entry /))
 
513
  {
 
514
    die "FATAL: Got error :$DBI::errstr\nAttempted query was: $q\n";
 
515
  }
 
516
  else
 
517
  {
 
518
    $mail_duplicates++;
 
519
    print "Duplicate mail: query: $q\n" if ($opt_debug);
 
520
  }
 
521
  $q = "";
 
522
}
 
523
 
 
524
####
 
525
#### In case you have two identical messages we wanted to identify them
 
526
#### and remove additionals;  We do this by calculating a hash number of the
 
527
#### message and ignoring messages with the same from, date and hash.
 
528
#### This function calculates a simple 32 bit hash value for the message.
 
529
####
 
530
 
 
531
sub checksum
 
532
{
 
533
  my ($txt)= @_;
 
534
  my ($crc, $i, $count);
 
535
  $count = length($txt);
 
536
  for ($crc = $i = 0; $i < $count ; $i++)
 
537
  {
 
538
    $crc = (($crc << 1) + (ord (substr ($txt, $i, 1)))) +
 
539
      (($crc & (1 << 30)) ? 1 : 0);
 
540
    $crc &= ((1 << 31) -1);
 
541
  }
 
542
  return $crc;
 
543
}
 
544
 
 
545
####
 
546
#### my_which is used, because we can't assume that every system has the
 
547
#### which -command. my_which can take only one argument at a time.
 
548
#### Return values: requested system command with the first found path,
 
549
#### or undefined, if not found.
 
550
####
 
551
 
 
552
sub my_which
 
553
{
 
554
  my ($command) = @_;
 
555
  my (@paths, $path);
 
556
 
 
557
  return $command if (-f $command && -x $command);
 
558
  @paths = split(':', $ENV{'PATH'});
 
559
  foreach $path (@paths)
 
560
  {
 
561
    $path = "." if ($path eq "");
 
562
    $path .= "/$command";
 
563
    return $path if (-f $path && -x $path);
 
564
  }
 
565
  return undef();
 
566
}
 
567
 
 
568
####
 
569
#### usage and version
 
570
####
 
571
 
 
572
sub usage
 
573
{  
 
574
  my ($VER)= @_;
 
575
  
 
576
  if ($opt_version)
 
577
  {
 
578
    print "$progname version $VER\n";
 
579
  } 
 
580
  else
 
581
  {
 
582
    print <<EOF;
 
583
$progname version $VER
 
584
 
 
585
Description: Insert mails from inbox file(s) into a table. This program 
 
586
can read group [mail_to_db] from the my.cnf file. You may want to have db
 
587
and table set there at least.
 
588
 
 
589
Usage: $progname [options] file1 [file2 file3 ...]
 
590
or:    $progname [options] --create [file1 file2...]
 
591
or:    cat inbox | $progname [options] --stdin
 
592
 
 
593
The last example can be used to read mails from standard input and can
 
594
useful when inserting mails to database via a program 'on-the-fly'.
 
595
The filename will be 'READ-FROM-STDIN' in this case.
 
596
 
 
597
Options:
 
598
--help             Show this help and exit.
 
599
--version          Show the version number and exit.
 
600
--debug            Print some extra information during the run.
 
601
--host=...         Hostname to be used.
 
602
--port=#           TCP/IP port to be used with connection.
 
603
--socket=...       MySQL UNIX socket to be used with connection.
 
604
--db=...           Database to be used.
 
605
--user=...         Username for connecting.
 
606
--password=...     Password for the user.
 
607
--stdin            Read mails from stdin.
 
608
--max_mail_size=#  Maximum size of a mail in bytes.
 
609
                   Beware of the downside letting this variable be too big;
 
610
                   you may easily end up inserting a lot of attached 
 
611
                   binary files (like MS Word documents etc), which take
 
612
                   space, make the database slower and are not really
 
613
                   searchable anyway. (Default $opt_max_mail_size)
 
614
--create           Create the mails table. This can be done with the first run.
 
615
--test             Dry run. Print the queries and the result as it would be.
 
616
--no_path          When inserting the file name, leave out any paths of
 
617
                   the name.
 
618
--stop_on_error    Stop the run, if an unexpected, but not fatal error occurs
 
619
                   during the run. Without this option some fields may get
 
620
                   unwanted values. --debug will also report about these.
 
621
EOF
 
622
  }
 
623
  exit(0);
 
624
}