ubuntuusers.de

Mail mit Anhang per Script versenden

Status: Gelöst | Ubuntu-Version: Kubuntu 10.04 (Lucid Lynx)
Antworten |

Nobuddy

Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

Hallo zusammen,

ich suche eine einfache Lösung, für das Versenden von Mails mit Anhang.

Über ein Script, erstelle ich eine Bestell-Datei, die mein Lieferant erhalten soll.

Diese Bestelldatei möchte ich als Anhang per Script, an meinen Lieferanten regelmäßig senden.

-

Achtung!

- Nur Mail-Versand, kein Empfang - Die EMail-Adresse, an die gesendet wird, ist immer die Gleiche

Normalerweise verwende ich kmail, aber in diesem speziellen Fall, dachte ich mir daß das Einfachste ein Script dafür wäre.

Was mir jetzt noch fehlt, ist eben der Mailversand per Script.

Gibt es da eine einfache Lösung?

Grüße Nobuddy

DrScott Team-Icon

Ehemalige
Avatar von DrScott

Anmeldungsdatum:
7. Juli 2005

Beiträge: 6018

Wohnort: Nürnberg

Nobuddy

(Themenstarter)
Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

Hallo DrScott, das ging aber flott 👍

Mit dem Englisch tue ich mich leider schwer, wäre dies so richtig?

#!/bin/bash
#
mail username < /ORT/DATEI.123
echo "Bestellung" | mail lieferant@lieferant.de

Nobuddy

(Themenstarter)
Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

Hm, ... oder dies?

uuencode /ORT/DATEI.123 | mail lieferant@lieferant.de

busfahrer

Avatar von busfahrer

Anmeldungsdatum:
9. April 2007

Beiträge: 3052

Hallo Nobuddy

wenn ich die Beispiele richtig verstehe, dann sollte es wohl so funktionieren

uuencode DATEI.123 DATEI.123 | mail lieferant@lieferant.de

Gruß...busfahrer

DrScott Team-Icon

Ehemalige
Avatar von DrScott

Anmeldungsdatum:
7. Juli 2005

Beiträge: 6018

Wohnort: Nürnberg

Richtig gut wird es erst mit "metasend" oder noch besser "sendfile".

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Setzen die Lösungen nicht alle einen Mailserver vorraus?

toddy Team-Icon

Ikhayateam
Avatar von toddy

Anmeldungsdatum:
31. Juli 2007

Beiträge: 9522

Wohnort: Lüneburg

user unknown schrieb:

Setzen die Lösungen nicht alle einen Mailserver vorraus?

Hallo,

ja würde ich so sehen, denn ansonsten kann man den Befehl mail ja nicht richtig absetzen.

Liebe Grüße,
Torsten

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Für den Fall, dass du keinen lokalen Mailserver eingerichtet hast und das auch nicht tun willst: Wenn du sagst, dass du sonst KMail dafür benutzt, dann hast du wohl einen Smarthost? Sprich, du wirfst die Mails zum Beispiel dem Mailserver deines Providers zu und der kümmert sich dann um deren korrekten Versand? Dann wäre vielleicht mutt eine Idee. Das ist eigentlich ein vollwertiger MUA für die Konsole, der aber in Skripten verwendbar ist.

Du müsstest dir eine minimale ~/.muttrc als Konfigurationsdatei anlegen, zum Beispiel sowas:

set from="deine.adresse@example.org"
set copy=no
set smtp_url="smtp://benutzername:passwort@mailserver.deines.providers.example.org"

Dann kannst du Mails samt Attachment so verschicken:

$ echo "Kurzer Text, Daten von $(date)" | mutt -s "Irgendein Betreff" -a foodatei bardatei nocheinedatei -- lieferant@example.org

Nobuddy

(Themenstarter)
Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

Hallo und erstmal Danke an Alle, für Euren INPUT!

Wie ich sehe, gibt es da unterschiedliche Möglichkeiten.

Ich habe den Vorschlag von Vain getestet und muß sagen, daß dies ganz einfach umzusetzen ist und vor allem funktioniert es. ☺

Mußte nur meine entsprechende Daten eintragen, Danke Vain!

Jetzt habe ich noch eine Frage.

Ich habe 2 Ordner erstellt ($HOME/ExportMails und $HOME/SendMails).

Im Ordner $HOME/ExportMails kommen die Dateien rein, die als Anhang in der Mail verschickt werden sollen.

Den Ordner $HOME/SendMails habe ich dafür gedacht, daß nach erfolgreicher Versendung der Mail, diese dann in $HOME/SendMails gespeichert wird und in $HOME/ExportMails gelöscht wird.

Meine .muttrc sieht im Moment so aus:

set folder="$HOME/ExportMails"             # definiert das Arbeitsverzeichnis von mutt
set record="$HOME/SendMails"        # bewirkt, dass verschickte Mails in der Datei
                                    # 'sent' gespeichert werden

set editor="nano"                   # definiert den Editor, der zum Schreiben von 
                                    # Mails benutzt wird
my_hdr From: shop@officeplanet.de       # definiert den Kopf der Mails
my_hdr Reply-To: shop@officeplanet.de 

