On Wed, 2004-03-31 at 09:40, Suresh Ramasubramanian wrote:
[3/31/2004 8:11 AM]  Soumava Das :
> 
> > Thanks everybody.
> > I think I will go for postfix. But, is there anything equivalent to vexim for 
> > postfix? 
> 
> vpopmail + postfix - http://www.inter7.com/vpopmail/postfix.txt
> 

One problem with the above solution is that it requires qmail also
to be installed. The solution above uses /var/qmail/bin/sendmail to
move the mail from postfix's queue to qmail's queue. Then qmail uses
vdelivermail to deliver the mail to the user's inbox. So you will
require a working setup and configuration of both postfix and qmail.
You will end up have two queues, mail getting written twice to the
disk before getting finally delivered to the user's Maildir.

I had come across this issue around 1.5 years back and wrote a wrapper
called 'postdel' for vdelivermail. Using postdel you will not
require a qmail installation and will hence  reduce your I/O by half.

Since this was done 1.5 years ago, some postfix error code from
sys_exits.h could have changed. If any one wants to hack the code below,
they are free do do. Also like any other free software, my code comes
without warranty or obligations. I also claim no copyrights, etc. You are
free to do anything with the code (except to involve me). If you do
something useful with the code, let me know :)

Summary of steps involved to implement are as below

1. Install vpopmail by following instructions from
   http://www.inter7.com

2. Edit main.cf and master.cf (assuming you have installed and configured postfix)

Have the following in main.cf

local_transport = vdel
vdel_destination_recipient_limit = 1

Have the following line in master.cf
vdel     unix  -       n       n       -       100       pipe
 flags=Fq. user=vpopmail argv=/var/vpopmail/bin/postdel -u $user -d $recipient -r 
$sender

3. Compile postdel.c
   gcc postdel.c -s -O -o postdel
   cp postdel /var/vpopmail/bin

My earlier post with postdel.c attached as a gzip got rejected. Hence
I am resending with the source code inline


/*
 * $Log: postdel.c,v $
 * Revision 2.4  2002-12-13 19:11:15+05:30  Manny
 * added environment variable MAKE_SEEKABLE to turn on/off seekable stdin
 *
 * Revision 2.3  2002-12-11 10:28:26+05:30  Manny
 * added ERESTART check for errno
 *
 * Revision 2.2  2002-12-05 14:15:51+05:30  Manny
 * set environment variable SENDER and MTA
 *
 * Revision 2.1  2002-11-22 14:17:05+05:30  Manny
 * postfix wrapper for vfilter/vdelivermail
 *
 */

#ifndef lint
static char     sccsid[] = "$Id: postdel.c,v 2.4 2002-12-13 19:11:15+05:30 Manny Stab 
root $";
#endif

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

/*
 * From postfix source distribution - sys_exits.h
 */
#define EX_USAGE                64              /*- command line usage error */
#define EX_DATAERR              65              /*- data format error */
#define EX_NOINPUT              66              /*- cannot open input */
#define EX_NOUSER               67              /*- addressee unknown */
#define EX_NOHOST               68              /*- host name unknown */
#define EX_UNAVAILABLE  69              /*- service unavailable */
#define EX_SOFTWARE             70              /*- internal software error */
#define EX_OSERR                71              /*- system error (e.g., can't fork) */
#define EX_OSFILE               72              /*- critical OS file missing */
#define EX_CANTCREAT    73              /*- can't create (user) output file */
#define EX_IOERR                74              /*- input/output error */
#define EX_TEMPFAIL             75              /*- temporary failure */
#define EX_PROTOCOL             76              /*- remote error in protocol */
#define EX_NOPERM               77              /*- permission denied */
#define EX_CONFIG               78              /*- configuration error */
#define MAX_BUFF        2048
#define BOUNCE_ALL      "bounce-no-mailbox"

char           *(vdelargs[]) = { "/var/vpopmail/bin/vdelivermail", "''", BOUNCE_ALL, 
0};
char           *(filtargs[]) = { "/var/vpopmail/bin/vfilter", "''", BOUNCE_ALL, 0};

static int      get_options(int, char **, char *, char *, char *, char *, int *);

