Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

Text aus Email-Datei extrahieren via command-line

Alles rund um das Internet, Internet-Anwendungen (E-Mail, Surfen, Cloud usw.) und das Einrichten von Netzwerken einschl. VPN unter Linux

Moderator: Moderatoren

Benutzeravatar
OsunSeyi
Hacker
Hacker
Beiträge: 373
Registriert: 27. Mai 2006, 01:28

Text aus Email-Datei extrahieren via command-line

Beitrag von OsunSeyi » 1. Mär 2019, 07:37

Hi,

Ich versuche, den reinen Text aus einer email zu extrahieren.

Ok, der Head ist durch eine Leerzeile vom Body getrennt, das geht mit sed '1,/^$/d' welches den Head entfernt. Die Anhänge sind durch einen Trenner gekennzeichnet (--_ oder -=_).

Das ist aber anscheinen doch zu schwierig für mich... hat bisher alles nicht richtig geklappt.

Der nächste Versuch wäre, irgendwie mit 'metamail' zu arbeiten...

Wäre es eine Website und nicht eine Mail, ginge zB 'lynx -dump', nicht aber zB das Claws-Mail so etwas anböte wie 'claws-mail -dump file'...

Hätte nie gedacht, daß es derart schwierig zu sein scheint, einfach nur simpel den Textteil einer Email zu extrahieren, wäre toll, wenn ihr einen Tip hättet!

tom

Werbung:
marce
Advanced Hacker
Advanced Hacker
Beiträge: 1159
Registriert: 19. Jun 2008, 13:16
Wohnort: Dettenhausen
Kontaktdaten:

Re: Text aus Email-Datei extrahieren via command-line

Beitrag von marce » 1. Mär 2019, 09:06

Google meint https://stackoverflow.com/a/38868936

Mehr oder weniger komplexe sed, awk, perl, php, ...-Lösungen finden sich sicherlich auch.

Benutzeravatar
OsunSeyi
Hacker
Hacker
Beiträge: 373
Registriert: 27. Mai 2006, 01:28

Re: Text aus Email-Datei extrahieren via command-line

Beitrag von OsunSeyi » 1. Mär 2019, 10:00

pipe the message into:

| formail -I ''
part of the procmail package.
Den Head mit sed zu entfernen ist tatsächlich sehr einfach, aber der Rest ist schwierig.
Ich will nur den Text!

Subject usw ist mit egrep '^Subject:' auch simpel.

https://github.com/xai/mail2text/blob/m ... il2text.pl
klappt hier nicht, weil Perl: "you may need to install the Email::MIME module"
Bin hier auf Salix und habe verschiedenens zu Perl-mime installiert..trotzdem

Code: Alles auswählen

	cat $FILE		|\
	sed '1,/Content-Type: text.plain/d'						|\
	sed 's/^Content-Transfer-Encoding.*$//g'					|\
	sed '/Content-Type/,$d'					
Das obige scheint zu gehen:
Alles bis "Content-Type: text.plain" entfernen und falls vorhanden die Zeile Content-Transfer-Encoding...
Das sollte alles *vor* dem Text-Teil der Nachricht sein.

Ab dem nächsten 'Content-Type' kann dann wiederum alles weggelassen werden.

Warscheinlich muss noch mehr gefrickelt werden, sieht aber (bisher) ganz gut aus...

Gräfin Klara
Hacker
Hacker
Beiträge: 415
Registriert: 23. Jun 2008, 20:51

Re: Text aus Email-Datei extrahieren via command-line

Beitrag von Gräfin Klara » 1. Mär 2019, 12:21

Das Extrahieren von Text aus Mails ist einfach aber die Interpretation schwierig.
Ein "Bodytext" kann aus vielen unterschiedlichsten Formaten bestehen.
Angefangen von nur Text oder HTML aber auch von seltsamen Mischformen aus
Text <Html/> bis zur Darstellung von Sonderzeichen wie Umlaute, die in unterschiedlichen
Kodierungen oder gar in HTML Notationen daherkommen können. Dazu Bilder und Attachements,
die ihrerseits wieder unterschiedlich kodiert in den bodytext eingebettet werden.
Es gibt noch eine Menge mehr solcher "Spezialitäten". Das alles hängt ab vom
verwendeten E.Mail client des Absenders aber auch von der Konfiguration desselben
durch den Anwender.

