Suche Email2fax script pdf attachment

the.neon

Neuer User
Mitglied seit
16 Mai 2006
Beiträge
83
Punkte für Reaktionen
0
Punkte
0
Hat jemand ein tipp für ein email2fax script ?
Sollte mit attachments von emails umgehn können und nur bestimmte absender zulassem

Software im Einsatz
Asterisk
Hylafax
Fetchmail
Postfix
 
Sollte mit attachments von emails ...

Was stellst Du Dir da denn vor ? "Attachments" kann ja nun alles Mögliche im Hinblick auf Dateiformate sein. Dann kommt es bei mail2fax auch immer noch darauf an, ob auch MS-Mailclients verwendet werden (Stichwort: TNEF-Container).
Und: Was soll mit dem Mailinhalt passieren (also dem Mailsubject bzw. dem textuellen body).
Und: Was soll passieren, wenn ein "Nicht-Berechtigter" eine entsprechende Mail schickt ?

Schon an Hand meiner Fragen siehst Du, das es für Deine Aufgabenstellung vermutlich kein Skript gibt, das von vornherein passt. Allerdings bedeutet das eben nicht, dass man die Aufgabenstellung nicht lösen kann.
 
Attachments nur pdf .
Subject ziel fax

Wenn nicht berechtigt gar nicht .

Wäre schon über eine vorlage froh.

Anpassen kann ich es dann selber . Möchte nicht rad neu erfinden ..
 
Mmh, typischerweise steckt man die Faxnummer in die To-Angabe, etwa nach dem Muster [email protected], um dann über postfrix transport eben fax.localdomain zu filtern und das Ganze an ein fax-Skript zu übergeben.

Dieses muss im Kern jetzt die Mail auseinandernehmen, das oder die Attachements einsammeln und zu einem Fax zusammenbauen, das dann vie sendfax versendet wird.

Die Berechtigungsprüfung kann man dann auch noch einbauen und sagen: Wenn nicht berechtigt, dann mache eben: Nichts.
Nachstehendes Perl-Script könnte demnach eine Anregung sein (/etc/postfix/fax.pl):

PHP:
#!/usr/bin/perl -w
use MIME::Parser;
use MIME::Types;
use Convert::TNEF;
use FileHandle;
use PDF::Reuse;
use PDF::API2;

# Define Globals
my $top_entity;
my $mes = '1';
my $mescount = 0;
my $pfad='/tmp';
my $fax_sender = $ARGV[0];
my $fax_rec = $ARGV[1];
my $pageNo     = 0;
$fax_rec=substr($fax_rec,0,index($fax_rec,"@"));

#Hier könnte eine Berechtigungsprüfung gegen $fax_sender stattfinden

# Datei mit MIME-Nachricht einlesen und parsen
$top_entity = &parse_MIME_Stream(\*STDIN);

# MIME-Nachricht, ggf. rekursiv, durchlaufen
&walk($top_entity);

# Aufräumen
$top_entity->purge;


if ($mes ne 1 ) { # alles ok, Fax erstellen 
	open PIPE, "|/usr/bin/sendfax -m -s a4 -n -f $fax_sender -d $fax_rec" or die $!;
	prFile("/tmp/fax.$$");
	prTouchUp(0);
	prCompress(1);
	&commit_files(0);
	close(PIPE);	
} else {
	# nothing to do - nichts Faxbares gefunden
}
exit;

