PDF-Dokumente automatisch drucken

Für online Retail-Shops stellt sich immer wieder die Frage wie man Rechnungen oder Lieferscheine bei einer Bestellung automatisiert ausdrucken kann.

In diesem Tutorial möchten wir anschliessend an die Mail to Print Funktion des Plugins CashCtrl Gateway for WooCommerce aufzeigen, wie dies mit einfachen Mitteln auch datenschutzkonform möglich ist.

Grundsätzlich muss man zwischen folgenden Optionen unterscheiden:

  1. Druckerhersteller eigene Funktionen (z.B. Google Cloud Print, HP ePrint oder Brother Email Print)
  2. Ein Drucker kann POP3 oder IMAP-Postfächer direkt abfragen
  3. Eigener Print Server der IMAP-Postfächer abfragt

In diesem Tutorial möchten wir auf letztere Option näher eingehen und PDF-Anhänge automatisch ausdrucken.

Voraussetzungen

Alle Optionen setzten einen netzwerkfähigen Drucker voraus. Dazu benötigen wir entweder ein Linux Server oder ganz einfach einen Raspberry PI. Die Hardwareanforderungen sind nebensächlich so lange nicht noch weitere Prozesse auf dem Server laufen. Es reicht also ein PI 3 oder 4 mit 1 oder 2GB Memory.

E-Mail Postfach erstellen

Erstellen Sie beim Hoster Ihrer Wahl ein E-Mail Postfach, auf welches Sie via IMAP zugreifen können.

Raspberry PI aufsetzen

Falls nicht schon vorhanden, sollten Sie in einem ersten Schritt einen Raspberry PI aufsetzten. Heise bietet dazu ein übersichtliches Tutorial an.

Installieren Sie die neuesten Updates.

sudo apt-get update -y && apt-get upgrade -y

Melden Sie sich mit dem pi-Benutzer per SSH bei Ihrem Raspberry PI an und erstellen Sie zunächst ein neues Projektverzeichnis im pi-Home-Verzeichnis. Achten Sie darauf das die nachfolgenden Schritte mit dem pi-Benutzer und nicht als root ausgeführt werden.

cd
mkdir pimailprint 
cd pimailprint

fetchmail, procmail & Co. installieren und konfigurieren

Installieren Sie fetchmail, procmail und uudeview um E-Mails vom vorher erstellten IMAP-Postfach abzuholen und die PDF-Anhänge zu extrahieren.

sudo apt-get install fetchmail procmail uudeview

Erstellen Sie im zuvor erstellten Projektverzeichnis eine Konfigurationsdatei für fetchmail.

cd
nano fetchmail.conf

Mit der nachfolgenden Konfiguration verwenden wir procmail als Mail Delivery Agent, um die eingehenden Mails weiter zu verarbeiten.

set no bouncemail 
poll IMAP.IHRE-DOMAIN.CH 
service 993 
protocol imap 
user "IHR-BENUTZERNAME" 
password "IHR-PASSWORT" 
ssl 
sslproto TLS1 
no keep 
mda "/usr/bin/procmail -m './procmail.conf'"

Da die Datei Benutzername und Passwort beinhaltet, ändern Sie die Dateiberechtigungen so, dass nur Sie diese öffnen und sehen können.

chmod 700 fetchmail.conf

Nun erstellen wir eine Konfigurationsdatei für procmail…

nano procmail.conf

…welche die Mails, die einen Anhang enthalten, im Ordner ./maildata speichert.

MAIL_DIR=./maildata 
VERBOSE=off 
LOGFILE=./logs/printmail.log 
:0 
*^content-Type: 
$MAIL_DIR/

CUPS installieren und konfigurieren

Die Apple open Source Software CUPS (Common Unix Printing System) ermöglicht es jedem Computer, als Druckserver zu fungieren. Folgen Sie dieser Anleitung um CUPS zu installieren.

Sobald die Installation abgeschlossen ist, können Sie die Druckerwarteschlange über https://[ip-adresse--raspberry-pi]:631 verwalten. Stellen sie sicher das der korrekte Drucker als Standarddrucker definiert ist.

fetchmail und CUPS verbinden

Um E-Mails mit fetchmail abzufragen und im Fall einer PDF-Datei (*.pdf) auf dem CUPS-Standarddrucker auszudrucken, müssen wir ein Shell-Skript erstellen welches die korrekte Berechtigung zum Ausführung hat.