Es ist schwierig und aufwendig, das alles bei der Programmierung zu berücksichtigen.
Wenn ich das realisieren müsste, würde ich folgend vorgehen:

Es gibt ja Programme, die dir die Arbeit des Interpretierens abnehmen können.
Das sind logischerweise E-Mail clients. Solche gibt es auf Basis Console,
wie z. Alpine, Mutt und mehr, auch unter Perl gibt es fertige clients oder modules.
Lass die für dich arbeiten und greif das Resultat ab. Das sollte einfach sein

Gruß
Gräfin Klara

Benutzeravatar
OsunSeyi
Hacker
Hacker
Beiträge: 373
Registriert: 27. Mai 2006, 01:28

Re: Text aus Email-Datei extrahieren via command-line

Beitrag von OsunSeyi » 1. Mär 2019, 13:39

Ja, so etwas im Sinne von zB 'lynx -dump file' oder 'links -dump file' wäre super. habe aber nicht unbedingt Lust, deswegen alle möglichen mailer zu installieren (sprich: um zu probieren, ob sie das können).

Schau mir mal die website von mutt an...

Code: Alles auswählen

-a      attach a file to a message
-c      specify a carbon-copy (Cc) address
-F      specify an alternate file to read initialization commands
-f      specify a mailbox to load
-i      specify a file to include in a message composition
-n      do not read the system Muttrc
-p      recall a postponed message
-s      specify a subject (enclose in quotes if it contains spaces)
-v      show version number and compile-time definitions
-z      exit immediately if there are no messages in the mailbox
Möglicherweise -i , aber ich glaub's eher nicht.

Bei Alpine schein es ähnlich zu sein:
https://www.washington.edu/alpine/tech- ... -line.html

Metamail habe ich extra deswegen installiert, da kommt es aber häufig vor, daß es multiparted messages nicht bearbeiten kann.

Thunderbird hat eine extension, die das kann, natürlich nur von der GUI aus..
Btw, reines Html zu Text zu konvertieren ist eigentlich nicht so schwer.

Aber warum es da anscheinend keinen Bedarf gibt, via Command-line an den Text einer Mail zu kommen, bleibt mir unerschlossen...

Gräfin Klara
Hacker
Hacker
Beiträge: 415
Registriert: 23. Jun 2008, 20:51

Re: Text aus Email-Datei extrahieren via command-line

Beitrag von Gräfin Klara » 1. Mär 2019, 13:55

OsunSeyi hat geschrieben:
1. Mär 2019, 13:39
Möglicherweise -i , aber ich glaub's eher nicht.
All diese switches sind zum Erstellen von mails. Steht ja dort: ... a message composition
Das brauchst du nicht.

Der client soll die mails nur lesen und auf die console ausgeben.
Das kann nur Text sein und genau den willst du

Benutzeravatar
OsunSeyi
Hacker
Hacker
Beiträge: 373
Registriert: 27. Mai 2006, 01:28

Re: Text aus Email-Datei extrahieren via command-line

Beitrag von OsunSeyi » 1. Mär 2019, 13:59

Hab mutt installiert, mutt file tut's jedenfalls nicht

Code: Alles auswählen

cat file
X-Mozilla-Status: 0001
X-Mozilla-Status2: 00800000
X-Mozilla-Keys:                                                                                 
Message-ID: <54608DCA.50401@t-online.de>
Date: Mon, 10 Nov 2014 11:04:58 +0100
From: Osun Seyi <OsunSeyi@t-online.de>
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20131204 Thunderbird/17.0.11
MIME-Version: 1.0
To:
......
This is a multi-part message in MIME format.
--------------050600050400090307070203
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
......
mutt -f file
file ist keine Mailbox.

