PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : maildir in eml Dateien exportieren



detonation997
17.01.05, 11:30
Hello,

Ich hab ein maildir-Verzeichnis, und möchte den Inhalt (jede Datei enthält ein Mail) ins EML-Format konvertieren, damit man die Mails dann schön einzeln in einem MS-MUA (z.B. Outlook-Express) betrachten kann.

(Vorgeschichte ist das Löschen eines Mailkontos, sodass der User seine alten Mails noch auf CD zugeschickt bekommen kann).

Genügts den Dateien im maildir einfach ".eml" anzuhängen?

LG und Danke schon im Voraus,
Rainer

stefaan
17.01.05, 23:01
Servus!

Einen Cyrus-Imapd habe ich letztens folgendermaßen wiederhergestellt:
Cyrus verwendet ja u.a. auch eigene Indexdateien, ohne die nichts geht, die E-Mails jedoch liegen normal als Textdateien vor.
Also, Mailkonto hergenommen, die Maildateien per drag&drop in Outlook Express gezogen und schon war wieder alles da (Thunderbird kanns nicht).

*.eml schaut auch nach einer normalen Maildatei aus...

Bei 30 Usern nicht wirklich so schwer, aber seither wird auch die mailboxes.db im Textformat gesichert :D

Grüße, Stefan

detonation997
18.01.05, 07:04
Ich hab dann einfach ein perl-script geschrieben, das die Dateien nach dem

<from>__<subject>_UID_<msSinceEpoch>.eml

benennt. Dann können die Benutzer sogar im Dateibrowser schon erkennen, was sie erwartet, wenn sie sich die Datei ansehen (meist mit outlook-express verknüpft, der importiert das völlig korrekt).

Danke für deine Antwort!

LG Rainer

detonation997
18.01.05, 10:33
Hi,

wie versprochen das/die Scripte:

Das Perl-Script, das die Dateinamen aus deren Inhalt erzeugt:


#! /usr/bin/perl -w

#subjecter.pl
#written by Rainer Poisel

use Time::HiRes qw(time);
use strict;

my $subject = "";
my $from = "";
my $new_filename = "";

while(<>)
{
foreach ($_)
{
if($_ =~ /^subject/i)
{
($subject) = $_ =~ /subject: ?(.*)/i;
$subject =~ s/[^\w]+//g;
}
if($_ =~ /^from/i)
{
($from) = $_ =~ /from:.+?([\w_\-\.]+@[\w_\-]+\.[\w]{2,4})/i;
$from =~ s/@/_AT_/i;
$subject =~ s/\s+//g;
}

$new_filename = $from . "__" . $subject . "_UID_" . time();
}
}

print $new_filename;


Das Wrapper-Script, das dann von find aufgerufen werden kann:


#!/bin/bash
# written by Rainer Poisel

export source=${1}
export destination=`cat $1 | <path-o-subjecter.pl>/subjecter.pl`
export destinationdir=`dirname ${1}`
export destinationdirpref=${2}

mkdir -p "${destinationdirpref}/${destinationdir}"
echo "${source}" "=>" "${destinationdirpref}/${destinationdir}/${destination}.eml"

cp "${source}" "${destinationdirpref}/${destinationdir}/${destination}.eml"


Der Aufruf kann dann so erfolgen:


find /pfad -type f -exec <path-to-subjecter_wrapper>/subjecter_wrapper "{}" "/Zielpfad-Prefix" \;


Wichtig is zu wissen, dass
*) subjecter.pl von der Standardeingabe den Inhalt des Mails liest und den Dateinamen auf der Standardausgabe ausgibt
*) ein Shell-Script die Ausgabe des Perl-Scripts (subjecter.pl) in eine Variable speichert, und das dann zur Interpretation des Dateinamens herangezogen wird
*) die Time-Funktion dafür sorgt, dass der Dateiname so ziemlich nur einmalig sein kann

Wir versprochen ist die Geschichte wahnsinnig dirty, ich weiß :)
Ich hab leider nicht mehr als 2Std. Zeit gehabt...

Viel Spaß damit,
LG nach Deutschland :)
Rainer