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:
Hier nun Version 3.0. Sie unterstützt nun zuverlässig Dateien mit Leerzeichen und auch Outlook wird unterstützt 😉
Outlook hängt Anhänge ohne (vernünftigen) Content-Type an die Email. PDFPrintbutler ermittelt den Typ der Anhänge nun selber.
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. #
- # #
- #########################################################################
- # 0 means true
- # !0 means false
- activateArchiv=0
- # Trailing slash!
- archivFolder="/media/docs/PDFPrintButler/`date "+%Y%m%d"`/"
- pdfprintbutlermailaddress=printingathome@sebastian-just.de
- pdfprintbutlercommonname=PDFPrintButler
- ################## NO CHANGE BELOW THIS LINE !!! ########################
- 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 archiveDocument {
- documentFile="$1"
- fileName="$2"
- subfolder="$subject"
- subfolder=${subfolder/:/_}
- if [ $activateArchiv -eq 0 ]; then
- if [ ! -d "$archivFolder/$subfolder" ]; then
- mkdir -m 755 -p "$archivFolder/$subfolder"
- fi
- cp "$1" "$archivFolder/$subfolder/$fileName"
- chmod 644 "$archivFolder/$subfolder/$fileName"
- fi
- }
- function processZipFile {
- tempFile="$1"
- mimeName="$2"
- tempDir=`mktemp -d`
- 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`
- processFile $tempDir/$singleFile $singleFile $mimeType
- done
- IFS=$SAVEIFS
- rm -rf $tempDir
- rm $tempFile
- }
- function printFile {
- tempFile="$1"
- mimeName="$2"
- lp -t "$mimeName" $tempFile> /dev/null
- archiveDocument $tempFile "$mimeName"
- rm $tempFile
- }
- function processFile {
- echo "processFile $1 - $2 - $3 "
- tempFile="$1"
- mimeName="$2"
- mimeType="$3"
- # List taken from http://www.cups.org/articles.php?L205+TFAQ+Q
- isPrintableMime $mimeType
- isPrintable=$?
- if [ $isPrintable -eq 0 ]; then
- echo " $mimePart: Printing $mimeName as $mimeType.">> $logFile
- printFile $tempFile "$mimeName"
- else
- if [ $mimeType == "application/zip" ]; then
- echo " $mimePart: Unzipping $mimeName as $mimeType.">> $logFile
- processZipFile $tempFile "$mimeName"
- else
- echo " $mimePart: *Skipping* this part because $mimeType isn't supported!">> $logFile
- fi
- fi
- }
- function processMessagePart {
- mimePart=$1
- tempFile=`mktemp`
- reformime -e -s $mimePart $tempFile
- mimeType=`file -b -i $tempFile|awk '{print $1}'`
- mimeHeader=`reformime -s $mimePart -i < $mailMessage`
- mimeName=`echo "$mimeHeader" | grep content-disposition-filename | awk '{ for(i=2; i> $logFile
- 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)}}'`
- subject=`echo $subject | sed 's/^ *//g' | sed 's/ *$//g'`
- from=`cat $mailMessage | grep -m 1 '^From:' | awk '{ for(i=2; i> $logFile
- for mimePart in `reformime -s > $logFile
- cat < <EOM | /usr/sbin/sendmail -F"$pdfprintbutlercommonname" -f"$pdfprintbutlermailaddress" "$from"
- To: $from
- Subject: $pdfprintbutlercommonname finished [$subject]
- X-Mailer: PDFPrintButler [v3.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!