marce
Advanced Hacker
Advanced Hacker
Beiträge: 1159
Registriert: 19. Jun 2008, 13:16
Wohnort: Dettenhausen
Kontaktdaten:

Re: Text aus Email-Datei extrahieren via command-line

Beitrag von marce » 1. Mär 2019, 14:09

Wo liegt denn dein Problem mit formail? Liefert doch genau das was Du willst - bei einer reinen Textmail den Text ohne alles.

Bei einer MultiPart-Mail musst Du eben noch den Block mit dem "Content-Type text/plain;" herausschneiden - mit ein bisserl cat / grep / sed in einem Shell-Script sollte das recht unfallfrei sein.

... oder lös das Problem, warum Du das Perl-Modul nicht installiert bekommst. Als Slackwarer sollte das eigentlich auf der linken Arschbacke zu erledigen sein.

Benutzeravatar
OsunSeyi
Hacker
Hacker
Beiträge: 373
Registriert: 27. Mai 2006, 01:28

Re: Text aus Email-Datei extrahieren via command-line

Beitrag von OsunSeyi » 1. Mär 2019, 15:13

formail -I "" liefert den body, das geht auch mit sed '1,/^$/d'.

Es ist wie gesagt kein Problem, den Header loszuwerden.

Im Augenblick scheint es so am besten zu gehen:

Code: Alles auswählen

	FILE=$1
	 TMP=$SRC/tmp/mail2txt.tmp
	
	cat $FILE									|\
											 \	FILE=$1
	 TMP=$SRC/tmp/mail2txt.tmp
	
	cat $FILE									|\
											 \
#		alle Einträge *vor* dem Text:
											 \
		sed '1,/Content-Type: text.plain/d'					|\
		sed 's|^Content-Transfer-Encoding.*$||g'				|\
											 \
#		alles *nach* dem Text:
											 \
		sed '/Content-Type/,$d'							|\
		sed '/^On [0-9]/,$d'							|\
											 \
#		alles weiteren Ersetzungen:
											 \
		grep -v '\-\-\-'							 \
											 \
	> $TMP

#	GGF IN UTF UMWANDELN  ////////////////////////////////////////////////////////////

	test_iso=`file $TMP | grep 'ISO'`

	if [ -n "$test_iso" ] ; then

		cat $TMP | iso2utf
	else
		cat $TMP
	fi

exit 0

#		alle Einträge *vor* dem Text:
											 \
		sed '1,/Content-Type: text.plain/d'					|\
		sed 's|^Content-Transfer-Encoding.*$||g'				|\
											 \
#		alles *nach* dem Text:
											 \
		sed '/Content-Type/,$d'							|\
		sed '/^On [0-9]/,$d'							|\
											 \
#		alles weiteren Ersetzungen:
											 \
		grep -v '\-\-\-'							 \
											 \
	> $TMP

# GGF IN UTF UMWANDELN

	test_iso=`file $TMP | grep 'ISO'`

	if [ -n "$test_iso" ] ; then

		cat $TMP | iso2utf
	else
		cat $TMP
	fi

exit 0
Tut mir leid, der Code sieht hier im Eingabefeld scheußlich aus :???:
Grundsätzlich wäre mir der Weg über ein dafür gemachtes Programm lieber

Gräfin Klara
Hacker
Hacker
Beiträge: 415
Registriert: 23. Jun 2008, 20:51

Re: Text aus Email-Datei extrahieren via command-line

Beitrag von Gräfin Klara » 1. Mär 2019, 16:09

OsunSeyi hat geschrieben:
1. Mär 2019, 13:59
Hab mutt installiert, mutt file tut's jedenfalls nicht

file ist keine Mailbox.
Natürlich mußt du deine mails nach format mbox konvertieren.
Dafür reicht eine einzige Kommandozeile und schon liefert mutt was du willst.
Einfacher geht's nicht.

Benutzeravatar
OsunSeyi
Hacker
Hacker
Beiträge: 373
Registriert: 27. Mai 2006, 01:28