###############################################################################
sub parse_MIME_Stream {

	# Neues Parser-Objekt
	my $parser = MIME::Parser->new();

	# Parser einstellen
	# Attachments müssen in den Hauptspeicher passen
	# output_to_core('ALL') bedeutet, dass nichts auf die
	# Festplatte geschrieben wird
	$parser->output_to_core('ALL');
	$parser->filer->purge; # löscht alle vom Parser angelegten Dateien

	my $top_entity = $parser->read($_[0]);
	return $top_entity;

}
###############################################################################
sub walk {
	my $entity = shift if @_;

	return unless defined $entity;
	
	my $head;
	my $body;

	$head = $entity->head();
	# Falls es sich um eine mehrteilige Nachricht handelt
	if ($head->mime_type() =~ m/multipart/i) {
		
		my $i;
		my $num_alt_parts  = $entity->parts();		
		my $current_entity;

		# Für alle Multipart/Alternative-Teile der Nachricht
		for ($i = 0; $i < $num_alt_parts; $i++) {
			# an entity
			$current_entity = $entity->parts($i);
			# recurse
			&walk($current_entity);
		}

	# ansonsten ist es eine einteilige Nachricht
	} else {
		&handle_head($entity,$head);
	}		

}
###############################################################################
sub handle_head {
	my $current_entity = shift if @_;
	my $current_head = shift if @_;

	return unless defined $current_head;

	my $body;

	$current_head->unfold;		

	$body = $current_entity->bodyhandle();

	my $actfile = $body->path;

#"######################## application/pdf #############################################
	if ($current_head->mime_type() eq "application/pdf") { # pdf-attachement
		$mes = $body->as_string;
		my $pdf = PDF::API2->new;
		$pdf = PDF::API2->openScalar($mes);
		$pageNo = $pageNo+$pdf->pages;
		$mescount++;
		$pdf->saveas("/tmp/fax.$mescount.$$");
		$pdf->end;
		$mes = "Got";
######################### application/ms-tnef ######################################
	} elsif ($current_head->mime_type() eq "application/ms-tnef") {        # MS-Outlook - NoOne Knows
		
		my $mimetypes = MIME::Types->new;
		my %TnefOpts=('output_to_core' => 'ALL', 'output_dir' => '/tmp');
		my $tnef = Convert::TNEF->read_ent($body->as_string, \%TnefOpts);
		unless ($tnef) {
			warn "TNEF CONVERT DID NOT WORK: " . $Convert::TNEF::errstr . "\n";
			return;
		}
		foreach ($tnef->attachments) {
			my ($ext) = ($_->longname =~ /\.([A-Za-z]{2,4})$/);
			my $type = $mimetypes->mimeTypeOf($ext) || "application/octet-stream";
			if ($type eq "application/pdf") { 		# pdf-attachement
				$mes = $_->data;
				my $pdf = PDF::API2->new;
				$pdf = PDF::API2->openScalar($mes);
				$pageNo = $pageNo+$pdf->pages;
				$mescount++;
				$pdf->saveas("/tmp/fax.$mescount.$$");
				$pdf->end;
				$mes = "Got";
			} else {					# other attachements
				#ignore
			}	
		}
		$tnef->purge;
	} else {	#other attachements
		if (defined($body->path)) {   # data is on disk:
			unlink($actfile);
		}
	}
}
###############################################################################
sub commit_files {

	for (my $i=1;$i<=$mescount;$i++) {
		if ($i>1) { prPage(); }
		elsif (($i eq 1) && ($_[0] eq 1)) { prPage(); }
		prDoc("/tmp/fax.$i.$$");
	}
	prEnd();
	open(FFILE,"< /tmp/fax.$$");
	binmode(FFILE);
	while (<FFILE>) {
		print PIPE $_;
	}
	close(FFILE);
	unlink("/tmp/fax.$$");
	for (my $i=1;$i<=$mescount;$i++) {
		unlink("/tmp/fax.$i.$$");
	}
}
###############################################################################
__END__

Nutzen kann man das Über einen entsprechenden Service in master.cf

Code:
fax       unix  -       n       n       -       1       pipe
  flags= user=fax argv=/etc/postfix/fax.pl ${sender} ${recipient}

und den entsprechenden Eintrag in transport:

Code:
fax.localdomain fax:localhost
 

Zurzeit aktive Besucher

Statistik des Forums

Themen
246,195
Beiträge
2,247,818
Mitglieder
373,748
Neuestes Mitglied
fanti88
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.