• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Empfangene Faxe als PDFs an (externe) Emailadresse versenden

E-Strike

Newbie
Ich habe ja schon einige Lösungsansätze gefunden, aber leider nichts, was mir wirklich weitergeholfen hat.
Da ich noch Linux-Neuling bin, suche ich ein HowTo, das auch für Anfänger verständlich ist.

Wie lässt es sich am leichtesten realisieren, dass empfangene Faxe in PDF-Dateien umgewandelt und per Email verschickt werden.
(Keine interne Mail, sondern an eine externe Emailadresse!)
 

guzmamb6

Member
Hallo Striker, schon mal ein wenig Programmiert?
Da wagst du dich schon an etwas kompliziertes, aber nur so lernt man Programieren:
Da hast du zwei Sachen:
  • Umwandlung der TIFF Datei in PDF Datei
    und den Versand an eine Adresse.
Zu bewerkstelligen über die Datei /var/spool/fax/bin/faxrcv
Hier gilt es beides zu Programieren. Am besten ich zitiere meine Datei und du versuchst es selber daran dich zu orientieren:
--EDIT-- Falsche Datei zitiert, die folgende Datei ist "notify.awk" und ist für die Sendebestätigung. Ich lass die mal hier, ich denke das kann auch für manchen interressant sein. Also hier nicht die Datei zum weiterleiten empfangender Faxe, die habe ich weiter unten. --EDIT--
Konfigurationsdatei notify.awk
Achtung: Die Zeilenumbrüche können hier anders aussehen als in der Datei, 'gültig' sind aber nur die wie in der Datei.
Code:
#! /bin/sh
#	$Id: notify.awk,v 1.3 2002/07/20 05:24:17 darren Exp $
#
# HylaFAX Facsimile Software
# WITH HACK FOR ATTACHING THE SENDED FAX
#
# Copyright (c) 1990-1996 Sam Leffler
# Copyright (c) 1991-1996 Silicon Graphics, Inc.
# 
# Permission to use, copy, modify, distribute, and sell this software and 
# its documentation for any purpose is hereby granted without fee, provided
# that (i) the above copyright notices and this permission notice appear in
# all copies of the software and related documentation, and (ii) the names of
# Sam Leffler and Silicon Graphics may not be used in any advertising or
# publicity relating to the software without the specific, prior written
# permission of Sam Leffler and Silicon Graphics.
# 
# THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
# EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
# WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
# 
# IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
# ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
# OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
# WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
# LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
# OF THIS SOFTWARE.
#

#
# Awk support program for notify shell script.  This
# stuff is broken out into a separate file to avoid
# overflowing the exec arg list on some systems like SCO.
#

# Modifiziert, um versendete Faxe als PDF-Anhang der Benachichtigungsmail
# zu bekommen. Gleichzeitig werden die vesendeten Faxe im Verzeichnis
# /var/spool/fax/pdf und die erfolglosen Faxe im Verzeichnis
# /var/spool/fax/pdf/failed archiviert.
# Dank an die Seite http://www.hylafax.org/archive/2003-08/msg00165.html
# und http://www.hylafax.org/archive/1999-11/msg00113.html
#
# Modified to send pdf attachment with notification email. Also archives all
# faxes, success and failure in seperate dir's in pdf format.
# PDF's are stored in /var/spool/fax/pdf and
# /var/spool/fax/pdf/failed
#
# Also statement for smbfax/winbind users to strip domain for mail delivery
#


function printItem(fmt, tag, value)
{
    printf "%14s: " fmt "\n", tag, value;
}

function printBanner(banner)
{
    print "";
    print "    ---- " banner " ----";
    print "";
}

function docType(s)
{
    if (match(s, "\.cover"))
	return "PostScript cover page";
    else if (match(s, "\.ps"))
	return "PostScript";
    else if (match(s, "\.tif"))
	return "TIFF";
    else if (match(s, "\.pdf"))
	return "PDF";
    else if (match(s, "\.pcl"))
	return "PCL";
    else
	return "Unknown document type";
}

#
# Construct a return-to-sender message.
#
function returnToSender()
{
    printBanner("Unsent job status");
    printItem("%s", "Destination", number);
    printItem("%s", "JobID", jobid);
    printItem("%s", "GroupID", groupid);
    printItem("%s", "Sender", sender);
    printItem("%s", "Mailaddr", mailaddr);
    if (commid != "")
	printItem("%s", "CommID", commid);
    if (modem != "any")
	printItem("%s", "Modem", modem);
    printItem("%s", "Submitted From", client);
    if (jobType == "facsimile") {
	printItem("%u (mm)", "Page Width", pagewidth);
	printItem("%.0f (mm)", "Page Length", pagelength);
	printItem("%.0f (lpi)", "Resolution", resolution);
    }
    printItem("%s", "Status", status == "" ? "  (nothing available)" : status);
    printItem("%u (exchanges with remote device)", "Dialogs", tottries);
    printItem("%u (consecutive failed calls to destination)", "Dials", ndials);
    printItem("%u (total phone calls placed)", "Calls", totdials);
    if (jobType == "facsimile") {
	printItem("%u (pages transmitted)", "Pages", npages);
	printItem("%u (total pages to transmit)", "TotPages", totpages);
	printItem("%u (attempts to send current page)", "Attempts", ntries);
	printItem("%u (directory of next page to send)", "Dirnum", dirnum);
	if (nfiles > 0) {
	    printBanner("Documents submitted for transmission");
	    print "The following documents were submitted for transmission and are";
	    print "available on the server for reuse until they are automatically";
	    print "purged when this job is " doneop "d.  Documents may also be manually";
	    print "removed using the faxrm command; consult faxrm(1) for information.";
	    print ""
	    printf "%-20s %8s %s\n", "Filename", "Size", "Type";
	    for (i = 0; i < nfiles; i++) {
		"wc -c " files[i] | getline;
		printf "%-20s %8d %s\n", files[i], $1, docType(files[i]);
		close("wc -c " files[i]);
	     }
	}
    } else if (jobType == "pager") {
	if (npins != 0) {
	    printBanner("Unsent pages submitted for transmission");
	    for (i = 0; i < npins; i++)
		printf "%15s\n",  "PIN " pins[i];
	}
	if (nfiles != 0) {
	    printBanner("Message text");
	    while ((getline <files[0]) > 0)
		print $0;
	    close(files[0]);
	}    
    }
}