Re: Text aus Email-Datei extrahieren via command-line

Beitrag von OsunSeyi » 1. Mär 2019, 17:29

Ja, ich nehme eine mbox-Datei und mutt öffnet sich ohne mucken, wie ich die darin enthaltenen Mails überhaupt nur zu Gesicht bekomme weiß ich nicht, von dumpen ganz zu schweigen.

Also: filetype application/mbox
Nehme ich message/rfc822 (also eine einzelne Mail) öffnet mutt -f diese nicht.

https://github.com/xai/mail2text/blob/m ... il2text.pl

ist interessant, bringt aber die Fehlermeldung:

Code: Alles auswählen

Can't locate Email/MIME.pm in @INC (you may need to install the Email::MIME module)
Installiert ist:

perl-MIME-Light
perl-MIME-tools
perl-MailTools

...und mehr, aber zum Thema "MIME" habe ich keine weiteren gefunden, die fehlen könnten.

marce
Advanced Hacker
Advanced Hacker
Beiträge: 1159
Registriert: 19. Jun 2008, 13:16
Wohnort: Dettenhausen
Kontaktdaten:

Re: Text aus Email-Datei extrahieren via command-line

Beitrag von marce » 1. Mär 2019, 19:13

Gibt's dort via Paketmanager die Möglichkeit zu suchen, in welchem OS-Paket die Datei enthalten ist?

Alternativ - CPAN.

Benutzeravatar
OsunSeyi
Hacker
Hacker
Beiträge: 373
Registriert: 27. Mai 2006, 01:28

Re: Text aus Email-Datei extrahieren via command-line

Beitrag von OsunSeyi » 1. Mär 2019, 20:07

Nicht gefunden, habe versucht, mit 'cpan i /Email-Stuffer-0.017.tar.gz/ zu installieren, ist aber fehlgeschlagen.

Code: Alles auswählen

2 dependencies missing (Email::MIME::Creator,Email::MIME); additionally test harness failed
  /usr/bin/make test -- NOT OK
Ich hatte https://metacpan.org/pod/Email::Stuffer so verstanden, daß Email::MIME ein Bestandteil von Email-Stuffer ist.

Ok:

Code: Alles auswählen

cpan  i /Email-MIME-1.946.tar.gz/
...

one dependency not OK (Email::MIME::ContentType); additionally test harness failed
  /usr/bin/make test -- NOT OK
Das ist das Problem bei diesen Sachen... entweder es klappt oder man verzettelt sich hoffnungslos..

@Marce:
Als Slackwarer sollte das eigentlich auf der linken Arschbacke zu erledigen sein.
:lol: :thumbs:

abgdf
Guru
Guru
Beiträge: 3219
Registriert: 13. Apr 2004, 21:15

Re: Text aus Email-Datei extrahieren via command-line

Beitrag von abgdf » 2. Mär 2019, 01:05

Python kann das recht gut. Wenn Du ein bißchen Python kannst.
Ich hatte mal ein kurzes Skript geschrieben, das Email-Anhänge extrahiert und speichert (seltsamerweise schwirrt das Skript noch irgendwo 'rum und ist anscheinend einigermaßen beliebt).
Den Text zu bekommen wäre sicher auch nicht weiter schwierig. Module (die meist schon dabei sind - "Batteries included") wären "poplib", "email" und "email.utils".

marce
Advanced Hacker
Advanced Hacker
Beiträge: 1159
Registriert: 19. Jun 2008, 13:16
Wohnort: Dettenhausen
Kontaktdaten:

Re: Text aus Email-Datei extrahieren via command-line

Beitrag von marce » 2. Mär 2019, 09:04

OsunSeyi hat geschrieben:
1. Mär 2019, 20:07
Das ist das Problem bei diesen Sachen... entweder es klappt oder man verzettelt sich hoffnungslos..

@Marce:
Als Slackwarer sollte das eigentlich auf der linken Arschbacke zu erledigen sein.
:lol: :thumbs:
-> Lesen, verstehen, Build-Tools nachinstallieren. :-)