set delete=no                       # zum Testen werden Nachrichten erst
                                    # einmal nicht gelöscht
set pager_index_lines=8             # Teilt den Bildschirm in die Anzeige der Mail
                                    # und den Pager, hier 8 Zeilen groß

set from="shop@officeplanet.de"
set copy=no
set smtp_url="smtp://Benutzernamen:Passwort@Mailserver.de"

Was muß ich da in der .muttrc ändern und welche Einträge sind vielleicht überflüssig?

Grüße Nobuddy

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Hmm, wolltest du das nicht per Skript machen? ☺

Ich dachte, du hättest etwas in dieser Richtung vor:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash

# Wenn keine Dateien im Verzeichnis sind, dann versuche nicht, eine
# Datei namens "*" zu versenden.
shopt -s nullglob

# Verschicke jede Datei einzeln. Bei Erfolg, verschiebe sie.
for i in ~/ExportMails/*
do
	mutt -s "Datei $i" -a "$i" -- lieferant@example.org <<EOF
Hallo, Welt!

Das hier ist Datei $i. Bitte schön. :-)
EOF

	if (( $? == 0 ))
	then
		mv -v "$i" ~/SentMails/
	else
		echo "Fehler beim Senden der Mail für Datei $i." >&2
		exit 1
	fi
done

Dafür müsstest du an der .muttrc gar nichts ändern. Mutt wird lediglich als Versandprogramm benutzt, den Rest machst du selbst.

Ich bin mir aber auch nicht sicher, ob ich dich richtig verstanden habe. Denn:

Nobuddy schrieb:

Den Ordner $HOME/SendMails habe ich dafür gedacht, daß nach erfolgreicher Versendung der Mail, diese dann in $HOME/SendMails gespeichert wird und in $HOME/ExportMails gelöscht wird.

Was willst du speichern – die verschickte Mail oder den zu verschickenden Anhang? In ~/ExportMails sind ja noch keine fertigen Mails.

Das Skript oben verschiebt natürlich nur die Anhänge. Würdest du die von mutt erzeugten und verschickten Mails sichern wollen, dann würde ich ~/SentMails als Maildir betreiben. Das hat gegenüber der Default-Einstellung von mutt (mbox-Format) unter anderem den Vorteil, dass jede Mail eine eigene Datei wird. Dazu müsstest du in meiner .muttrc oben das set copy=no rausnehmen und dafür reinsetzen:

set mbox_type=Maildir
set record="~/SentMails"

Damit mutt das richtig erkennt, müsstest du lediglich noch die drei Unterverzeichnisse hier erstellen:

1
$ mkdir -p ~/SentMails/{cur,new,tmp}

Jede verschickte Mail wird dann im Verzeichnis ~/SentMails/cur abgelegt.

Oder hast du etwas ganz anderes vor? Dass du den Editor für mutt gesetzt hast, lässt mich daran zweifeln, dass ich auf dem richtigen Dampfer bin. 😈

Nobuddy

(Themenstarter)
Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

Hallo Vain,

Danke für Deine Hilfe, Dein Vorschlag funktioniert prima. 😉

Ich poste hier mal mein ganzes Script:

#!/bin/bash
#
# Aktuelles Datum im Format "JahrMonatTag", Beispiel: 12.08.2010 = 20100812
D=`date +"%Y%m%d"`

# Arbeitsordner
H=$HOME/Ordner1
H1=$HOME/ExportDateien
H2=$HOME/ExportMails
H3=$HOME/SendMails

# Arbeitsordner/Dateinamen
T=$H/$D.txt

# Wert
W=1

# Wert in Datei $T zählen.
y=0
for x in `cat $T`;
do y=$((y+$x));
done;
echo $y

# Zähler
ZZ=$((y+1))

# Überprüfung, Datei die nicht dem Datumsformat entspricht wird gelöscht und Datei mit aktuellem Datum wird erstellt, wenn diese nicht vorhanden ist.
if [ $H/*.txt != $H/$D.txt ];then
    rm $H/*.txt
    touch $H/$D.txt
fi

# In Datei $T werden die Zeilen mit "1" gezählt.
if [ $y = 0 ];then
    mv $H/OSBofficeplanet.ASC $H/$D"01".ASC
fi

if [ $ZZ -gt 0 -a $ZZ -lt 10 ];then
    mv $H/OSBofficeplanet.ASC $H/$D"0"$ZZ.ASC
fi

if [ $ZZ -gt 9 ];then
    mv $H/OSBofficeplanet.ASC $H/$D$ZZ.ASC
fi

# "1" wird in die Datei $T angehängt.
if [ $H/*.txt = $H/$D.txt ];then
    echo "1" | tee -a $T
fi

# Kopie nach ExportMails
cp $H/$D*.ASC $H2

# Sicherung der ExportDatei
mv $H/$D*.ASC $H1


# Auswahl Datei oder Ordner
function menu {
    choice=$(zenity --list --width=250 --height=200 --text "Wählen Sie Ihre Option!" --column "" --column "Nr" --column "Beschreibung" --hide-column 2 --radiolist --separator=" " --title "Untermenu" \
    false 1 "Bestellung abschicken" \
    false 2 "Beenden" )
}

menu

# EMail-Versand
if [ $choice = 1 ];then
  SUBJECT="Bestellung"
  #EMAIL="Lieferant@Lieferant.de"
  EMAIL="Meine@Mailadresse.de"	# ZumTesten, an eigene Mail-Adresse.
  EMAILANHANG="$H2/*.ASC"

  # Wenn keine Dateien im Verzeichnis sind, dann versuche nicht, eine
  # Datei namens "*" zu versenden.
  shopt -s nullglob

    # Verschicke jede Datei einzeln. Bei Erfolg, verschiebe sie.
    for i in $H2/*
    do
	  echo "$SUBJECT, $(date)" | mutt -s $SUBJECT -a $EMAILANHANG -- $EMAIL

	  if (( $? == 0 ));then
		mv -v "$i" $H3/
	  else
		echo "Fehler beim Senden der Mail für Datei $i." >&2
		exit 1
	  fi
    done
fi

if [ $choice = 2 ];then
      echo "Programm beendet." >&2
      exit 1
fi

Bitte nicht wundern, bin kein Profi, wahrscheinlich lässt sich manches besser bzw. einfacher gestalten.

Meine ~/.muttrc sieht so aus:

set mbox_type=Maildir
set folder="$HOME/ExportMails"          # definiert das Arbeitsverzeichnis von mutt
set record="$HOME/SendMails"        	# bewirkt, dass verschickte Mails in der Datei
					# 'sent' gespeichert werden

set editor="nano"                 	# definiert den Editor, der zum Schreiben von 
					# Mails benutzt wird
my_hdr From: shop@officeplanet.de       # definiert den Kopf der Mails
my_hdr Reply-To: shop@officeplanet.de 

set delete=no                       	# zum Testen werden Nachrichten erst
					# einmal nicht gelöscht
set pager_index_lines=8             	# Teilt den Bildschirm in die Anzeige der Mail
					# und den Pager, hier 8 Zeilen groß

set from="shop@officeplanet.de"
# set copy=no
set smtp_url="smtp://Benutzernamen:Passwort@Mailserver.de"

So, wie Du geschrieben hast, wird die verschickte mail in ~/SendMails/cur gespeichert und das ist genauso, wie ich es mir vorgestellt hatte, Super! 👍

Wenn ich jetzt mehrere Lieferanten nach diesem Schema, meine Bestellungen per Mail zukommen lassen wollte, würde ich wohl einen Mailserver benötigen, dann würde es so nicht mehr funktionieren. Das wäre dann wohl schon ein größerer Aufwand.

Grüße Nobuddy

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

if [ $choice = 2 ];then
      echo "Programm beendet." >&2
      exit 1
fi

Wenn der User beschliesst das Programm zu beenden wertest Du das als Fehler?

Man traut es sich kaum noch zu sagen, aber Backticks are deprecated.

for x in `cat $T`;

Nobuddy

(Themenstarter)
Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

Hallo user unknown,

meine Script-Programmierkenntnisse sind sehr begrenzt, daher freue ich mich immer, wenn ich auf grafierende Fehler hingewiesen werde, Danke. 😉

So, sollte dies besser aussehen:

if [ $choice = 2 ];then
      echo "Programm beendet."
      exit 0
fi

, oder ist dies immer noch nicht ganz sauber?

Sollte ich hier:

for x in `cat $T`;

, statt Backsticks Anführunszeichen verwenden, oder ganz weglassen?

Grüße Nobuddy

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Nobuddy schrieb:

So, sollte dies besser aussehen:

if [ $choice = 2 ];then
      echo "Programm beendet."
      exit 0
fi

, oder ist dies immer noch nicht ganz sauber?

Das ist besser, außer Du hättest einen ernsthaften Grund an dieser Stelle einen Fehler zu signalisieren, den ein anderes Programm detektieren kann, um darauf passend zu reagieren, also wenn ein anderes Programm davon abhängig wäre, dass das Skript durchgelaufen ist, und niemand "Beenden" gedrückt hat.

Allerdings ist das Programm hier sowieso zuende, es kommt nichts mehr, und es endet auch so mit exit 0, ohne dass man es hinschreibt. Das ist, wie wenn in einem Buch auf der letzten Seite "Ende" steht. Das Buch ist eh aus. Man sieht auch so, das nichts mehr kommt.

Sollte ich hier:

for x in `cat $T`;

, statt Backsticks Anführunszeichen verwenden, oder ganz weglassen?

for x in $(cat $T);
# und zuvor
D=`date +"%Y%m%d"`

ist empfehlenswert. Backticks werden je nach Schriftart schlecht erkannt, oder mit Apostrophs gerne verwechselt, und die $(... $(...$(...)))-Schreibweise läßt sich problemlos schachteln. Außerdem ist sie portabler über unterschiedliche Shells und sollte daher gerade in einem Anfängerforum propagiert werden.

Antworten |