function returnTranscript()
{
    printBanner("Transcript of session follows");
    comFile = "log/c" commid;
    if ((getline <comFile) > 0) {
	do {
	    if (index($0, "-- data") == 0)
		print $0
	} while ((getline <comFile) > 0);
	close(comFile);
    } else {
	printf "    No transcript available";
	if (commid != "")
	    printf "(CommID c" commid ")";
	print ".";
    }
}

function printStatus(s)
{
    if (s == "")
	print "<no reason recorded>";
    else
	print s
}

function putHeaders(subject)
{
    print "To: " mailaddr;
    print "Subject: " subject;
    print "";
    printf "Your " jobType " job to " number;
}
#
# this is the new headers function
# it writes the message headers for a multipart message
# (any message you want to attach your fax to)
# added yan seiner nov 1999 yan@seiner.com
#
function putMimeHeaders(subject)
{
    print "Mime-Version: 1.0"
    print "Content-Type: Multipart/Mixed\; Boundary=\"NextPart7738\"";
    print "Content-Transfer-Encoding: 7bit";
    print "To: " mailaddr;
    print "Subject: " subject;
    print "";
    print  "--NextPart7738";
    print "";
#    printf "Your " jobType " job to " number " name " qfile;
    printf "Ihr Fax zur Nummer " number " " qfile;
}
#
# this function inserts a tiff file into stdout
# you could use another conversion (tiff2ps) if you choose
# added yan seiner nov 1999 yan@seiner.com
#
function attachTiffFile(file)
{
    print  "--NextPart7738";
    print "Content-Type: image/tiff";
    print "Content-Description: FAX document; name=" file;
    print "Content-Disposition: inline;";
    print "Content-Transfer-Encoding: base64";
    print "";
    system("bin/ps2fax " file " -o " file ".cnv" );
    system("/usr/bin/mimencode " file ".cnv"  );
    system("rm -f " file ".cnv" );
    print "";
    print  "--NextPart7738--";
    print "";
}

# this function inserts a PDF file into stdout
#
function attachPdfFile(file)
{
    print   "--NextPart7738";
    print "Content-Type: application/pdf";
#    print "Content-Description: FAX Dokument; filename=\"" number ".pdf\"";
    print "Content-Description: FAX Dokument";
    print "Content-Disposition: inline; filename=\"Tel-" number "_JobID-" jobid ".pdf\"";
#    print "Content-Disposition: inline;";
    print "Content-Transfer-Encoding: base64";
    print "";
    system("/usr/bin/ps2pdf12 " file " /var/spool/fax/pdf/" number "-" jobid ".pdf 1>/dev/null 2>/dev/null");
#    system("/usr/bin/ps2pdf12 " file " /var/spool/fax/pdf/" number "_`date '+%F'`.pdf 1>/dev/null 2>/dev/null");
#    system("/usr/bin/ps2pdf12 " file " /var/spool/fax/pdf/" number ".pdf 1>/dev/null 2>/dev/null");
    system("/usr/bin/mimencode /var/spool/fax/pdf/" number "-" jobid ".pdf");
#    system("/usr/bin/mimencode /var/spool/fax/pdf/" number "_"date +%F".pdf");
#    system("/usr/bin/mimencode /var/spool/fax/pdf/" number ".pdf");
    print "";
    print  "--NextPart7738--";
    print "";
}

BEGIN		{ nfiles = 0;
		  npins = 0;
		  pagewidth = 0;
		  pagelength = 0;
		  resolution = 0;
		  jobType = "facsimile";
		  signalrate = "unknown";
		  dataformat = "unknown";
		  filename = "unknown";
		  doneop = "default";
                pagernum = "unknown";
		  commid = "";
		}
/^jobid/	{ jobid = $2; }
/^groupid/	{ groupid = $2; }
/^state/	{ state = $2+0; }
/^doneop/	{ doneop = $2; }
/^number/	{ number = $2; }
/^external/	{ number = $2; }		# override unprocessed number
/^sender/	{ sender = $2; }
/^mailaddr/	{ mailaddr = $2; }
/^jobtag/	{ jobtag = $0; sub("jobtag:", "", jobtag); }
/^jobtype/	{ jobType = $2; }
/^status/	{ status = $0; sub("status:", "", status);
		  if (status ~ /\\$/) {
		      sub("\\\\$", "\n", status);
		      while (getline > 0) {
			  status = status $0;
			  sub("\\\\$", "\n", status);
			  if ($0 !~ /\\$/)
			      break;
		      }
		  }
		}