uhelp
Member
Member
Beiträge: 115
Registriert: 25. Nov 2012, 19:33

Re: Text aus Email-Datei extrahieren via command-line

Beitrag von uhelp » 6. Mär 2019, 15:14

Du wirst das nicht mit der Shell schaffen.
Dazu ist die Mail- Codiererei viel zu komplex.

Im Wesentlichen musst du einen eigenen Parser dafür schreiben, alle möglichen Codierungen erst einmal in UTF-8 zu übersetzen. Clients können in einer Zeile US-ASCII gemischt mit transkodierten (siehe Mail RFCs) UTF-8 enthalten. Bunt durcheinander gewürfelt. Sie können auch andere Codierungen mischen. Willst du das zuverlässig erledigen, brauchst du für alle Kombinationen jeweils einen Test und einen "Translator".
Dann musst du erst mal gucken, ob der "Mailtext" in dieser Multipart- Mail (heute sind nahezu alle Mails Mulitpart) Text und HTML, nur Text, oder nur HTML ist. Clients können alle Varianten, und der User kann das, je nach Client und Gusto, beliebig einstellen. Dann musst du die Multipart- Ketten zusammenbasteln.

Im günstigsten Falle liegt eine Mail mit nur "Text" vor. Dann ist es (fast) easy, den zu extrahieren, WENN du alle Zeichen korrekt nach UTF-8 sicher transkodiert hast.

Ist kein Plain-Text (in egal welcher Codierung) enthalten, musst die Multiparts auseinander dividieren.
Den HTML Multipart extrahieren und das HTML in Text umwandeln.

Natürlich kann eine Mail auch Attachments enthalten. Auch die musst du in den Multiparts erst einmal erkennen und aussieben.

All diese Jobs sind ganz sicher keine Jobs für die Shell.
Und wenn dann unsicher und doomed to fail.

Wie schon ein paar geschrieben haben: Nimm einen Mailclient für CLI und lerne den. Alle davon können Mails als Text speichern. Guck dir mal Alpine an.

abgdf
Guru
Guru
Beiträge: 3219
Registriert: 13. Apr 2004, 21:15

Re: Text aus Email-Datei extrahieren via command-line

Beitrag von abgdf » 6. Mär 2019, 17:04

uhelp hat geschrieben:
6. Mär 2019, 15:14
Du wirst das nicht mit der Shell schaffen. Dazu ist die Mail- Codiererei viel zu komplex.
Warum schreibst Du das, nachdem ich gerade geschrieben hatte, daß mein Python-Skript das kann?

Hab' es gerade mal modifiziert, so daß es die Anhänge in Ruhe läßt, und einfach nur die Textnachrichten speichert:

Code: Alles auswählen

#!/usr/bin/python
# coding: utf-8

import poplib
import email
import email.utils
import datetime
import os
import sys

#
# attsave2.py (Linux-Club version 2019)
# Check emails at PROVIDER and save the plain text messages to SAVEDIR.
#
# Written by abgdf@gmx.net, 2017, 2019 License: GNU GPL, Version 3.

""" 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
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    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
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

    Dieses Programm ist Freie Software: Sie können es unter den Bedingungen
    der GNU General Public License, wie von der Free Software Foundation,
    Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren
    veröffentlichten Version, weiter verteilen und/oder modifizieren.

    Dieses Programm wird in der Hoffnung bereitgestellt, dass es nützlich sein wird, jedoch
    OHNE JEDE GEWÄHR,; sogar ohne die implizite
    Gewähr der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK.
    Siehe die GNU General Public License für weitere Einzelheiten.

    Sie sollten eine Kopie der GNU General Public License zusammen mit diesem
    Programm erhalten haben. Wenn nicht, siehe <https://www.gnu.org/licenses/>.
"""

PROVIDER = "pop.xyz.xyz"
USER = "original_poster@linux.net"
PASSWORD = "his_password"

SAVEDIR = "/home/user/mailsaves"

#######################

