Anzahl der Zustellversuche Einstellen ?

AnPa

Registered User
Moin Leute,

wie kann ich dem Postfix sagen, das er eine E-Mail nur z.B. 12 Stunden lang versuchen soll, an einen anderen Server zuzustellen ?
Also ich schick eine Mail an einen anderen von meinem Postfix, und der andere ist nicht erreichbar, etc. Wie kann ich hierfür die Anzahl der Versuche oder die maximale Zeitspanne einstellen ?

Vielen Dank :)
 
Welche Einstellungen lässt QMail zu? Ich weiß dass man in der Datei /var/qmail/control/queuelifetime einstellen kann wie lange das Mail in der Warteschlange bleibt.

Gibt es eine Möglichkeit schon nach einer relativ kurzen Zeit eine Warnung zum Absender zu schicken in der er auf die Verzögerung hingewiesen wird?
 
Es scheint also keinen Parameter zu geben der diese Einstellung zu lässt. Der Default Wert für queuelifetime erscheint mir mit 7 Tagen aber sehr hoch. Dann würde der Absender erst nach 7 Tagen das erste mal erfahren, dass das Mail nicht zugestellt wurde weil er sich eventuell bei der Mail Adresse vertippt hat.
 
Hallo,
Es scheint also keinen Parameter zu geben der diese Einstellung zu lässt. Der Default Wert für queuelifetime erscheint mir mit 7 Tagen aber sehr hoch.

wenn Du in /var/qmail/control eine Datei queuelifetime mit dem gewünschten Wert in sekunden anlegst, dann stellt qmail das nach einem Neustart um.

Dann würde der Absender erst nach 7 Tagen das erste mal erfahren, dass das Mail nicht zugestellt wurde weil er sich eventuell bei der Mail Adresse vertippt hat.

oder nach weniger Tagen :)
Aber ich denke mal, Du möchtest gern nach z.B. 4h den Absender informieren, dass seine Mail noch nicht gesendet wurde. Vermute, Huschi hat so etwas schon ;)
Ich habe mir das qmHandle so umgebastelt, dass es die Queue ausliest und per cron eine Mail an die betreffenden Absender schickt. K.A. ob das eine gute Idee ist, aber es funktioniert.

mfg

Jürgen
 
Dann würde der Absender erst nach 7 Tagen das erste mal erfahren, dass das Mail nicht zugestellt wurde weil er sich eventuell bei der Mail Adresse vertippt hat.
Gibt es eine Lösung für das Problem unter qmail innerhalb von Plesk? Oder als externes Programm? Ich kann gern meine überarbeitete Lösung zum Test zur Verfügung stellen. Diese läuft als Perlscript per cronjob (2x täglich) und informiert den Absender per Mail über noch nicht zugestellte Empfänger.
 
Diese Lösung wäre sicherlich interessant, da qmail keine "temporary delivery failures" von sich aus an den Absender meldet.
 
wäre sicherlich interessant
Dachte ich auch :) Nachdem ich Mecker von einem Nutzer erhalten hatte, warum er erst nach mehreren Tagen eine Info zur Nichtzustellbarkeit bekommen hat, hab ich das "gebastelt". Ich weis nun nicht, ob und wie ich das hier reinstellen soll oder ob ich Dir einen Link senden soll ...
 
Je nachdem, wie lang es ist, kannst Du es hier wohl reinstellen... einfach [ code ] und [ /code ] ohne Leerzeichen davor bzw. danach.
 
Hallo,

hier zum testen das Script:
Code:
#!/usr/bin/perl
#
# catch remote adress and mail from queue for info to sender 
# use crontab (6am, 3pm is a idea) to start it 
#
# J.Augustinat 11/2008 <ja-at-regionalnetz.de> 
# thanks to Michele Beltrame <mb-at-italpro.net> for qmHandle
#
use strict;
use warnings;
use diagnostics;

my $version = '1.10';
my ($queue) = '/var/qmail/queue/';
my $summary = 0;
my @array = ();
my $mytime = time();

# set delaytime 4h (*60min*60sekund) 
my $delaytime = 14400; 

# suggestion:
# set delaytime to 3:55:00 and  delaymax = 4:55:00 and 
# set differe > min AND <= max 
# run cronjob every hour
# and
# use a second script with delaytime 12 hours, 
# run cron for this every morning :-)

# set mailprogram      
my $Sendmail_Prog = "/usr/sbin/sendmail";
# your service-mailadress
my $mailfrom = '[email protected]';