/^resolution/	{ resolution = $2; }
/^npages/	{ npages = $2; }
/^totpages/	{ totpages = $2; }
/^dirnum/	{ dirnum = $2; }
/^commid/	{ commid = $2; }
/^ntries/	{ ntries = $2; }
/^ndials/	{ ndials = $2; }
/^pagewidth/	{ pagewidth = $2; }
/^pagelength/	{ pagelength = $2; }
/^signalrate/	{ signalrate = $2; }
/^dataformat/	{ dataformat = $2; }
/^modem/	{ modem = $2; }
/^totdials/	{ totdials = $2; }
/^tottries/	{ tottries = $2; }
/^client/	{ client = $2; }
/^[!]*post/	{ files[nfiles++] = $4; }
/^[!]*tiff/	{ files[nfiles++] = $4; }
/^[!]*pcl/	{ files[nfiles++] = $4; }
/^page:/	{ pins[npins++] = $4; }
/^[!]page:/   { pagernum = $4; }
/^data:/	{ files[nfiles++] = $4; }
/^poll/		{ poll = " -p"; }
END {
    if (jobtag == "")
	jobtag = jobType " job " jobid;;
    if (doneop == "default")
	doneop = "remove";
    if (jobType == "pager")
      number = pagernum;
    if (why == "done") {
#	putHeaders(jobtag " to " number " completed");
        putMimeHeaders(jobtag " zur Nummer " number " abgeschlossen");
#	print " was completed successfully.";
	print " ist komplett abgeschlossen.";
	print "";
	print "Folgende Daten sind zur Information ueber die Sendung, eine Kopie der Sendung ist als PDF-Datei im Anhang.";
	print "";
	if (jobType == "facsimile") {
#	    printItem("%u", "Pages", npages);
	    printItem("%u", "Seiten", npages);
	    if (resolution == 196)
#		printItem("%s", "Quality", "Fine");
		printItem("%s", "Qualitaet", "Fine");
	    else
		printItem("%s", "Quality", "Normal");
#	    printItem("%u (mm)", "Page Width", pagewidth);
	    printItem("%u (mm)", "Seitenbreite", pagewidth);
#	    printItem("%.0f (mm)", "Page Length", pagelength);
	    printItem("%.0f (mm)", "Seitenlänge", pagelength);
#	    printItem("%s", "Signal Rate", signalrate);
	    printItem("%s", "Signalrate", signalrate);
	    printItem("%s", "Data Format", dataformat);
	}
	if (tottries != 1)
	    printItem("%s (exchanges with remote device)", "Dialogs", tottries);
	if (totdials != 2)
	    printItem("%s (total phone calls placed)", "Calls", totdials);
	if (modem != "any")
	    printItem("%s", "Modem", modem);
#	printItem("%s", "Submitted From", client);
	printItem("%s", "Abgesendet von", client);
	printItem("%s", "JobID", jobid);
	printItem("%s", "GroupID", groupid);
	printItem("%s", "CommID", "c" commid);
#	printf "\nProcessing time was " jobTime ".\n";
	printf "\nProzessdauer war " jobTime ".\n";
	if (status != "") {
	    print "  Additional information:\n    " status;
	    returnTranscript();
	}
#	attachTiffFile($4);
	attachPdfFile($4);

    } else if (why == "failed") {
#	putHeaders(jobtag " to " number " failed");
	putMimeHeaders(jobtag " zur Nummer " number " fehlgeschlagen");
#	printf " failed because:\n    ";
	printf " fehlgeschlagen da:\n    ";
	print "Die folgenden Daten sind zur Info und auf Englisch..";
	printStatus(status);
	returnTranscript();
	returnToSender();
	attachPdfFile($4);
    } else if (why == "rejected") {
#	putHeaders(jobtag " to " number " failed");
	putMimeHeaders(jobtag " zur Nummer " number "zurueckgewiesen");
#	printf " was rejected because:\n    ";
	printf " zurueckgewiesen da:\n    ";
	print "Die folgenden Daten sind zur Info und auf Englisch..";
	printStatus(status);
	returnToSender();
	print " ";
	attachPdfFile($4);
    } else if (why == "blocked") {
#	putHeaders(jobtag " to " number " blocked");
	putMimeHeaders(jobtag " zur Nummer " number "zurueckgewiesen");
#	printf " is delayed in the scheduling queues because:\n    ";
	printf " wird verspaetet ausgeliefert\n    ";
	print "";
	print "Das Fax wird so bald wie moeglich ausgeliefert, die Verzoegerung ist begruendet in";	
	printStatus(status);
	print "";
	print "The job will be processed as soon as possible."
	attachPdfFile($4);

    } else if (why == "requeued") {
#	putHeaders(jobtag " to " number " requeued");
	putMimeHeaders(jobtag " zur Nummer " number " ist in der Warteschlange.");
#	printf " was not sent because:\n    ";
	printf " konnte nicht gesendet werden\n    ";
	print "Es wird versucht das Fax um " nextTry "abzusenden."
	printStatus(status);
	print "";
#	print "The job will be retried at " nextTry "."
	returnTranscript();
	attachPdfFile($4);
    } else if (why == "removed" || why == "killed") {
	putHeaders(jobtag " to " number " removed from queue");
	print " was deleted from the queue.";
	if (why == "killed")
	    returnToSender();
    } else if (why == "timedout") {
#	putHeaders(jobtag " to " number " failed");
	putMimeHeaders(jobtag " zur Nummer " number "ist fehlgeschlagen.");
#	print " could not be completed before the appointed deadline.";
	print " konnte nicht vor der festglegten Zeit vollendet werden.";
	print "Das Fax ist als Anhang beigefuegt.";
	returnToSender();
        print "";
	attachPdfFile($4);
    } else if (why == "format_failed") {
#	putHeaders(jobtag " to " number " failed");
	putMimeHeaders(jobtag " zur Nummer " number " ist fehlgeschlagen.");
#	print " was not sent because document conversion"
	print " konnte nicht gesendet werden, da die Konvertierung scheiterte.";
#	print "to facsimile failed.  The output from the converter program was:\n";
	print "zu Faxen scheiterte. Wenn diese Meldung erscheint,";
	print " ist was entscheidendes fehlgeschlagen. Die Meldung des Konvertierprogrammes war:\n";
	print "";
	print status "\n";
	printf "Check any PostScript documents for non-standard fonts %s.\n",
	    "and invalid constructs";
	returnToSender();
	attachPdfFile($4);
    } else if (why == "no_formatter") {
#	putHeaders(jobtag " to " number " failed");
	putMimeHeaders(jobtag " zur Nummer " number " ist fehlgeschlagen.");
#	print " was not sent because";
	print " wurde nicht gesendet da";
#	print "the document conversion script was not found.";
	print "das Dokumentenkonvertierungsprogramm nicht gefunden wurde.";
	returnToSender();
	attachPdfFile($4);
    } else if (match(why, "poll_*")) {
	putHeaders("Notice about " jobtag);
	printf ", a polling request,\ncould not be completed because ";
	if (why == "poll_rejected")
	    print "the remote side rejected your request.";
	else if (why == "poll_no_document")
	    print "no document was available for retrieval.";
	else if (why == "poll_failed")
	    print "an unspecified problem occurred.";
	print "";
	printf "Processing time was %s.\n", jobTime;
	returnTranscript();
	attachPdfFile($4);
    } else {
	putHeaders("Notice about " jobtag);
	print " had something happen to it."
	print "Unfortunately, the notification script was invoked",
	    "with an unknown reason"
	print "so the rest of this message is for debugging:\n";
	print "why: " why;
	print "jobTime: " jobTime;
	print "nextTry: " nextTry;
	print  "";
	print "This should not happen, please report it to your administrator.";
	returnTranscript();
	returnToSender();
	attachPdfFile($4);
    }
}
Noch ein Hinweis: Du brauchst die Programme ps2pdf12 und mimencode zum Umwandeln der Fax-Datei und du musst die o.g. Datei noch auf dein System anpassen. Die richtige Mail-Adresse bekommt Notify ja genauso wie die Faxdatei von faxrcv mitgeteilt, das hast du ja schon sicherlich nach der howto schon eingerichtet.
Viel Glueck,
Michael
 
