PDF Dateien aus IMAP laden und drucken
Vorweg, ich spreche kein PERL. Das Script in diesem Artikel ist also sicherlich keine Vorlage um Perl zu lernen, aber es erfüllt meinen Zweck.
Ich bekomme Rechnungen und andere PDF Dateien per Email die, weil leider noch nicht alle Menschen digitalisiert sind, auf Papier gedruckt werden müssen. Ich habe nicht immer einen Drucker vor Ort also habe ich bisher die betroffenen Emails in einen Order Print verschoben und zu Hause gedruckt. Ich wollte das immer schon irgendwie automatisieren.
Jede Windows-basierte Lösung dazu war absolut grauenhaft! Man muss nur mal versuchen „PDF aus der Kommandozeile drucken“ zu suchen. Alles was da vorgeschlagen wird ist nutzlos, überteuert und erfordert proprietäre Programme.
Jetzt habe ich selbst eine Lösung zu implementiert bei der ich die vollständige Kontrolle habe udn die überraschen gut funktioniert.
Voraussetzungen
cron, perl, pdftops, lpr, cron (z.B. mit cygwin)
Einen Postscript Drucker
** PDF Anhang herrunterladen **
Dieses Perl Script habe ich aus unterschiedlichen Forenbeiträgen zusammengestückelt bis es funktioniert. Echte T&E Programmierung.
#!/usr/bin/perl # Download pdf attachements from unseen messages in # a specified IMAP folder. After processing the # messages are set to seen. use Net::IMAP::Client; use Email::MIME; use Email::MIME::Attachment::Stripper; my $imap = Net::IMAP::Client->new( server => '<IMAP SERVER>', user => '<USER>', pass => '<PASSWORD>', ssl => 0, # (use SSL? default no) #port => 993 # (but defaults are sane) # ssl_verify_peer => 1, # (use ca to verify server, default yes) # ssl_ca_file => '/etc/ssl/certs/certa.pm', # (CA file used for verify server) or # ssl_ca_path => '/etc/ssl/certs/', # (CA path used for SSL) ) or die "Could not connect to IMAP server"; $imap->login or die('Login failed: ' . $imap->last_error); $imap->select('Print'); my $messages = $imap->search('UNSEEN'); foreach $msg (@$messages) { my $data = $imap->get_rfc822_body($msg); my $parsed = Email::MIME->new($data); my $stripper; $stripper = Email::MIME::Attachment::Stripper->new($parsed); my @attachments = $stripper->attachments(); foreach my $a ( @attachments ) { next if $a->{'filename'} !~ /pdf/i; #only pdf attachments my $tempdir = "./print/"; my $tmpPath = $tempdir . $a->{'filename'}; my $f = new IO::File $tmpPath, "w" or die "Cannot create file " . $tmpPath; print $f $a->{'payload'}; } $imap->store($msg, '\\Seen'); } $imap->logout();
Die gedruckten Mails (Status seen im Print Ordner) werden über mein imapfilter script archiviert. Ich verwende openvpn um auf meinen IMAP Server zuzugreifen. Einen Zugriff über SSL habe ich nicht getestet.
** PDF drucken ** Das folgende Script druckt und entfernt die PDF Dateien
#!/usr/bin/bash shopt -s extglob PRINTER="<PRINTER NAME HERE>" FILES=print/*.pdf for pdf in $FILES; do pdftops $pdf ps="print/"$(basename "$pdf" .pdf)".ps" cat "$ps" | lpr -d "$PRINTER" rm $pdf rm $ps done
Automatisierung erfolgt über cygwin cron.
by
by
von PDF Dateien aus IMAP laden und drucken