# read lifetime
my $day = 0;
my $lifetime = '/var/qmail/control/queuelifetime';
if (-e $lifetime){
    open(DAYS, $lifetime);
    $day = <DAYS>/86400;
    close(DAYS);
    }
    else{
    $day = 7;
    }

# START #
# Create a message list for remote queues
my (@msglist) = ();

foreach my $currentqueue ("remote") {
    opendir(DIR,"${queue}$currentqueue");
    my (@dirlist) = grep !/\./, readdir DIR;
    closedir DIR;
    foreach my $dir (@dirlist) {
	opendir (SUBDIR,"${queue}${currentqueue}/$dir");	
	my (@files) = grep !/\./, map "$dir/$_", readdir SUBDIR;
	foreach my $file (@files) {
	my $Datei = "${queue}${currentqueue}/$file";	
	my @info = stat($Datei);
	my $differe=$mytime-$info[9];
	if ($differe>$delaytime) {
	    push @msglist, "$file";
	}
	}
	closedir SUBDIR;
    }
}

# read for remote message list 
    my ($q) = shift;
    my (%ret, %date, %from, %subj, %to, %allto);
    
    if ($summary == 0) {
	foreach my $msg(@msglist) {

	    # Read return path 
	    open (MSG, "${queue}info/$msg");
	    $ret{$msg} = <MSG>;
	    substr($ret{$msg}, 0, 1) = '';
	    chop ($ret{$msg});
	    close (MSG);

	    # Read all remote (D=Done,T=Todo)
	    open (MSG, "${queue}remote/$msg");
	    $allto{$msg} = <MSG>;
	    chop ($allto{$msg});
	    close (MSG);

    # Read something from message header (sender, receiver, subject, date)
	    open (MSG, "${queue}mess/$msg");
	    while (<MSG>) {
		if ($_ =~ /^Date: /) {
		    $date{$msg} = $';
		    chop ($date{$msg});
		} 
		elsif ( $_ =~ /^From: /) {
		$from{$msg} = $';
		    chop ($from{$msg});
		} 
		elsif ( $_ =~ /^Subject: /) {
		    $subj{$msg} = $';
		    chop ($subj{$msg});
		} 
		elsif ( $_ =~ /^To: /) {
		    $to{$msg} = $';
		    chop ($to{$msg});
		} 
		elsif ( $_ eq "\n") {
		    last;
		}
	    }
	    close (MSG);
	}
    }
    
{
	# split the remote todo
	foreach my $msg(@msglist) {
		my $Stop = 0;
		my @Reci = ();
		my $todo = "";
		my ($dir, $rmsg) = split (/\//, $msg);
		if ($summary == 0) {
		    @array=split(/\0/,$allto{$msg});
		    foreach (@array){
		    $todo = $_ ;
		     if ($todo =~ /^T/) {
			substr($todo, 0, 1) = '';	    
			push (@Reci,"$todo\n");	
	    		}
	    	    }

# -------> e-mail send:
# i use $Stop because no $ret im mail from postmaster 
$Stop = index ($ret{$msg},"@");

 if ($Stop > 0) {
    open(MAIL,"|$Sendmail_Prog -t") || print STDERR "Mailerror,no start \n";
    print MAIL "From: $mailfrom\n";
    print MAIL "To: $ret{$msg}\n";
    print MAIL "Subject: eMail $subj{$msg} \n\n";
    print MAIL "Ihre Mail vom $date{$msg} mit dem \n"; 
    print MAIL "Betreff: $subj{$msg}  \n";
    print MAIL "konnte bisher nicht an folgende Empfänger zugestellt werden: \n\n";
    print MAIL "@Reci \n\n" ; 	     
    print MAIL "Diese Infomail erhalten Sie max. $day Tage lang!\n";
    print MAIL "Bitte Infos unter http://irgendwo.yourdomain.de/xx.html lesen!\n";
    close(MAIL);
#    print "Sender : $from{$msg}\n";  # for test 
#    print "Return : $ret{$msg}\n";  # comment from 
#    print "Betreff: $subj{$msg}  \n"; # open->close MAIL and      
#    print "sending: $date{$msg} \n";# uncomment 
#    print "todo @Reci \n\n" ;    # this line
 		}
		}
	}
    }

Rückmeldungen erwünscht (in englisch bin ich nicht so gut :)
mfg
Jürgen
 
Last edited by a moderator:
Erstmal danke für das Script... und bei mir funktioniert es einwandfrei.

Ggf. lohnt es sich noch, die max. Haltezeit aus der Datei /var/qmail/control/queuelifetime auslesen.
 
Back
Top