OP
E

E-Strike

Newbie
Zunächst mal danke für die Antwort :)

Leider ist das für mich momentan noch etwas zuviel des Guten.
Das Script ist ja in seinen Ausmaßen schon riesig.

Gibt es keine einfachere (oder gut dokumentierte) Lösung?
(Benutze die Version 4.2.0-5.1 von Hylafax)

Im Netz habe ich einiges darüber gelesen, dass unter Umständen eine kleine Modifikation der Dateien "Faxdispatch" bzw. "faxrcvd" bei der aktuellen Hylafax-Version bereits zum Ziel führt.
Leider gab es da aber nur Codeschnipsel, die mir nicht weitergeholfen haben.

Könnte da etwas dran sein? (Du kannst das sicherlich besser beurteilen, als ich)
 

guzmamb6

Member
Hallo Strike, wie du oben sehen kannst habe ich die falsche Datei zitiert, sorry.
E-Strike schrieb:
Leider ist das für mich momentan noch etwas zuviel des Guten.
Das Script ist ja in seinen Ausmaßen schon riesig.
Das Erstellen war eine noch größere Sache 8)

E-Strike schrieb:
Im Netz habe ich einiges darüber gelesen, dass unter Umständen eine kleine Modifikation der Dateien "Faxdispatch" bzw. "faxrcvd" bei der aktuellen Hylafax-Version bereits zum Ziel führt.
Leider gab es da aber nur Codeschnipsel, die mir nicht weitergeholfen haben.
Ich musste aus den Schnipseln die Datei erstellen, mit Namen "faxrecvd".
Du hast recht, die Datei muss man nur ändern. Leider weiß ich nicht mehr was und wo, daher wieder mal ein Zitat aus meiner Doku:
Code:
#! /bin/sh
#	$Id: faxrcvd.sh.in,v 1.9 2003/02/09 02:39:33 darren Exp $
#
# HylaFAX Facsimile Software
#
# Copyright (c) 1990-1996 Sam Leffler
# Copyright (c) 1991-1996 Silicon Graphics, Inc.
# HylaFAX is a trademark of Silicon Graphics
# 
# Permission to use, copy, modify, distribute, and sell this software and 
# its documentation for any purpose is hereby granted without fee, provided
# that (i) the above copyright notices and this permission notice appear in
# all copies of the software and related documentation, and (ii) the names of
# Sam Leffler and Silicon Graphics may not be used in any advertising or
# publicity relating to the software without the specific, prior written
# permission of Sam Leffler and Silicon Graphics.
# 
# THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
# EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
# WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
# 
# IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
# ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
# OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
# WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
# LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
# OF THIS SOFTWARE.
#