EMAILDIR = os.path.join(SAVEDIR, "emails")
ATTDIR = os.path.join(SAVEDIR, "attachments")

class MyEmail:

    def __init__(self, client, nr):
        self.client = client
        self.nr = nr
        self.mail = None
        self.getMailFromServer()
        self.messages = []
        self.attachmentnames = []
        self.getPlainMessages()

    def getMailFromServer(self):
        lines = client.retr(self.nr)[1]
        self.mail = email.message_from_string("\n".join(lines))

    def checkForAttachments(self):
        x = False
        for part in self.mail.walk():
            if part.get_filename() != None:
                x = True
                break
        return x

    def getPlainMessages(self):
        for part in self.mail.walk():
            if part.get_content_type() == 'text/plain':
                self.messages.append(part.get_payload())

    def saveAttachments(self):
        for part in self.mail.walk():
            fn = part.get_filename()
            if fn != None:
                self.attachmentnames.append(fn)
                fn = self.getTimeStampFromEmailDate() + "__" + self.getSender() + "__" + fn
                fh = open(os.path.join(ATTDIR, fn), "wb")
                fh.write(part.get_payload(decode = True))
                msg = 'Found attachment in email from "' + self.mail['From'] + '" '
                msg += 'with subject "' + self.mail["Subject"] + '". '
                msg += 'Saved it to "' + fn + '".\n'
                print msg
                fh.close()

    def getSender(self):
        a = self.mail['From']
        b = a.split("<")
        if len(b) < 2:
            return ""
        b = b[1].split(">")
        sender = b[0]
        r = {"@" : "_at_", " " : "_", "Ä" : "Ae", "Ö" : "Oe",
             "Ü" : "Ue", "ä" : "ae", "ö" : "oe", "ü" : "ue",
             "ß" : "sz", "." : "_dot_"}
        for i in r.keys():
            sender = sender.replace(i, r[i])
        return sender

    def getTimeStampFromEmailDate(self):
        # Code from: http://stackoverflow.com/questions/1790795/parsing-date-with-timezone-from-an-email
        date_str = self.mail['Date']
        date = None
        if date_str:
            date_tuple = email.utils.parsedate_tz(date_str)
            if date_tuple:
                date = datetime.datetime.fromtimestamp(email.utils.mktime_tz(date_tuple))
        if date:
            return date.strftime("%d%m%y_%H%M%S")
        else:
            return "nodate"

    def saveMessages(self):
        text = ["From: " + self.mail['From'],
                "Date: " + self.mail['Date'],
                "", "Subject: " + self.mail['Subject'], "",
                "Message: "]
        text.extend(self.messages)
        text.append("")
        text.append("Attachments: ")
        for i in self.attachmentnames:
            text.append(i)
        fn = self.getTimeStampFromEmailDate() + "__" + self.getSender() + ".txt"
        fh = open(os.path.join(EMAILDIR, fn), "w")
        for i in text:
            fh.write(i + "\n")
        print 'Writing email "' + fn + '" as plain text.'
        print
        fh.close()

    def writeOnlyMailMessage(self):
        fn = self.getTimeStampFromEmailDate() + "__" + self.getSender() + ".txt"
        fh = open(os.path.join(EMAILDIR, fn), "w")
        for i in self.messages:
            fh.write(i + "\n")
        print 'Writing email "' + fn + '" as plain text.'
        print
        fh.close()


def checkServerListChange(firstlist, secondlist):
    if len(firstlist) != len(secondlist):
        return True
    for i in range(len(firstlist)):
        if firstlist[i] != secondlist[i]:
            return True
    return False

def notFound(client, msg, nr):
    print msg
    if nr != 1:
        client.quit()
    sys.exit(nr)

if not os.path.exists(EMAILDIR):
    os.mkdir(EMAILDIR)

if not os.path.exists(ATTDIR):
    os.mkdir(ATTDIR)

try:
    client = poplib.POP3_SSL(PROVIDER)
except:
    notFound(None, "Error: Provider not found.", 1)

client.user(USER)
client.pass_(PASSWORD)

