instant-thinking.de

just enough to get you started and leave you confused

Mails versenden mit cron und perl

| Kommentare

Manchmal hat man ja so etwas: Man muss eine Mail zu einem bestimmtem Zeitpunkt abschicken, hat zu diesem Zeitpunkt aber besseres vor.

Bei mir war dieses Bedürfnis das Ergebnis der Vergabemodalitäten für die Fallstudien an der FOM:

  • Man kann sich ein Thema von einer Liste aussuchen
  • Um das Thema zugeteilt zu bekommen, muss man sich darum per Mail bewerben
  • Start der Vergabe war der 15. September 2008, 00:00:00 Uhr
  • Wer zuerst kommt, mahlt zuerst
  • Bewerbungen die einen Zeitstempel vom 14. Septemer 2008, 23:59:59 Uhr oder früher tragen werden gelöscht

Jetzt zeigt es sich: Ist man entweder Informatiker und schreibt nen Script, oder BWLer und bleibt eben wach…

Was ich bin dürfte den meisten hier ja klar sein, ausserdem schlafe ich gerne. Also habe ich folgendes getan:

Zuerst mal habe ich eine einfache Textdatei mit dem Bewerbungstext geschrieben und als emailmessage.txt gespeichert.

Zum versenden der Mail benutze ich nicht mein normales Mail-Programm, sondern das PerlScript sendEmail. Das ist sehr einfach in eigene Scripte einzubauen. Einfach runterladen, entpacken und in den $PATH kopieren. Ich habe das Script unter /usr/local/bin/ abgelegt.

SendEmail wird nun aus folgendem Shell-Script heraus aufgerufen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
\#!/bin/bash

FROM="me@here.de"
TO="steve@apple.com"
CC="foo.bar@noplace.com, bill.gates@microsoft.com"
SUBJECT="Betreffzeile"

MESSAGE="/path/to/emailmessage.txt"

SMTP="smtpserver.domain.de"
U="username"
PW="passwort"


/usr/local/bin/sendEmail -f "$FROM" -t "$TO" -cc "$CC" -u "$SUBJECT" -o message-file="$MESSAGE" -s "$SMTP" -xu "$U" -xp "$PW"

Am Anfang des Scripts trägt man einfach seine eigenen Daten ein, das sollte selbsterklärend sein. Die CC-Adressen kann man auch weg lassen wenn man nur einen Empfänger hat.

Als SMTP-Server, User und Passwort nimmt man am besten die gleichen Daten, die man auch in seinem Mail-Programm eigetragen hat.

Wenn man das Script dann soweit fertig hat wird es irgendwo gespeichert und per chmod +x ausführbar gemacht, bei mir kam es auf dem Desktop als mymail.sh unter.

Damit man nun nicht doch so lange wach bleiben muss um das Script auszuführen (und hinterher noch total übermüdet zwei Sekunden zu früh Enter drückt), richtet man einen cronjob ein.

Unter einem beliebigen Unix kommt man mit crontab -e zu seiner persönlichen cron-Tabelle, Mac-User können auch das hervorragende Cronnix benutzen. Dort trägt man für den Zeitpunkt 15. September, 00:00 Uhr folgendes ein:

00 00 15 9 * /Users/dennis/Desktop/mymail.sh

Für den 12. Oktober, 14:46 Uhr sähe das ganze so aus:

46 14 12 10 * /Users/dennis/Desktop/mymail.sh

Das Sternchen steht bei beiden jeweils dafür, dass es egal ist welcher Wochentag gerade ist und den Pfad zu dem Script muss man natürlich anpassen.

Und das wars auch schon, wenn der Zeitpunkt dann gekommen ist ruft cron das eingetragene Script auf, dieses wiederum verschickt die Mail mit der Hilfe von sendEmail und alle sind glücklich.

Am nächsten Tag findet man dann ausgeschlafenerweise so eine Mail in seinem Systempostfach, die den erfolgreichen Versand noch einmal bestätigt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
From dennis@macbook.home.xx  Mon Sep 15 00:00:03 2008
X-Original-To: dennis
Delivered-To: dennis@macbook.home.xx
From: dennis@macbook.home.xx (Cron Daemon)
To: dennis@macbook.home.xx
Subject: Cron <dennis@macbook> /Users/dennis/Desktop/mymail.sh
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=dennis>
X-Cron-Env: <USER=dennis>
X-Cron-Env: <HOME=/Users/dennis>
Date: Mon, 15 Sep 2008 00:00:03 +0200 (CEST)

Sep 15 00:00:03 macbook sendEmail[4997]: Email was sent successfully!

Damit die Mail nicht in einem Jahr noch mal abgeschickt wird (sofern Maildatei und Script dann noch an Ort und Stelle liegen) sollte man am Schluss nicht vergessen den cronjob auch wieder auszutragen.

Die Scripte sollten auf jedem Unix funktionieren und mit einigen Anpassungen (und installiertem Perl) kriegt man das vielleicht sogar unter Windows hin. Den Versuch überlasse ich aber wirklich gerne jemand anderem…

Comments