#
# faxrcvd file devID commID error-msg
#
if [ $# -lt 4 ]; then
    echo "Usage: $0 file devID commID error-msg [CIDNumber] [CIDName] [destination]"
    exit 1
fi

test -f etc/setup.cache || {
    SPOOL=`pwd`
    cat<<EOF

FATAL ERROR: $SPOOL/etc/setup.cache is missing!

The file $SPOOL/etc/setup.cache is not present.  This
probably means the machine has not been setup using the faxsetup(8C)
command.  Read the documentation on setting up HylaFAX before you
startup a server system.

EOF
    exit 1
}
. etc/setup.cache

INFO=$SBIN/faxinfo
FAX2PS=$TIFFBIN/fax2ps
ENCODING=base64
TIFF2PS=tiff2ps
PS2PDF=ps2pdf
#Adresse des Admins
TOADDR=xxx@yyy.de
#
TIFFINFO=tiffinfo
# Den Admin informieren?
#NOTIFY_FAXMASTER=always
NOTIFY_FAXMASTER=errors
SENDNR="$7"

# SENDTO ist die Adresse des normalen Empfaengers
# TOADDR ist die Adresse des Fax-Masters

#
# wraper for base64 encoding
#
# first try uuencode if it is not installed fallback to
# metamails mimencode if it is also not installed give an
# error message
#
function base64 {

    if [ -x /usr/bin/uuencode ]; then
        /usr/bin/uuencode -m $1 $1 | /usr/bin/sed '1d;$d'
    elif [ -x /usr/bin/mimencode ]; then
        /usr/bin/mimencode $1
    else
        echo "Error: No encoder for base64 found."
        echo "Please install sharutils or metamail."
    fi
}

#
# Permit various types of attachment types: ps, tif, pdf
# Note that non-ASCII filetypes require sharutils or metamail.
# pdf requires tiff2ps and ps2pdf
# Gewuenschter Typ des Anhangs
#FILETYPE=ps
FILETYPE=pdf

#
# There is no good portable way to find out the fully qualified
# domain name (FQDN) of the host or the TCP port for the hylafax
# service so we fudge here.  Folks may want to tailor this to
# their needs; e.g. add a domain or use localhost so the loopback
# interface is used.
#
HOSTNAME=192.168.xxx.xxx #Die IP des Fax-Servers
PORT=4559				# XXX no good way to lookup service
DNSNAME=name.de #FQN des Servers

FILE="$1"
DEVICE="$2"
COMMID="$3"
MSG="$4"
CIDNUMBER="$5"
CIDNAME="$6"
SENDNR="$7"

FILENAME=`echo $FILE | $SED -e 's/\.tif//' -e 's/recvq\///'`

if [ -f $FILE ]; then
    #
    # Check the sender's TSI and setup to dispatch
    # facsimile received from well-known senders.
    #
    SUBADDR="`$INFO $FILE | $AWK -F: '/SubAddr/ { print $2 }' 2>/dev/null`"
    SENDER="`$INFO $FILE | $AWK -F: '/Sender/ { print $2 }' 2>/dev/null`"

# Der Fax-Master soll ersteinmal grundlegend das Fax erhalten
    SENDTO="$TOADDR"

# Hier wird der wirkliche Empfaenger ermittelt
#    if [ -f bin/FaxDispatch ]; then
#	. bin/FaxDispatch	# NB: FaxDispatch sets SENDTO based on $7
#    fi
case "$SENDNR" in

#21)
81xxx21)
SENDTO=empfänger1@name.de
;;

#22)
81xx22)
SENDTO=empfänger2@name.de
;;

#23)
81xxx23)
SENDTO=empfänger3@name.de
;;

esac


# Hier wird nun der Fax-Master benachichtigt
    # Don't send FaxMaster duplicates, and FaxMaster may not even
    # want a message at all, depending on NOTIFY_FAXMASTER.
    #
    case $NOTIFY_FAXMASTER$MSG in
	never*)		NOTIFY_FAXMASTER=no;;
	errors)		NOTIFY_FAXMASTER=no;;
	*)		NOTIFY_FAXMASTER=yes;;
    esac
    if [ "$TOADDR" != "$SENDTO" -a "$NOTIFY_FAXMASTER" != "no" ]; then
	(echo "To: $TOADDR"
#	 echo "From: The HylaFAX Receive Agent <fax>"
	 echo "From: Fax-Server Name AG <fax>"
#	 echo "Subject: Facsimile received from $SENDER";
	 echo "Subject: Zur Info: Fax empfangen von $SENDER";
	 echo ""
	 echo " !Dies ist nur eine Benachtichtigung!"
	 echo ""
	 echo "$FILE (ftp://192.xxx.xxx.xxx:$PORT/$FILE):"; $INFO -n $FILE
#	 echo "$FILE (ftp://$HOSTNAME:$PORT/$FILE):"; $INFO -n $FILE
	echo "ReceivedOn: $DEVICE"
	if [ "$MSG" ]; then
	    echo ""
	    echo "The full document was not received because:"
	    echo ""
	    echo "    $MSG"
	    echo ""
	    echo "    ---- Transcript of session follows ----"
	    echo ""
	    if [ -f log/c$COMMID ]; then
		$SED -e '/-- data/d' \
		 -e '/start.*timer/d' -e '/stop.*timer/d' \
		 log/c$COMMID
	    elif [ -n "$COMMID" ]; then
		echo "    No transcript available (CommID c$COMMID)."
	    else
		echo "    No transcript available."
	    fi
	else
	    echo "    CommID: c$COMMID (ftp://$HOSTNAME:$PORT/log/c$COMMID)"
	fi
	if [ "$CIDNUMBER" ]; then
	    echo " CIDNumber: $CIDNUMBER"
	fi
	if [ "$CIDNAME" ]; then
	    echo "   CIDName: $CIDNAME"
	fi
	echo "   Fuer die Nummer $SENDNR"
	if [ -n "$SENDTO" ]; then
	    echo ""
#	    echo "The facsimile was automatically dispatched to: $SENDTO." 
	    echo "Das Fax wurde weitergeleitet an $SENDTO"
	fi
	) | 2>&1 $SENDMAIL -ffax -oi $TOADDR
    fi