int
main(int argc, char **argv)
{
        char            User[MAX_BUFF], Host[MAX_BUFF], ReturnPathEnv[MAX_BUFF], 
Sender[MAX_BUFF];
        int             use_filter, wait_status, tmp_stat;
        pid_t           pid;

        if(get_options(argc, argv, User, Host, ReturnPathEnv, Sender, &use_filter))
                _exit(EX_USAGE);
        if (putenv(User) == -1)
        {
                fprintf(stderr, "postdel: putenv: %s\n", strerror(ENOMEM));
                _exit(EX_OSERR);
        } else
        if (putenv(Host) == -1)
        {
                fprintf(stderr, "postdel: putenv: %s\n", strerror(ENOMEM));
                _exit(EX_OSERR);
        } else
        if (putenv(ReturnPathEnv) == -1)
        {
                fprintf(stderr, "postdel: putenv: %s\n", strerror(ENOMEM));
                _exit(EX_OSERR);
        } else
        if (putenv(Sender) == -1)
        {
                fprintf(stderr, "postdel: putenv: %s\n", strerror(ENOMEM));
                _exit(EX_OSERR);
        } else
        if (putenv("MTA=Postfix") == -1)
        {
                fprintf(stderr, "postdel: putenv: %s\n", strerror(ENOMEM));
                _exit(EX_OSERR);
        }
        switch (pid = vfork())
        {
                case -1:
                        _exit(EX_OSERR);
                case 0:
#ifdef MAKE_SEEKABLE
                        putenv("MAKE_SEEKABLE=1");
#endif
                        if(use_filter)
                                execv(*filtargs, filtargs);
                        else
                                execv(*vdelargs, vdelargs);
                        fprintf(stderr, "postdel: execv: %s\n", *vdelargs);
                        _exit(111);
                default:
                        for(;;)
                        {
                                pid = wait(&wait_status);
                                if(pid == -1 && (errno == EINTR || errno == ERESTART))
                                        continue;
                                else
                                if(pid == -1)
                                {
                                        fprintf(stderr, "postdel: %s. supermail 
bug\n", *vdelargs);
                                        _exit(EX_SOFTWARE);
                                }
                                break;
                        }
                        if(WIFSTOPPED(wait_status) || WIFSIGNALED(wait_status))
                        {
                                fprintf(stderr, "postdel: %s crashed.\n", *vdelargs);
                                _exit(EX_TEMPFAIL);
                        } else
                        if(WIFEXITED(wait_status))
                        {
                                switch ((tmp_stat = WEXITSTATUS(wait_status)))
                                {
                                case 0:
                                        _exit(0);
                                case 100:
                                        _exit(EX_NOUSER);
                                default:
                                        _exit(EX_TEMPFAIL);
                                }
                        }
                        break;
        }
        _exit(EX_TEMPFAIL); return(0); /*- for stupid solaris */
}

static int
get_options(int argc, char **argv, char *user, char *domain, char *rpline, char 
*sender, int *use_filter)
{
        int             c;
        char           *tmpstr;

        *use_filter = 0;
        *user = *domain = *rpline = 0;
        while ((c = getopt(argc, argv, "Vvfu:d:r:")) != -1)
        {
                switch (c)
                {
                case 'f':
                        *use_filter = 1;
                        break;
                case 'u':
                        snprintf(user, MAX_BUFF, "EXT=%s", optarg);
                        break;
                case 'd':
                        if ((tmpstr = strchr(optarg, '@')))
                                snprintf(domain, MAX_BUFF, "HOST=%s", tmpstr + 1);
                        else
                                snprintf(domain, MAX_BUFF, "HOST=%s", optarg);
                        break;
                case 'r':
                        snprintf(rpline, MAX_BUFF, "RPLINE=Return-Path: <%s>\n", 
optarg);
                        snprintf(sender, MAX_BUFF, "SENDER=%s", optarg);
                        break;
                default:
                        fprintf(stderr, "USAGE: postdel [-f] -u user -d domain -r 
sender\n");
                        return(1);
                }
        }
        if(!*user || !*domain || !*rpline)
        {
                fprintf(stderr, "USAGE: postdel [-f] -u user -d domain -r sender\n");
                return(1);
        }
        return(0);
}




-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
_______________________________________________
linux-india-help mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/linux-india-help

Reply via email to