• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Anhang aus E-Mail an Script übergeben

Status
Für weitere Antworten geschlossen.

ceegee

Hacker
Hallo,

ich glaube ich habe diese Frage hier schon mal gestellt, aber den Thread nicht mehr gefunden. Also verzeiht mir, dass ich nochmal Frage.

Ich möchte also, wie im Betreff genannt, einen Anhang, im Speziellen ein Word Dokument, aus einer E-Mail an ein Script übergeben. Zum besseren Verständnis der Hintergrund des Ganzen:

Auf der Internetseite einer Schule werden wöchentlich die Essenspläne online gestellt. Eine Lehrerin bekommt die Pläne als o.g. Word Dokument, kopiert den Inhalt raus und erstellt daraus eine HTML Seite. Die Firma die die Schule mit Essen, ergo auch mit den Essensplänen versorgt, wird nichts anderes als das Word Dokument schicken können.

Um das ganze zu automatisieren, würde ich gerne dieses Word Dokument an eine nur für diesen Zweck eingerichtet E-Mail Adresse schicken lassen und dort per Script verarbeiten, so dass als Resultat der Essensplan im Web erscheint.

Postfix läuft als SMTP-Server. Grundsätzlich kann man, soviel ich weiss, sowas in der Art machen, oder?

/etc/aliases:
Code:
essensplaene | /path/to/script

Bin ich da auf dem Holzweg oder könnte das so gehen?

Grüße und ein schönes Wochenende,

Christian
 

abgdf

Guru
Vielleicht hast Du seit Deinem letzten Posting gemerkt, daß das nicht so einfach ist.

Möglich wäre das damit:

http://www.python.org/doc/current/lib/module-email.html

Ein Beispiel für IMAP-Server:

http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/498189

Vielleicht kannst Du die Email mutt zuführen und dann das Attachment mit einer bestimmten Option von mutt direkt abspeichern. Diese Option kenne ich aber nicht.

Viele Grüße
 

oc2pus

Ultimate Guru
du kannst auch formail nutzen

hier ein Beispiel, wie man mit formail eine mail zerlegt in body und Text und Anhang: (unvollständig, da aus einem anderen Kontext kopiert !)
Aber es sollte dir eine Idee/Denkanstoß in die richtige Richtung geben.

Code:
#! /bin/sh

# split boundaries
function split_boundaries() {
        if grep -o "boundary=\"[A-Za-z0-9 '()+_,./:?-]*[A-Za-z0-9'()+_,./:?-]\"" header > boundary; then
                . boundary
                eboundary=`sed 's/[()+.?]/\\&/g' <<< "$boundary"`
                csplit body "/^--$eboundary/" '{*}' # xx00, xx01, ...
                for i in xx??; do
                        if head -1 $i | egrep "^--$eboundary\$" > /dev/null; then
                                "ANHANG berbeiten"
                        fi
                done
        else
                rm boundary
        fi
}

# no blank lines
formail -f -X '' < "$EMAILFILE"  > header

# remove blank lines at top/bottom
formail -I '' < "$EMAILFILE"  | sed '/^$/d' > body

# split boundaries
split_boundaries
als Parameter bekommt das skript eine "Original"-email.
 

abgdf

Guru
Interessant !

Ansonsten schien noch "mailx" ganz vielversprechend zu sein.
Obwohl dieser Client zahlreiche Befehle kennt und auch nur über Befehle zu bedienen ist, scheint er doch nicht wirklich programmierbar zu sein :shock:.

Es gibt zwar "source Datei", aber das muß man in mailx immer noch eingeben ...
In der Config-Datei kann man zwar auch Befehle eingeben, sogar etwa
Code:
if receive
    write ...
endif
aber wenn man dann so startet, sagt er, er könne das noch nicht ausführen, weil er noch nicht ganz hochgefahren sei. Ein nichtinteraktiver Modus wird zwar erwähnt, aber nicht beschrieben. Sehr merkwürdig.
Vielleicht kriegt's jemand anders hin ...

Viele Grüße
 

abgdf

Guru
Hallo,

da oben hab ich Käse geschrieben :oops:, "mailx" ist doch programmierbar.
Wär ja sonst auch zu seltsam gewesen. Man kann ganz einfach Kommandos per Pipe übergeben.

Das führt zu einer einfachen Lösung :D :

1. Man richtet ein Linux-Mailing-System ein, so daß man Emails mit "fetchmail" in "/var/mail/user" empfängt.

2. Man erzeugt ein Verzeichnis mit "mkdir /home/user/mymail". Dort tut man ein Script "comm" hinein, das so aussieht:

Code:
if receive
    write /home/user/mymail/mailtext
endif

3. Man erzeugt in "/home/user/mymail" ein zweites Script "scr", das so aussieht:

Code:
#!/bin/bash
echo "source /home/user/mymail/comm" | mailx

4. Hat man dann eine Email mit .doc-Anhang mit "fetchmail" empfangen, ruft man im Verzeichnis "/home/user/mymail" das Skript "scr" mit "./scr" auf. "mailx" speichert dann den Nachrichtentext in "mailtext" und zusätzlich den .doc-Anhang in das gerade aktuelle Verzeichnis mit dem Dateinamen, den "mailx" der Email entnehmen konnte.
Fertig :p.

Vielleicht genügt nach Nr. 1 auch einfach, mailx mit
Code:
echo "write /home/user/mymail/mailtext" | mailx
aufzurufen.

Viele Grüße
 

abgdf

Guru
... und so geht das in Python mit POP3.
Hier ist keine "fetchmail"-Einrichtung oder dergleichen erforderlich.
Bitte nur die eigenen Daten für

Code:
PROVIDER = "pop.YourMailProvider.de"
USER = "YourUserName"
PASSWORD = "YourPassword"
SAVEDIR = "/home/YourUserDirectory"

selbst im Skript eintragen. Die gefundenen Attachments werden dann (ohne Nachfragen wegen Überschreiben etc.) nach SAVEDIR gespeichert:

Code:
#!/usr/bin/env python

import poplib
import email
import os
import sys
import string

#
# attsave.py
# Check emails at PROVIDER for attachments and save them to SAVEDIR.
#
# Written by abgdf@gmx.net, 2007, License: LGPL.
#

PROVIDER = "pop.YourMailProvider.de"
USER = "YourUserName"
PASSWORD = "YourPassword"

SAVEDIR = "/home/YourUserDirectory"


def saveAttachment(mstring):

    filenames = []
    attachedcontents = []

    msg = email.message_from_string(mstring)

    for part in msg.walk():

        fn = part.get_filename()

        if fn <> None:
            filenames.append(fn)
            attachedcontents.append(part.get_payload())

    for i in range(len(filenames)):
        fp = file(SAVEDIR + "/" + filenames[i], "wb")
        fp.write(attachedcontents[i])
        print 'Found and saved attachment "' + filenames[i] + '".'
        fp.close()

try:
    client = poplib.POP3(PROVIDER)
except:
    print "Error: Provider not found."
    sys.exit(1)

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

anzahl_mails = len(client.list()[1])

for i in range(anzahl_mails):
    lines = client.retr(i + 1)[1]
    mailstring = string.join(lines, "\n")
    saveAttachment(mailstring)

client.quit()

Der Code ist schön kurz, oder ? :).

Viele Grüße
 
Status
Für weitere Antworten geschlossen.
Oben