cd
touch ./printmail.sh 
chmod +x ./printmail.sh 
nano ./printmail.sh

Fügen Sie folgenden Code in das printmail.sh Skript ein.

#!/bin/bash
# Parameters
BASEDIR=$(dirname $0)
CURDIR=$(pwd)
MAILDIR=./maildata
LOGFILE=./logs/printmail.log
ATTACH_DIR=./attachments
# change directory
echo "Switching directory to : $BASEDIR"
cd $BASEDIR
# create log file if it does not exist
touch $LOGFILE
date '+%Y-%m-%d %H:%M:%S' >> $LOGFILE
# fetch mail
echo "Checking for new mail..."
fetchmail -f ./fetchmail.conf -L $LOGFILE
# process new mails
shopt -s nullglob
for i in $MAILDIR/new/*
do
 echo "Processing : $i" | tee -a $LOGFILE
 uudeview $i -i -p $ATTACH_DIR/
# process file attachments with space
  cd $ATTACH_DIR
  for e in ./*
      do
          mv "$e" "${e// /_}"
  done
  for f in *.PDF
      do
      mv $f ${f%.*}.pdf
  done
  cd $BASEDIR
# end of patch
 echo "Printing PDFs" | tee -a $LOGFILE
 for x in $ATTACH_DIR/*.pdf
 do
         echo "Printing : $x" | tee -a $LOGFILE
         lp -o fitplot=true -o page-bottom=-25 -o page-top=10 -o page-left=-15 -o page-right=-5 $x
         echo "Deleting file : $x" | tee -a $LOGFILE
         rm $x | tee -a $LOGFILE
 done
 echo "Clean up and remove any other attachments"
 for y in $ATTACH_DIR/*
 do
         rm $y
 done
 # delete mail
 echo "Deleting mail : $i" | tee -a $LOGFILE
 rm $i | tee -a $LOGFILE
done
shopt -u nullglob
echo "Job finished." | tee -a $LOGFILE
cd $CURDIR

CUPS ist bekannt das die Ausrichtung für Ausdrucke von PDF-Dokumenten auf einem A4 Blatt nicht zu 100% korrekt stimmt.
Mit der Zeile lp -o fitplot=true -o page-bottom=-25 -o page-top=10 -o page-left=-15 -o page-right=-5 $x aus dem Skript oben sollte dies so gut es geht, korrigiert sein. Sollten Sie die Ausrichtung weiter anpassen müssen, hilft folgender Thread weiter.

Testen und Ausführung planen

Um das gesamte Skript zu testen, führen Sie es einfach aus (Achtung: der komplette Pfad muss mitgegeben werden)

/home/pi/pimailprint/printmail.sh

Rechnungen und Lieferscheine sollten direkt nach Eingang der Bestellung ausgedruckt werden. Dazu empfiehlt es sich das Skript alle 5 Minuten laufen zu lassen (Achtung prüfen Sie allfällige Nutzungsbestimmungen Ihres Hosters). Meist reicht es auch wenn das Skript nur zu Bürozeiten ausgeführt wird (im Beispiel: Montag bis Freitag, 07:00 bis 18:59).

Im Crontab-Generator kann ein individueller Zeitplan zusammengestellt werden.

crontab -e -u pi
*/5 7-18 * * 1-5 /home/admin/pimailprint/printmail.sh

Durch die Weiterleitung einer Mail an die zuerst erstellte E-Mail-Adresse können nun Rechnungen und Lieferscheine welche durch das Plugin CashCtrl Gateway for WooCommerce erstellt wurden, automatisch ausgedruckt werden.

Jede E-Mail mit PDF-Anhang wird nun direkt ausgedruckt. Aus diesem Grund empfiehlt es sich diese E-Mails Adresse geheim zu halten und nicht für weitere Dienste zu nutzen. Einige Hoster bieten auch die Möglichkeit von individuellen Black-, White-Lists an, mit welchen grundsätzlich alle Absender gesperrt und nur erlaubte Absender freigegeben werden können.

Alternativen

Wer sich nicht mit Linux und Shell-Kommandos herumschlagen möchte oder einen bereits verfügbaren lokalen Windows PC oder Server nutzen kann, kann auch die kommerzielle Software Automatic Email Manager einsetzten. Mit der 30 tägigen Testversion kann die CashCtrtl Gateway Option kostenlos ausprobiert werden und CashCtrl Rechnungen oder Lieferscheine für Onlinebestellungen automatisch ausgedruckt werden.

044 500 93 30