PDFPrintButler – Version 3.0

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:
    • PDF
    • 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

  1. #!/bin/bash
  2. #########################################################################
  3. #  PDFPrintButler                                                       #
  4. #  PDFPrintButler takes a given mail and extracts its attachments.      #
  5. #  If such an attachment is pritable it                                 #
  6. #  is passed to lp for printing.                                        #
  7. #                                                                       #
  8. #########################################################################
  9. #  Copyright (C) 2010 by Sebastian Just                                 #
  10. #  zeeman@zeeman.de                                                     #
  11. #                                                                       #
  12. #  This program is free software; you can redistribute it and/or modify #
  13. #  it under the terms of the GNU General Public License as published by #
  14. #  the Free Software Foundation; either version 2 of the License, or    #
  15. #  (at your option) any later version.                                  #
  16. #                                                                       #
  17. #########################################################################
  18. # 0 means true
  19. # !0 means false
  20. activateArchiv=0
  21. # Trailing slash!
  22. archivFolder="/media/docs/PDFPrintButler/`date "+%Y%m%d"`/"
  23. pdfprintbutlermailaddress=printingathome@sebastian-just.de
  24. pdfprintbutlercommonname=PDFPrintButler
  25.  
  26. ################## NO CHANGE BELOW THIS LINE !!! ########################
  27. function isPrintableMime {
  28.                 # List taken from http://www.cups.org/articles.php?L205+TFAQ+Q
  29.                 case $1 in
  30.                                 "application/pdf"|\
  31.                                 "application/postscript"|\
  32.                                 "image/bmp"|\
  33.                                 "image/gif"|\
  34.                                 "image/jpeg"|\
  35.                                 "image/png"|\
  36.                                 "image/x-portable-anymap"|\
  37.                                 "image/x-portable-bitmap"|\
  38.                                 "image/x-portable-graymap"|\
  39.                                 "image/x-portable-pixmap"|\
  40.                                 "image/tiff")
  41.                                                 return 0;
  42.                                 ;;
  43.                                 *)
  44.                                                 return 1;
  45.                                 ;;
  46.                 esac
  47. }
  48. function archiveDocument {
  49.         documentFile="$1"
  50.         fileName="$2"
  51.         subfolder="$subject"
  52.         subfolder=${subfolder/:/_}
  53.         if [ $activateArchiv -eq 0 ]; then
  54.                 if [ ! -d "$archivFolder/$subfolder" ]; then
  55.                         mkdir -m 755 -p "$archivFolder/$subfolder"
  56.                 fi
  57.                 cp "$1" "$archivFolder/$subfolder/$fileName"
  58.                 chmod 644 "$archivFolder/$subfolder/$fileName"
  59.         fi
  60. }
  61. function processZipFile {
  62.         tempFile="$1"
  63.         mimeName="$2"
  64.         tempDir=`mktemp -d`
  65.         unzip $tempFile -d $tempDir> /dev/null
  66.         SAVEIFS=$IFS
  67.         IFS=$(echo -en "\n\b")
  68.         for singleFile in `ls $tempDir`; do
  69.                 mimeType=`file -b -i $tempDir/$singleFile`
  70.                 processFile $tempDir/$singleFile $singleFile $mimeType
  71.         done
  72.         IFS=$SAVEIFS
  73.         rm -rf $tempDir
  74.         rm $tempFile
  75. }
  76. function printFile {
  77.         tempFile="$1"
  78.         mimeName="$2"
  79.  
  80.         lp -t "$mimeName" $tempFile> /dev/null
  81.         archiveDocument $tempFile "$mimeName"
  82.         rm $tempFile
  83. }
  84. function processFile {
  85.         echo "processFile $1 - $2 - $3 "
  86.         tempFile="$1"
  87.         mimeName="$2"
  88.         mimeType="$3"
  89.         # List taken from http://www.cups.org/articles.php?L205+TFAQ+Q
  90.         isPrintableMime $mimeType
  91.         isPrintable=$?
  92.         if [ $isPrintable -eq 0 ]; then
  93.                 echo "  $mimePart: Printing $mimeName as $mimeType.">> $logFile
  94.                 printFile $tempFile "$mimeName"
  95.         else
  96.                 if [ $mimeType == "application/zip" ]; then
  97.                         echo "  $mimePart: Unzipping $mimeName as $mimeType.">> $logFile
  98.                         processZipFile $tempFile "$mimeName"
  99.                 else
  100.                         echo "  $mimePart: *Skipping* this part because $mimeType isn't supported!">> $logFile
  101.                 fi
  102.         fi
  103. }
  104. function processMessagePart {
  105.         mimePart=$1
  106.         tempFile=`mktemp`
  107.         reformime -e -s $mimePart  $tempFile
  108.         mimeType=`file -b -i $tempFile|awk '{print $1}'`
  109.         mimeHeader=`reformime -s $mimePart -i < $mailMessage`
  110.         mimeName=`echo "$mimeHeader" | grep content-disposition-filename | awk '{ for(i=2; i> $logFile
  111.         fi
  112.  
  113. }
  114. logFile=`mktemp`
  115. mailMessage=`mktemp`
  116. cat /dev/stdin> $mailMessage
  117. subject=`cat $mailMessage |grep -m 1 '^Subject:' | awk '{ for(i=2; i< =NF; i++) {printf("%s ", $i)}}'`
  118. subject=`echo $subject | sed 's/^ *//g' | sed 's/ *$//g'`
  119. from=`cat $mailMessage | grep -m 1 '^From:' | awk '{ for(i=2; i> $logFile
  120. for mimePart in `reformime -s > $logFile
  121. cat < <EOM | /usr/sbin/sendmail -F"$pdfprintbutlercommonname" -f"$pdfprintbutlermailaddress" "$from"
  122. To: $from
  123. Subject: $pdfprintbutlercommonname finished [$subject]
  124. X-Mailer: PDFPrintButler [v3.0]
  125. `cat $logFile`
  126. EOM
  127. 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!

Schreibe einen Kommentar