# Hier die Erstellung der Mail mit Anhang
    if [ -n "$SENDTO" ]; then
	(MIMEBOUNDARY="NextPart$$"
	 echo "Mime-Version: 1.0"
	 echo "Content-Type: Multipart/Mixed; Boundary="$MIMEBOUNDARY""
	 echo "Content-Transfer-Encoding: 7bit"
	 echo "To: $SENDTO"
#	 echo "From: The HylaFAX Receive Agent <fax>"
	 echo "From: Fax-Server Name AG <fax@$DNSNAME>"
#	 echo "Subject: Facsimile received from $SENDER";
	 echo "Subject: Fax empfangen von $SENDER";
	 echo ""
	 echo "--$MIMEBOUNDARY"
	 echo "Content-Type: text/plain; charset=us-ascii"
	 echo "Content-Transfer-Encoding: 7bit"
	 echo ""
	 echo "Die Datei befindet sich im Anhang, hier die Daten:"
	 echo ""
	 echo "$FILE (ftp://$HOSTNAME:$PORT/$FILE):"; $INFO -n $FILE
#	 echo "Dateiname $FILE ($HOSTNAME:$PORT/$FILE):"; $INFO -n $FILE
	 echo "ReceivedOn: $DEVICE"
	 if [ "$MSG" ]; then
	    echo ""
	    echo "The full document was not received because:"
	    echo ""
	    echo "    $MSG"
	    echo ""
	    echo "    ---- Transcript of session follows ----"
	    echo ""
	    if [ -f log/c$COMMID ]; then
		$SED -e '/-- data/d' \
		     -e '/start.*timer/d' -e '/stop.*timer/d' \
		     log/c$COMMID
	    elif [ -n "$COMMID" ]; then
		echo "    No transcript available (CommID c$COMMID)."
	    else
		echo "    No transcript available."
	    fi
	 else
	    echo "    CommID: c$COMMID (ftp://$HOSTNAME:$PORT/log/c$COMMID)"
	 fi
	 if [ "$CIDNUMBER" ]; then
	    echo " CIDNumber: $CIDNUMBER"
	 fi
	 if [ "$CIDNAME" ]; then
	    echo "   CIDName: $CIDNAME"
	 fi
	 echo "Fuer die Nummer $SENDNR"
	 echo ""
	 echo "--$MIMEBOUNDARY"
	 if [ "$FILETYPE" = "tif" ]; then
	     echo "Content-Type: image/tiff; name="$FILENAME.tif""
	     echo "Content-Description: FAX document"
	     echo "Content-Transfer-Encoding: $ENCODING"
	     echo "Content-Disposition: attachment; filename="$FILENAME.tif""
	     echo ""
	     base64 $FILE 2>/dev/null
	 elif [ "$FILETYPE" = "pdf" ]; then
	     echo "Content-Type: application/pdf; name="c$COMMID.pdf""
	     echo "Content-Description: FAX document"
	     echo "Content-Transfer-Encoding: $ENCODING"
	     echo "Content-Disposition: attachment; filename="c$COMMID.pdf""
	     echo ""
	     GW=`$TIFFINFO $FILE | $GREP "Image Width" | \
		$SED 's/.*Image Width: \([0-9]*\).*/\1/g' | sort -n | $SED -n '$p'`
	     GL=`$TIFFINFO $FILE | $GREP "Image Length" | \
		$SED 's/.*Image Length: \([0-9]*\).*/\1/g' | sort -n | $SED -n '$p'`
	     RW=`$TIFFINFO $FILE | $GREP "Resolution" | \
		$SED 's/.*Resolution: \([0-9]*\).*/\1/g' | sort -n | $SED -n '$p'`
	     RL=`$TIFFINFO $FILE | $GREP "Resolution" | \
		$SED 's/.*Resolution: [0-9]*, \([0-9]*\).*/\1/g' | sort -n | $SED -n '$p'`
	     $TIFF2PS -a -O $FILE.ps $FILE 2>/dev/null # fax2ps looks bad
	     $PS2PDF -g$GW\x$GL -r$RW\x$RL $FILE.ps $FILE.pdf 2>/dev/null
	     base64 $FILE.pdf 2>/dev/null
	     cp $FILE.pdf . fax-archiv/
	     $RM -f $FILE.ps $FILE.pdf 2>/dev/null
	 else #  default as Postscript
	     echo "Content-Type: application/postscript; name="$FILENAME.ps""
	     echo "Content-Description: FAX document"
	     echo "Content-Transfer-Encoding: 7bit"
	     echo "Content-Disposition: attachment; filename="$FILENAME.ps""
	     echo ""
	     $FAX2PS $FILE 2>/dev/null
	 fi
	 echo ""
	 echo "--$MIMEBOUNDARY--"
	) | 2>&1 $SENDMAIL -ffax -oi $SENDTO
    fi
else
    #
    # Generate notification mail for a failed attempt.
    #
    (echo "To: $TOADDR"
     echo "From: The HylaFAX Receive Agent <fax>"
     echo "Subject: facsimile not received"
     echo ""
     echo "An attempt to receive facsimile on $DEVICE failed because:"
     echo ""
     echo "    $MSG"
     echo ""
     echo "    ---- Transcript of session follows ----"
     echo ""
     if [ -f log/c$COMMID ]; then
	$SED -e '/-- data/d' \
	     -e '/start.*timer/d' -e '/stop.*timer/d' \
	    log/c$COMMID
     elif [ -n "$COMMID" ]; then
	echo "    No transcript available (CommID c$COMMID)."
     else
	echo "    No transcript available."
     fi
    ) | 2>&1 $SENDMAIL -ffax -oi $TOADDR
fi
Versuch mal durch vergleichen. Ist nicht schwer, trau dich.
Michael
PS: Bin in Eile, Fragen immer gern
 
OP
E

E-Strike

Newbie
Werde mich mal eingehend mit dem Script beschäftigen :)
(Danke nochmal!)

Eine Zwischenfrage habe ich aber noch...
Die Programme "ps2pdf" und "mimencode"(oder wie das hieß) werden ja benötigt.
Leider sind die aber im /var/spool/fax/bin -Verzeichnis nicht vorhanden.

Wie kann/muss man die integrieren?
Kann ich z.B. die "ps2pdf14", die ich im rpm-Paket von Ghostscript gefunden habe, einfach rüberkopieren?
...oder verursacht das nur Fehler?
 

guzmamb6

