PDFPrintButler – Version 2.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:

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:
    • 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. function isPrintableMime {
  19.         # List taken from http://www.cups.org/articles.php?L205+TFAQ+Q
  20.         case $1 in
  21.                 "application/pdf"|\
  22.                 "application/postscript"|\
  23.                 "image/bmp"|\
  24.                 "image/gif"|\
  25.                 "image/jpeg"|\
  26.                 "image/png"|\
  27.                 "image/x-portable-anymap"|\
  28.                 "image/x-portable-bitmap"|\
  29.                 "image/x-portable-graymap"|\
  30.                 "image/x-portable-pixmap"|\
  31.                 "image/tiff")
  32.                         return 0;
  33.                 ;;
  34.                 *)
  35.                         return 1;
  36.                 ;;
  37.         esac
  38. }
  39.  
  40. function printMessagePart {
  41.         mimePart=$1
  42.         tempFile=`mktemp`
  43.         reformime -e -s $mimePart  $tempFile
  44.         echo "     $mimePart: Printing $mimeName as $mimeType." >> $logFile
  45.         lp -t "$mimeName" $tempFile > /dev/null
  46.         rm $tempFile
  47. }
  48.  
  49. function processZippedMessagePart {
  50.         mimePart=$1
  51.         tempFile=`mktemp`
  52.         tempDir=`mktemp -d`
  53.         reformime -e -s $mimePart  $tempFile
  54.         unzip $tempFile -d $tempDir > /dev/null
  55.  
  56.         SAVEIFS=$IFS
  57.         IFS=$(echo -en "\n\b")
  58.  
  59.         for singleFile in `ls $tempDir`; do
  60.                 mimeType=`file -b -i $tempDir/$singleFile`
  61.                 isPrintableMime $mimeType
  62.                 isPrintable=$?
  63.                 if [ $isPrintable -eq 0 ]; then
  64.                         echo "     $mimePart: Printing $mimeName/$singleFile as $mimeType." >> $logFile
  65.                         lp -t "$singleFile" $tempDir/$singleFile > /dev/null
  66.                 else
  67.                         echo "     $mimePart: *Skipping* $singleFile/$mimeName because $mimeType isn't supported!" >> $logFile
  68.                 fi
  69.         done
  70.         IFS=$SAVEIFS
  71.  
  72.         rm -rf $tempDir
  73.         rm $tempFile
  74. }
  75.  
  76. function processMessagePart {
  77.         mimePart=$1
  78.         mimeHeader=`reformime -s $mimePart -i < $mailMessage`
  79.         mimeType=`echo "$mimeHeader" | grep content-type | awk '{print $2}'`
  80.         mimeName=`echo "$mimeHeader" | grep content-disposition-filename | awk '{ for(i=2; i> $logFile
  81.                 fi
  82.         fi
  83. }
  84.  
  85. logFile=`mktemp`
  86. mailMessage=`mktemp`
  87. cat /dev/stdin > $mailMessage
  88. subject=`cat $mailMessage |grep -m 1 '^Subject:' | awk '{ for(i=2; i< =NF; i++) {printf("%s ", $i)}}'`
  89. from=`cat $mailMessage | grep -m 1 '^From:' | awk '{ for(i=2; i> $logFile
  90. for mimePart in `reformime -s < $mailMessage | grep 1\..`; do
  91.         processMessagePart $mimePart $mailMessage
  92. done
  93. echo "Finished." >> $logFile
  94. cat << EOM | /usr/sbin/sendmail -FPDFPrintbutler -fyourprivateemailhere@example.com $from
  95. To: $from
  96. Subject: PDFPrintButler finished [$subject]
  97. X-Mailer: PDFPrintButler [v2.0]
  98. `cat $logFile`
  99. EOM
  100. 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!

Eine Antwort auf „PDFPrintButler – Version 2.0“

  1. 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!

Schreibe einen Kommentar