[Raw Msg Headers][Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: home-grown transport agent problems

On Mon, Jan 28, 2002 at 11:54:34PM +0100, Marek Kowal wrote:
> Hi there,
> Due to the development of new propiretary mail system my company decided to
> adopt ZMailer to suit our needs. This required the development of new
> Transport Agent (TA), tailored to our own mail storage schema.
> The TA is performing well, delivers mails as required, but I've encountered
> the problem I cannot solve: once the mailbox quota is reached, I'd like to
> return the letter (or at least -> the information) about unsuccesfull
> delivery to the sender. I tried the following code in my TA:
> void deliver(...){
>   ....
>  if (result==5){
>    diagnostic(startrp,i,0,"size of mailbox exceeds quota for the user");
>          notaryreport(startrp->addr->user, "failed",
>                  "4.2.2 (Destination mailbox full)",
>                  "OnetTA; 500 (Attempting to deliver to full mailbox)");

   This order is wrong.

   First you do 'notaryreport()', which puts data into internal state,
   then you do diagnostics, which uses that internal state.

   Compare with this fragment from   mailbox.c:

	  if (pw == NULL) {
			 "5.2.1 (Target file has no known owner)",
			 "x-local; 510 (Target file has no known owner)");
	    DIAGNOSTIC(rp, file, EX_NOPERM,
		       "File \"%s\" has no owner", file);
	    return 1;

  Your  diagnostic()  call is ok (it has different parameters than
  what macro DIAGNOSTIC has).

> That's it - I am calling diagnostic() and notaryreport() - as seen in
> mailbox.c from zmailer sources, which I tried to follow. When invoking
> the TA from command line, it seems to work OK:

> ps1:/var/spool/postoffice/transport# /root/bin/onetTA -l
> /var/log/mail/onetta
> #hungry
> P/P/654097-21917
> 654097/196              ok3 Message delivered succesfully
> #hungry
> P/Q/654098-21916
> 654098/196              error2 size of mailbox exceeds quota for the user
> #hungry

    "error2" is transport-agent's way (libta library's) to inform
   the scheduler, that the transport-agent did error logging into
   the spool file, and when the scheduler gets around, it should
   analyze the file and report errors.

> Unfortunately, the information letter for the second case is NOT sent back
> to the sender! I have found out (in sheduler.perflog) the following line:
> 1012236984 654097-21916 7 8 error onetta/myslot_specification

   That might mean that there is something wrong in the scheduler.
   (grumble..  possible it always is...)

   Going thru the  u_error2(), and subsequent calls all the way
   into  unctlfile() do, I think, call  reporterrs() in all cases.

> So apparently the scheduler gets informed about the fact, that there was
> delivery error, and simply... discards the letter. I checeked in
> /var/spool/postoffice directories - the letter is simply removed.
> So the question is: what is it, that I am doing wrong? Should I exit() my
> TA, returning EX_UNAVALIABLE after each unsccessfull delivery? Or rather,
> the TA is ok, it is just zmailer which is misconfigured?

   Aside of doing those calls in wrong order I think your TA is ok.
   It should not manifest as disappearing diagnostics, though.

> Please - help. I am getting desperate ;-))
> Cheers,
> Marek.

/Matti Aarnio	<mea@nic.funet.fi>
To unsubscribe from this list: send the line "unsubscribe zmailer" in
the body of a message to majordomo@nic.funet.fi