firstlist = client.list()[1]

anzahl_mails = len(client.list()[1])
if anzahl_mails == 0:
    notFound(client, "No mails found on server.", 2)

for i in range(anzahl_mails):
    one_mail = MyEmail(client = client, nr = i + 1)
    one_mail.writeOnlyMailMessage()

client.quit()

marce
Advanced Hacker
Advanced Hacker
Beiträge: 1159
Registriert: 19. Jun 2008, 13:16
Wohnort: Dettenhausen
Kontaktdaten:

Re: Text aus Email-Datei extrahieren via command-line

Beitrag von marce » 6. Mär 2019, 17:50

wenn man Klugscheißen wöllte, könnte man sagen "ein Python-Script ist nicht die shell".

Natürlich geht es an der Shell - alles geht an der Shell, sogar Bildbearbeitung. Mit dem entsprechenden Tool kann man alles machen.

Nur "nur mit Shell-Mitteln" (oder was i.A. darunter verstanden wird - also sowas wie sed, grep, cat, ...) geht es eben nicht.

abgdf
Guru
Guru
Beiträge: 3219
Registriert: 13. Apr 2004, 21:15

Re: Text aus Email-Datei extrahieren via command-line

Beitrag von abgdf » 6. Mär 2019, 20:33

Stimmt schon; ich bin auch kein Freund vom Programmieren in bash. Weil man da immer so mit den Strings und den Subshells aufpassen muß. Wenn möglich, weiche ich also auf Perl und Python aus. Da ich das jetzt schon seit bestimmt über 10 Jahren hier schreibe, weiß das der eine oder andere vielleicht. ;)

Die Sache mit den Mail-Texten hatte ich auch schonmal in der Shell probiert. mutt konnte das komischerweise nicht. War immer noch zu "graphisch". Wirklich Nur-Text war "snail", das komischerweise auch unter dem Namen "mailx" firmiert. Damit müßte das eigentlich auch gehen (nur das mit den Anhängen wohl eher nicht). Wenn man mit dem Linux-Mailsystem klarkommt (postfix, fetchmail, usw.). Die meisten nehmen inzwischen wohl eher Windows-artige, integrierte Programme wie kmail und Thunderbird, die auch unabhängig vom Linux-Mailsystem arbeiten.

Im Moment speichert mein Python-Skript das Ergebnis ab (weil es ja ursprünglich um die Anhänge ging). Natürlich kann man das Skript auch so kürzen, daß das Ergebnis einfach auf dem Bildschirm ausgegeben wird. Dann kann man den Output weiter verarbeiten, wo und wie man möchte (sed, whatever).
Ist natürlich pop3, mit imap kenne ich mich nicht aus.

Benutzeravatar
OsunSeyi
Hacker
Hacker
Beiträge: 373
Registriert: 27. Mai 2006, 01:28

Re: Text aus Email-Datei extrahieren via command-line

Beitrag von OsunSeyi » 7. Mär 2019, 00:58

Also, meine Shell-Bastelei reicht natürlich auch nicht ansatzweise an Eure Kenntnisse heran. Zu meinem Entsetzen habe ich festgestellt, daß es auch Mails gibt, die:

Code: Alles auswählen

Content-Type: text/plain;
 charset=utf-8
Content-Transfer-Encoding: base64

U2VociBnZWVocnRlciBIZXJyIEJyw7Z0amUsDQoNCnZpZWxlbiBEYW5rIGbDvHIgSWhyZSBOYWNo
cmljaHQuIERlciBWb3JnYW5nIGlzdCBmw7xyIGRhcyBHZW5lcmFsa29uc3VsYXQgYWJnZXNjaGxv
c3Nlbi4gRGllIGVudHNjaGVpZHVuZ3NyZWxldmFudGVuI
Da bin ich mit meinem Latein am Ende!

@abgdf:

Vielen Dank für das angepasste Script!

Ich möchte gerne kurz erklären, worum es mir genau geht:

Claws-Mail erlaubt es, Mails von der GUI aus per Button an ein oder mehrere Scripte zu leiten, wählt man als Option path/to/script %f wird die ganze Mail weitergegeben.

Mit dieser Option können auch alle in der Mailliste markierten Emails exportiert werden.
Daraus erwächst die Möglichkeit, aus einem längeren Mailwechsel ein Dokument zu machen:

Alle betroffenen Einzelmails mit "%f" exportieren, mittels "mail2text" den einen reinen Textauszug erstellen, diesen chronologisch richtig in eine Datei leiten.

Dazu muss ich die Mails nicht mittels Pop3 vom Server holen, das macht ja bereits Claws-Mail! Ich muss nur die von Claws bereits exportierten Dateien vom Typ message/rfc822 an mein (bislang schreckliches) "mail2text" schicken und bekomme den Text ausgespuckt.

Wird nun "mail2text" das Absendedatum auch mitschicken, ist es kein Problem, daraus einen Timestamp zu machen und chronologisch zu sortieren.

Leider kann ich kein Python, darum wird es mir nicht möglich sein, das Script entsprechend zu modifizieren. Ich denke an `cat message | mail2text > message.txt`.

@uhelp:

alpine -F file Open named text file and view with Alpine's browser.

Habe ich versucht, mit besagter Mail, die (Tatsache) den Plain-Mailtext base64 codiert übermittelt:

Alpine öffnet den Text genau wie die Beschreibung sagt als Textdatei und parst garnichts.

Natürlich, wenn ich eine Mail in Mutt oder Alpine (vom Server) öffne, kann ich diese als Textdatei exportieren. Aber ich suche eine analoge Funktion zu "lynx -dump file.html".

Ps zu base64:
Hab probiert den Text mit "cat file | base64 --decode" zu entschlüsseln, was aber auch nicht so einfach zu sein scheint. Vermutlich sind es die Zeilenumbrüche im Code, die entfernt werden müssten.

Meine rudimentären Kenntnisse: "cat file | tr '\n' ' ' | sed 's/ //g' | base64 --decode".
Geht auch nicht...

Wie gesagt, meine Kenntnisse sind rudimentär, und es ist schwierig - schwierig - schwierig.
Selbst wenn man den Nachrichtenteil zuverlässig herauslöst. Der Header ist dabei kein Problem.

Als Trenner kann ein einfaches '--' am Zeilenanfang hergenommen werden, das reicht für meine Zwecke.
Aber es gibt auch Abschnutte, die zwischen Header und Nachrichtenteil liegen.

Also müsste die Mail erst auf die vorhandenen Abschnitte (Text, Html usw) geprüft werden, bevor konvertiert werden kann.

Ich habe nach längerem Suchen eine passable deutschsprachige Erklärung hier gefunden:
https://www.drweb.de/aufbau-von-mime-mails-2/

Für Html reicht es, <br> durch \n zu ersetzen und ansonsten alle Tags zu entfernen und Entities zu ersetzen.
Für plain Text könnte es reichen, ggF mit iconv nach utf8 zu konvertieren,
und Ersetzungen wie "sed 's|=c3=84|Ä|gi'" durchzuführen.

Aber dann noch base64 kodierten Text? Das wird mir langsam zu heftig...
'doomed to fail' trifft es wohl ganz gut...

Bisher habe ich "formail" und "metamail" probiert, beide können es anscheinend nicht:

"formail" scheint dafür nicht konzipiert zu sein.

"metamail" kann nicht mit "multipart/alternative message" umgehen und behauptet Beispielsweise bei einer Mail immerhin von der deutschen Botschaft, sie wäre fehlerbehaftet und daher nicht lesbar.

so what...
alles Zeitverschwendung und sonst nichts?
Es gibt doch etliche Systeme, die automatisiert Mails weiterverarbeiten?
:schockiert:

Nachtrag base64:
openssl enc -d -base64 -in file-in-base64
...klappt! Aber Achtung, unmittelbar am Block kann ein '=...' hängen, welches zuvor entfernt werden muss..
:zensur:

Antworten