Member
Ich habe einfach unter Yast diese beiden Pakete zur Installation ausgewählt (ghostscript und metamail). Kopieren brauchst du da nichts, die Pfade zu diesen sollten auch bei dir eingetragen sein (/usr/bin/) so das die Datei automatisch gefunden werden sollten.
Die Ziffern hinter ps2pdf wie z. B. ps2pdf14 sagen nur aus in was für ein PDF Format transformiert wird:
ps2pdf12 - Convert PostScript to PDF 1.2 (Acrobat 3-and-later compatible) using ghostscript
ps2pdf13 - Convert PostScript to PDF 1.3 (Acrobat 4-and-later compatible) using ghostscript
ps2pdf14 - Convert PostScript to PDF 1.3 (Acrobat 5-and-later compatible) using ghostscript
Wie du ja selber herausgefunden hast gibt es im Netz z.Z. kein HowTo für diesen Lösungsansatz. Auch ich habe keins, sondern nur das Script. Aber das kannst du ja schon fast so Anwenden. Die Stellen die du anpassen musst:
Code:
#eMail-Adresse des Admins
TOADDR=xxx@yyy.de
# 
[...]
HOSTNAME=192.168.xxx.xxx #Die IP deines Fax-Servers
[...]
DNSNAME=name.de #FQN des Servers wie z. B. "linux-club.de"
[...]
# Die MSN - eMail Zuordnung
# erste Zutornung:
21)
SENDTO=empfänger1@name.de
;;
# Schau nach was der Server an MSN übermittelt bekommt!
# zweite Zuordnung
22)
SENDTO=empfänger2@name.de
;;
# dritte Zuordnung
23)
SENDTO=empfänger3@name.de
;; 
[..]
Wichtig bei der o.g. Zuteilung:
Entweder die nur Durchwahl:
Code:
22)
oder die komplette Nummer (wie bei uns an der TK-Anlage):
Code:
81123621)

Dann dürfte das Script auch bei dir laufen.
Michael
 
OP
E

E-Strike

Newbie
Ok, hab das Script eingebaut und es scheint auch zu funktionieren.
Leider werden keine Mails verschickt.

In der /var/log/mail steht:
Code:
Mar 19 18:57:07 Faxserver postfix/smtp[5186]: BF3C01AC35: to=<xxx@web.de>, relay=none, delay=73695, status=deferred (Host or domain name not found. Name service error for name=web.de type=MX: Host not found, try again)

Internetverbindung besteht.
(heise.de kann ich anpingen.)

Was habe ich falsch gemacht/vergessen?
 

guzmamb6

Member
... und daher weiß ich wenig. Aber schau mal hier im Forum bei den Mailprogrammen, da steht die Lösung.
Wenn ich raten soll: Web.de akzepiert keine Verbindungen von Mailservern, die er nicht kennt. Daher solltest du den Wert "relay" in deiner Mail-Config setzen (Satz ohne Gewähr :? )

Michael
 
OP
E

E-Strike

Newbie
Ok, anderes Problem...

Momentan teste ich auf zwei verschiedenen Systemen.
Auf dem anderen gab es glücklicherweise oben beschriebenes Problem nicht, dafür aber ein anderes :)

Der Emailversandt funktioniert auf dem zweiten System.
Die PDF-Datei ist allerdings, nachdem sie per Email verschickt wurde, defekt.
Irgendeine Idee, woran es liegen könnte?

(Die Umwandlung von Tiff zu PDF funktioniert...habe ich getestet.)
 

guzmamb6

Member
Die Datei ist auf dem Server noch in Ordnung und nur die versendete PDF-Datei ist defekt?
Das war bei mir auch.
--EDIT--
Schon wieder Datei verwechselt, siehe mein Posting
---EDIT ENDE--

Der Grund: Zum Versand per Mail muss die PDF-Datei MIME-Kodiert werden.
Hierfür ist im o.g. Listing die Zeile
Code:
    system("/usr/bin/mimencode /var/spool/fax/pdf/" number "-" jobid ".pdf");
zuständig. Prüfe mal ob die Pfadangaben (zur PDF Datei und zu mimencode) korrekt sind und auch ausführbar.
Das war jedenfalls bei mir das Problem.
Michael
 
OP
E

E-Strike

Newbie
Nur, dass wir uns nicht missverstehen...

Diese Zeile existiert in der faxrcvd nicht, sondern nur in der notify.awk, welche du oben gepostet hast.

*verwirrt* :)

Bin bisher davon ausgegangen, dass die faxrcvd die einzige Datei ist, die ich editieren muss.
Irrtum?
 

guzmamb6

Member
Ich glaube diese Posting von mir sollte man mal alle neu schreiben...
Natürlich ist das schon wieder die andere Datei gewesen, was ist meine ist "base64" (Schlag mich selbst:oops:).

Bin irgendwie unkoordiniert, sorry für die Verwirrung.
Michael
 
OP
E

E-Strike

Newbie
Du könntest dein notify.awk-Script in den Parallel-Thread übertragen.
(Da ist es wahrscheinlich besser aufgehoben, als hier.) ;)

Aber zurück zum Problem:
Da ich besagten Teil direkt aus deinem Script übernommen habe, welches ja eigentlich funktionieren müsste, weil du es so einsetzt...bin ich jetzt etwas ratlos, wo der Fehler liegen kann.

Hier nochmal die Zeilen rund um base64 :
Code:
        $TIFF2PS -a -O $FILE.ps $FILE 2>/dev/null # fax2ps looks bad
        $PS2PDF -g$GW\x$GL -r$RW\x$RL $FILE.ps $FILE.pdf 2>/dev/null
        base64 $FILE.pdf 2>/dev/null
        cp $FILE.pdf . fax-archiv/
        $RM -f $FILE.ps $FILE.pdf 2>/dev/null

Ein bischen was verstehe ich davon sogar, aber die Syntax-Feinheiten sind mir natürlich nicht so ganz geläufig.


