Wäre es nicht schön auch vom Firmenlaptop (ohne Admin-Rechte) aus zu Hause zu drucken?
Wäre es nicht klasse von unterwegs ein wichtiges Dokument schonmal zu Hause auszudrucken?
Kein Problem: CUPS und ein wenige Bash-Scripting machen es per Mail möglich:
Dies ist die überarbeitete Version 🙂
Bitte Version 3.0 verwenden!
Features
- Alle Attachments einer Mail werden mittels CUPS ausgedurckt
- Es werden diese Formate unterstützt:
- BMP
- JPEG
- PNG>
- GIF
- TIFF
- Und noch ein paar komische Unix-Bilddateiformate die kein Mensch nutzt 😉
- ZIP-Archive
ZIP-Archive als Attachment werden entpackt und die o.g. Dateiformate können dann gedruckt wereden. Weiter verschachtelte ZIPs werden nicht verarbeitet.
Es können, müssen aber nicht mehrere Dateien in einer ZIP-Datei vorhanden sein. - Bestätigungsmail wird nach der verarbeitung an den Auftraggeber geschickt
Installation
Diese Installation ist nicht für absolute Linux-Anfänger geeignet. (Ich bin einfach zu faul alles aufzuschreiben 😉 ).
Ich helfe aber gerne wenn es spezifische Fragen gibt (Einfach per Kommentar oder Email fragen).
Was gilt es zu tun:
Die lokale Mailzustellung muss soweit funktionieren. Ich verwende Postfix mit Fetchmail und Procmail. Jede andere Konfiguration bei der Procmail die lokale Zustellung übernimmt sollte aber auch funktionieren.
Lokalen Benutzer einrichten. Hier wird im folgenden der Benutzer ‚pdfprintbutler‘ verwendet. Als procmail.rc kommt folgendes Rezept zum Einsatz:
PATH=$HOME/bin:/usr/bin:/bin:/usr/local/bin:.
MAILDIR=$HOME/Maildir/
DEFAULT=$HOME/Maildir/
LOGFILE=$MAILDIR/procmail.log
:0 f
| /home/pdfprintbutler/pdfprintbutler.bsh > /var/log/pdfprintbutler 2>&1
Entsprechend bitte die Logdatei anlegen (touch) und dem pdfprintbutler-User Schreibrechte auf dieser Datei gewähren.
Als letztes noch das eigentliche Programm „installieren“. Einfach dieses Script
- #!/bin/bash
- #########################################################################
- # PDFPrintButler #
- # PDFPrintButler takes a given mail and extracts its attachments. #
- # If such an attachment is pritable it #
- # is passed to lp for printing. #
- # #
- #########################################################################
- # Copyright (C) 2010 by Sebastian Just #
- # zeeman@zeeman.de #
- # #
- # 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 2 of the License, or #
- # (at your option) any later version. #
- # #
- #########################################################################
- function isPrintableMime {
- # List taken from http://www.cups.org/articles.php?L205+TFAQ+Q
- case $1 in
- "application/pdf"|\
- "application/postscript"|\
- "image/bmp"|\
- "image/gif"|\
- "image/jpeg"|\
- "image/png"|\
- "image/x-portable-anymap"|\
- "image/x-portable-bitmap"|\
- "image/x-portable-graymap"|\
- "image/x-portable-pixmap"|\
- "image/tiff")
- return 0;
- ;;
- *)
- return 1;
- ;;
- esac
- }
- function printMessagePart {
- mimePart=$1
- tempFile=`mktemp`
- reformime -e -s $mimePart $tempFile
- echo " $mimePart: Printing $mimeName as $mimeType." >> $logFile
- lp -t "$mimeName" $tempFile > /dev/null
- rm $tempFile
- }
- function processZippedMessagePart {
- mimePart=$1
- tempFile=`mktemp`
- tempDir=`mktemp -d`
- reformime -e -s $mimePart $tempFile
- unzip $tempFile -d $tempDir > /dev/null
- SAVEIFS=$IFS
- IFS=$(echo -en "\n\b")
- for singleFile in `ls $tempDir`; do
- mimeType=`file -b -i $tempDir/$singleFile`
- isPrintableMime $mimeType
- isPrintable=$?
- if [ $isPrintable -eq 0 ]; then
- echo " $mimePart: Printing $mimeName/$singleFile as $mimeType." >> $logFile
- lp -t "$singleFile" $tempDir/$singleFile > /dev/null
- else
- echo " $mimePart: *Skipping* $singleFile/$mimeName because $mimeType isn't supported!" >> $logFile
- fi
- done
- IFS=$SAVEIFS
- rm -rf $tempDir
- rm $tempFile
- }
- function processMessagePart {
- mimePart=$1
- mimeHeader=`reformime -s $mimePart -i < $mailMessage`
- mimeType=`echo "$mimeHeader" | grep content-type | awk '{print $2}'`
- mimeName=`echo "$mimeHeader" | grep content-disposition-filename | awk '{ for(i=2; i> $logFile
- fi
- fi
- }
- logFile=`mktemp`
- mailMessage=`mktemp`
- cat /dev/stdin > $mailMessage
- subject=`cat $mailMessage |grep -m 1 '^Subject:' | awk '{ for(i=2; i< =NF; i++) {printf("%s ", $i)}}'`
- from=`cat $mailMessage | grep -m 1 '^From:' | awk '{ for(i=2; i> $logFile
- for mimePart in `reformime -s < $mailMessage | grep 1\..`; do
- processMessagePart $mimePart $mailMessage
- done
- echo "Finished." >> $logFile
- cat << EOM | /usr/sbin/sendmail -FPDFPrintbutler -fyourprivateemailhere@example.com $from
- To: $from
- Subject: PDFPrintButler finished [$subject]
- X-Mailer: PDFPrintButler [v2.0]
- `cat $logFile`
- EOM
- cat $logFile
als ‚pdfprintbutler.bsh‘ ausführbar (!) im Homeverzeichnis (so wie procmailrc angegeben).
Benutzung
Nun einfach Mails an den Benutzer schicken (Alternativ kann man per fetchmail Emails aus einem anderen Postfach abholen und diesem User zustellen).
Unterstützt werden die o.g. Formate.
Sobald die Attachments an CUPS gespolt wurden wird eine Bestätigungsemail an den Absender geschickt.
Bitte daran denken, dass die Emailadresse im Script hinterlegt wird (sonst gibt es unschöne Mails) und die Emailadresse selber aber nicht publiziert wird.
Andernfalls gibt es sonst auch die Viaga-Spams als physikalischen Flyer 😉
Auch könnte über die ZIP-Datei ungewolltes auf den Computer kommen und den Unzipper zum Absturz bringen und somit ggf. schadhaften Code ausführen.
Um es kurz zu halten: Halte die Emailadresse geheim, auf der der PDFPrintButler lauscht!
Schönen Tag – und vielen Dank!
Habe den PdfPrintButler jetzt auch im Heimnetz aktiv.
Nutze fetchmail/procmail und hatte nur vergessen, eine lokale .forward-Datei zum Start des procmail anzulegen. Ansonsten funktionierte der Dienst jetzt auch bei mir quasi „out of the box“ wie beschrieben. Super!