EDIT:
------------------------------------------------------------------
Fehler gefunden !

Falls nochmal jemand ähnliche Probleme haben sollte, überprüfe er einfach,
ob er auch daran gedacht hat, die RPM-Pakete "sharutils" und "metamail" zu installieren. :)



Was genau bewirkt z.B. die vorletzte Zeile?
Müsste die nicht eigentlich ungefähr so lauten:
Code:
cp $FILE.pdf /var/spool/fax/fax-archiv/
Aber das nur eine Frage am Rande...ich lerne ja noch. :)

Bin dir übrigens dankbar, dass du am Ball bleibst und mir immernoch mit Rat und Tat zur Seite stehst.
Manch ein anderer Linux-Kenner hätte mich schon unlängst mit RTFM-Sprüchen und dergleichen ins Leere laufen lassen.
Danke für die Hilfe !
 
Hallo,

könnte mir jetzt bitte nochmal genau (schritt für schritt) erklären wie man jetzt die Faxe als Email weiterleiten kann ? Ich hab da ein bißchen den Überblick verloren ! :?

Ich hab SUE Linux 9.2 installiert mit dem hylafax was dabei war!
Der hylafax sendet und empfängt faxe, aber ich kann nur mit WHFC die Fax anschauen.
Ich hätte aber gerne, dass die Faxe per Mail(über DSL-Anschluss) versendet werden (MSN1 an Mailadresse1, MSN2 an Mailadresse2,...).
Kann mir jemand helfen ???

Gruß Timo
 
OP
E

E-Strike

Newbie
Da ich vom Scripten eher mittelmäßig Ahnung habe, kann ich dir nur empfehlen, das faxrcvd-Script oben anstelle des deinen zu setzen.

Danach nimmst du die oben bereits beschriebenen Änderungen daran vor:

Code:
#eMail-Adresse des Admins (z.B. für Fehler-Emails)
TOADDR=xxx@yyy.de
#
[...]
HOSTNAME=192.168.xxx.xxx #Die IP deines Fax-Servers
[...]
DNSNAME=name.de #FQN des Servers wie z. B. "linux-club.de"
[...]
# Die MSN - eMail Zuordnungen
# Schau nach was der Server an MSN übermittelt bekommt!
# erste Zuordnung:
21)
SENDTO=empfänger1@name.de
;;
# zweite Zuordnung
22)
SENDTO=empfänger2@name.de
;;
# dritte Zuordnung
23)
SENDTO=empfänger3@name.de
;;
[..]

Außerdem musst du die main.cf von Postfix noch konfigurieren.
Wenn du einen lokalen Mailserver hast, muss dieser dort als "Relay" eingetragen werden.

/etc/postfix/main.cf
Code:
relayhost = mailserver.zuhause.de

Wenn du keinen hast, kann ich dir momentan noch nicht weiterhelfen, weil ich das selber noch nicht raus habe.
(Hilfe gesucht !) :)
 
OP
E

E-Strike

Newbie
Wie gesagt...ich blicke selber noch nicht ganz durch.
Vielleicht kann dir da jemand anderes hier weiterhelfen.

Ich weiß nur, dass es mit einem lokalen (lokal = im LAN) Mailserver, der bei Postfix als Relay eingestellt ist, funktioniert.
Bei dem anderen Testsystem, das ich benutze, gibt es keinen Mailserver und deshalb funktioniert es da auch noch nicht.

Fehlermeldung:
Code:
Mar 19 18:57:07 Faxserver postfix/smtp[5186]: BF3C01AC35: to=<xxx@web.de>, relay=none, delay=73695, status=deferred (Host or domain name not found. Name service error for name=web.de type=MX: Host not found, try again)
 

guzmamb6

Member
Es ist Monatsende, da habe ich immer wenig Zeit fürs Forum.
Dann will ich mal kurz ein paar Antworten geben:
E-Strike:
Fehler gefunden !
Falls nochmal jemand ähnliche Probleme haben sollte, überprüfe er einfach,
ob er auch daran gedacht hat, die RPM-Pakete "sharutils" und "metamail" zu installieren.
Sehr gut, so lernt man sich selber bei Problemen zu helfen.
Müsste die nicht eigentlich ungefähr so lauten:
Code:
cp $FILE.pdf /var/spool/fax/fax-archiv/
Man beachte den Punkt in der Zeile, ein Punkt:aktuelles Verzeichnis, zwei Punkte, übergeordnetes Verzeichnis:
Code:
cp $FILE.pdf . fax-archiv/
Wie bei "cd .."

Fehlermeldung:
Code:
Mar 19 18:57:07 Faxserver postfix/smtp[5186]: BF3C01AC35: to=<xxx@web.de>, relay=none, delay=73695, status=deferred (Host or domain name not found. Name service error for name=web.de type=MX: Host not found, try again)
Relay=Relais
Es werden im Internet nur eMails von eMail-Servern akzeptiert, die tatsächlich existieren (d.h. keine Dyn-DNS). Mit der Angabe von relay=smtp.web.de in der Config von Postfix (das ist der eMail-Daemon) wird die Mail mit web.de als Postserver markiert und akzeptiert.
Diese Antwort sollte allerdings eher im Mail-Forum diskutiert werden.

Timo Rickert:
Aber man muss doch bestimmt noch einen Email-Client einrichten der dann die Emails wegschickt, oder nicht ?
Gesendet wird per Befehlszeile via Postfix. Also ist die Console (im Program: Strd-In) der Client.

Ich glaube, ich werde (wenn ich mal viel Zeit habe) die Postings hier alle zusammen sammeln, ordnen (insbesondere meine) und dann geordnet in einem Guß darlegen. Damit sparen wir uns Zeit und Nachfragen.

Michael
 
Oben