Solved

Sendmail Sent Items

Posted on 2001-07-25
27
2,828 Views
Last Modified: 2013-12-17
Dear Sir,

I am using Linux Redhat 6.1 & sendmail-8.9.3-15 Is there anyway when ever I sent an email from any of my email client thru my SMTP server I will get the copy of that email. where I have to define the setting and is that possible, for instance if any one sends an email to abc@abc.com and that abc.com domain is on my server , as a virtual host, and he's using mail.abc.com as his SMTP server what I have to do in order to get the email which abc user's sends let me know if thats possible ..

Please let me know the best way to do it. THanks
0
Comment
Question by:sohaib69
  • 15
  • 8
  • 3
  • +1
27 Comments
 
LVL 1

Author Comment

by:sohaib69
ID: 6316633
Please let me know cos thats very urgent I will increase my points to 300 more if I got the very good answer. THanks..
0
 
LVL 5

Expert Comment

by:vsamtani
ID: 6319236
If you want to keep copies of emails that are coming *to* your server, that's very easy. Suppose you are hosting abc.com as a virtual domain on your server, and in the virtusertable file you have something like:

abc.com       abcuser

Change it to:

abc.com       abcalias

and edit your /etc/aliases file so that you have a line

abcalias: abcuser, sohaib

This way all email thta comes in for <anyone>@abc.com will go to abcuser and also to sohaib

If you want to keep a copy of all emails that are being *relayed* by your server (eg, someone sends an email to your server from a program like Outlook, and then that email is sent by your server to another email server), that is much more difficult. The best way to do it is to recompile your sendmail with a patch, for example, from the following page:

http://www.freakout.de/logall.c

Vijay
0
 
LVL 1

Author Comment

by:sohaib69
ID: 6319776
how I am going to play with that below file please let me know . cos I am not expert - on that sendmail you know so I will really appreciate if you help me compiling that so that when ever I send an email to any one using my smtp server I will get the copy of that email which I send thru my smtp server so please let me know how I am going to do that.

Thanks


/* ---------------------------------------------------------------------------
 *      "LogAll" feature to log any message through this MTA
 */
{
#define LOGALLHEADER      "X-Logged"
#define LOGALLLEVEL      12

      char logallrcsid[] =
            "$Id: logall.c,v 1.24 2001/04/27 16:26:08 root Exp root $"
            "(c) /ARX cleanware 2001";
/*
 *      $Log: logall.c,v $
 *      Revision 1.24  2001/04/27 16:26:08  root
 *      multiple exclude headers
 *
 *      Revision 1.23  2001/04/26 04:37:39  root
 *      8.11.3 sendmail
 *
 *      Revision 1.22  2001/04/26 04:36:18  root
 *      prepend From with 'c'
 *
 *      Revision 1.21  2001/02/28 18:46:27  root
 *      comments
 *
 *      Revision 1.20  2000/08/21 07:01:50  root
 *      released
 *
 *      Revision 1.17  2000/07/22 19:39:12  root
 *      bad word scan and reject
 *
 *      Revision 1.16  2000/03/14 05:41:31  root
 *      copyright in binary
 *
 *      Revision 1.14  1999/11/21 11:45:56  root
 *      feature exclude added
 *
 *      Revision 1.13  1998/10/03 11:19:33  root
 *      released
 *
 *      Revision 1.12  1998/09/20 19:45:28  root
 *      8.9.1a stable
 *
 *      Revision 1.11  1998/09/19 10:12:04  root
 *      published
 *
 *      Revision 1.7  1998/09/17 07:12:49  root
 *      clobbered qtimestr
 *

ABSTRACT
========

 This routine logs every message in a mail folder before it is
actually transmitted.  The log is "envelope-oriented" which means
it logs every message once - not for every recipient.  You must
also see the sendmail syslog for actual delivery.  The log
includes full message bodys.

 The routine uses the checkcompat() interface. To every logged mail
a new header "X-Logged" is added which includes machine and time of
the queueing. From LogLevel >=12 the routine logs itself to the
sendmail syslog. For debugging the routine's actions flag -D49.1
should be set.

 Mails which contain configurable headers can be excluded from the
log.  For example all messages from mailling-lists can be excluded
from the log.

 The routine can also search any mail body for a configurable list
of keywords (sex, bomb, virus, ...).  If one of the keywords is
found in the body of the mail or in the subject the mail is
rejected (return to sender without body).

 Pitfalls of this approach: This filter can _NOT_ work on crypted
or compressed mail or on attachments where the body is not
readable.  It will not work if the keywords are splitted on two
lines or scrambled (se-x, vi..rus, ...).

 Also it is possible that the filter will reject mail which should
be passed - for example a man living in "Sussex" who has its
hometown in his mail footer.  He will never be able to mail to
your site.  Also all binary data is likely to have such strings
inside - the longer the more likelihood a match of the keywords
is.

 To make the filter less restrictive against such large
attachments a maximum file size to scan is configurable and the
keywords must appear as "words" - surrounded by spaces or
non-alphanumeric characters.  So this filter is only usefull for
some kind of a very restrictive site like a school or religious
organisation.

 The activation of this filter also makes the whole mail agent a
lot slower - on heavy loaded systems a hardware upgrade might be
needed.  Mails which are excluded from the log are also excluded
from the scan.

 *      IMPLEMENTATION
 *      The logging code is compiled into the sendmail binary
 *      with the documented and often overlooked checkcompat()
 *      routine:
 *      see "Bryan Costales & Eric Allman: sendmail 2nd Edition
 *            O'Reilly 1997
 *            ?20 `The checkcompat() Cookbook' p.285ff"
 *      To check whether a message was already logged it adds
 *      a new header "X-Logged" to the message with the logging
 *      host, the envelope id and queued date/time as values.
 *      As long as this info doesn't change the message is no
 *      more logged.
 *
 *      CONFIGURATION
 *      The logging is configuerd in new macro(s)/class:
 *
 *      D{LogAll}path
 *      where path is the full pathname of the logfile, which
 *      should be mode 600. REMEMBER THIS IS A FULL BODY LOG.
 *      So be prepared for a huge file on site with much traffic.
 *      The file must exist and every mail is appended to it.
 *
 *      D{LogExc}header
 *      specifies headers. LogAll will not log any messages which
 *      have any of these headers. This is useful to exclude all mails from
 *      or to mailing lists for example by specifying "X-Mailing-List".
 *      Separate the headers with spaces.
 *
 *      D{LogMax}max_size_in_bytes
 *      when this macro is defined the filter will scan the subject
 *      and mail body for the list of keywords in the class {LogBad}
 *      and reject any mail which contains one or more of the keywords.
 *      It also specifies the maximum size of a mail body which should be
 *      scanned against the keyword list in class {LogBad}. If it is 0
 *      (not recommended) messages of any size will be scanned (expect
 *      no large attachments to come through and a big waste of bandwidth).
 *
 *      C{LogBad}keyword...
 *      F{LogBad}path
 *      this is the class which must be defined when the macro {LogMax}
 *      is defined and the routine should scan the mail body for bad
 *      keywords. The word are the words in the class. You can either
 *      use the "C" form and include the list of words in the config
 *      file or the "F" form and maintain the list in a separate file.
 *
 *      The macro(s) should be inserted into a m4-config-file for
 *      example like this:
 *
 *            LOCAL_CONFIG
 *            D{LogAll}/var/log/mail.log
 *            D{LogExc}X-Mailing-List
 *            D{LogMax}65535
 *            C{LogBad}sex bomb
 *
 *      INSTALLATION
 *      This source fragment must be included into the source-file:
 *      .../sendmail-8.x.y/src/conf.c
 *      at the following position (with the full path name of its
 *      current location - here "/root/adm/mail/sendmail/logall.c"):
 *
 *>>old            if (tTd(49, 1))
 *>>old                  printf("checkcompat(to=%s, from=%s)\n",            
 *>>old                        to->q_paddr, e->e_from.q_paddr);          
 *>>old
 *>>new            #include "/root/adm/mail/sendmail/logall.c"
 *>>old
 *>>old            # ifdef EXAMPLE_CODE
 *
 *      the sendmail binary must be remaked and reinstalled at
 *      its proper position (normally /usr/sbin/sendmail).
 *      The daemon must be restarted.
 *
 *      MANAGEMENT
 *      Since the logfile produced by LogAll is a standard Unix-mailfolder,
 *      the logged mails can be managed with every Unix mail-reader or MUA.
 *      The mails inside the log can be deleted, remailed or read with any
 *      mail user agent. If the logfile is the standard mail folder of a
 *      special "LogAll-user" this is especially easy and even "mail"
 *      or a Windows-based IMAP-client can manage the logfile.
 *
 *      LOGGING
 *      The routine logs its usage with LOG_LEVEL>=12 into the standard
 *      sendmail logging file. To debug the use of the routine you must
 *      set debug flag 49.1.
 *
 *      COMPATIBILITY
 *      LogAll is tested with following combinations:
 *      sendmail-8.8.5 /  Linux 2.0.29
 *      sendmail-8.9.1a / Linux 2.0.29
 *      sendmail-8.9.2 /  Linux 2.0.36
 *      sendmail-8.9.2 /  Linux 2.2.16
 *      sendmail-8.11.0 / Linux 2.2.16.
 *      sendmail-8.11.3 / Linux 2.2.16.
 *
 *      AUTHOR
 *      Axel Reinhold - logall@freakout.de
 *
 *      LICENSE/WARRANTY
 *      The software is provided "AS IS" without warranties of any kind,
 *      either expressed or implied, including, but not limited to the
 *      implied warranties of merchantability and fitness for a particular
 *      purpose. The entire risc of the software is with you. In no event
 *      we will be liable for any damages, including any lost profits,
 *      lost savings or other incidental damages arising out of the use
 *      or inability to use the software, even if we have been advised
 *      of the possibility of such damages, or for any claim by another party.
 *      The license is free in every aspect - there are no costs or
 *      restrictions of any kind.
 *   -------------------------------------------------------------------------
 */

      int mid;                  /* sendmail macro id                */
      char *logall = NULL;            /* log file path from macro LogAll  */
      char bfpath[MAXLINE];            /* body file path                */
      char *hlogged = LOGALLHEADER;      /* header field                      */
      char *mailist = NULL;            /* header field for mailing lists   */
      char hlogval[MAXLINE];            /* header value                      */
      char *hlogvalp;                  /* header value pointer                */
      char qtimestr[80];            /* queued time string from asctime  */
      FILE *lf, *bf;                  /* log and body files                */
      ADDRESS *a;                  /* address structure                */
      HDR *h;                        /* header structure                */
      int toflag = 0;                  /* to header flag                */
      int fromflag = 0;            /* from header flag                */
      char *badword = NULL;            /* badword scan flag                */
      int exclhdr = 0;            /* exclude header scan flag          */
      long lfpos, bfpos;            /* remember file pos                */
      size_t b_read;                  /* bytes read counter                */
      long bodybytes = 0;            /* body bytes length read          */
      unsigned char b_buf[8193];      /* buffer for read/write body          */
      char *maxscan = NULL;            /* max mail macro for scan          */
      int maxsize = 0;            /* value for max size to scan          */
      char *sep_list = " \t\n\r.,-()[]/!?";/* separator list for word scan*/
      char *hsep_list = " \t,";      /* separator list for header scan   */
      char *token;                  /* word token for match to badlist  */
      char *hsubjvalp;            /* subject header value pointer          */
      char subject[MAXLINE];            /* subject header value pointer          */

      mid = macid("{LogAll}", NULL);      /* get our config macro                */
      logall = macvalue(mid, e);      /* to check whether and where to log*/

      /* Use logging if macro is set and we can open the logfile          */
      if ((logall!=NULL) && ((lf = fopen(logall, "r+"))!=NULL)) {
        if (tTd(49, 1))            /* debug use of logging                */
            printf("checkcompat: LogAll=%s e_id=%s\n", logall, e->e_id);

        /* check whether to scan for bad words                      */
        mid = macid("{LogMax}", NULL);/* get max scan macro                */
        maxscan = macvalue(mid, e);
        if (maxscan!=NULL) {
              maxsize = atoi(maxscan);
              if (tTd(49, 1))            /* debug use of logging                */
                  printf("checkcompat: LogAll: BadScan=%ld\n", maxsize);
            }

        /* don't log eXcluded mails                                    */
        mid = macid("{LogExc}", NULL);            /* get exclude macro*/
        mailist = macvalue(mid, e);
        if (mailist!=NULL) {
          token = strtok (mailist, hsep_list);
          while (token!=NULL) {
            if (hvalue(token, e->e_header)!=NULL) {
                  exclhdr = 1;
                  break;
            }
            token = strtok(NULL, hsep_list);
          }
        }
        if (mailist==NULL || exclhdr==0) {

          /* construct the "X-Logged" header field */
          strcpy(qtimestr, asctime(localtime(&e->e_ctime))); /* get time  */
          if (qtimestr[strlen(qtimestr)-1]=='\n')      /* remove trailing  */
                qtimestr[strlen(qtimestr)-1]='\0';      /* line-feed asctime*/
          sprintf(hlogval, "Logged by %s as %s at %s",
            MyHostName, e->e_id, qtimestr);            /* our header field */

          /* check the subject for bad words                            */
          if (maxscan!=NULL) {
            hsubjvalp = hvalue("Subject", e->e_header);/* get subject   */
            if (hsubjvalp!=NULL) {
            mid = macid("{LogBad}", NULL);
            strncpy(subject, hsubjvalp, sizeof(subject)-1);
            subject[sizeof(subject)-1] = '\0';
            token = strtok(subject, sep_list);
            while (token!=NULL) {
                  if (wordinclass(token, mid)) {
                        badword = strdup(token);
                        break;
                        }
                  token = strtok(NULL, sep_list);
                  }
            }
            }

          /* add the header if it doesn't already exist                */
          hlogvalp = hvalue(hlogged, e->e_header);      /* get actual field */

#ifdef H_STRIPCOMM
          /* dirty hack 8.11.0 needs four parms and defines this value    */
          /* don't know about 8.9.3-8.9.10 maybe clashes at compile          */
          if (hlogvalp==NULL) addheader(hlogged, hlogval, H_DEFAULT, &e->e_header);
#else
          if (hlogvalp==NULL) addheader(hlogged, hlogval, &e->e_header);
#endif

          /* Log the message if our header didn't exist or was not from us*/
          if ((hlogvalp==NULL) || (strcmp(hlogvalp, hlogval)!=0)) {

            /* lock the logfile exclusive                            */
            if (lockfile(fileno(lf), logall, NULL, LOCK_EX)) ;
            fseek(lf, 0, SEEK_END);      /* go the eof for appending message */
            lfpos = ftell(lf);            /* remember old position    */

            /* syslog the usage of LogAll                            */
            if (LogLevel >= LOGALLLEVEL) sm_syslog(LOG_INFO, e->e_id,
                  "LogAll to %s at %s", logall, qtimestr);

            /* print the Unix From line to separate messages in log file*/
            fprintf(lf, "From %s %s\n", e->e_from.q_user, qtimestr);

            /* scan all headers                                  */
            for (h = e->e_header; h != NULL; h = h->h_link) {

                  /* check if our header is from us and recent          */
                  /* if not change the field value to our field          */
                  if (strcasecmp(h->h_field, hlogged)==0) {
                        if (hlogvalp!=NULL) {
                              h->h_value =
                               realloc(h->h_value, strlen(hlogval)+1);
                              strcpy(h->h_value, hlogval);
                              }
                        h->h_flags &= ~H_DEFAULT;      /* set flag */
                        }

                  /* log the header if appropiate                      */
                  if ((h->h_value!=NULL) && ((h->h_flags & H_RESENT)==0)) {
                        fprintf(lf, "%s: %s\n", h->h_field, h->h_value);
                        }

                  if (h->h_flags & H_RCPT) toflag = 1;      /* to-header*/

                  }

            if (!toflag) {      /* if no to-header construct from envelope  */
                  fprintf(lf, "To:");
                  for (a = e->e_sendqueue; a != NULL; a = a->q_next)
                        fprintf(lf, " %s", a->q_paddr);
                  fprintf(lf, "\n");
                  }

            fprintf(lf, "\n");      /* separate headers from body          */

            /* create body path                                  */
            sprintf(bfpath, "%s/df%s", QueueDir, e->e_id); /* body file */

            /* now add the body from temp file or queued data file          */
            bf = NULL;
            if (e->e_dfp != NULL) {      /* if body temp file is open use it */
                  bfpos = ftell(e->e_dfp);/* remember old position    */
                  rewind(e->e_dfp);      /* read from beginning          */
                  bf = e->e_dfp;
                  }
            else      bf = fopen(bfpath, "r");            /* body file*/

            if (bf==NULL) {                  /* no body could be opened  */
                  if (tTd(49, 1))
                      printf("checkcompat: fopen(%s) failed\n", bfpath);
                  }
            else      {
                  mid = macid("{LogBad}", NULL);
                  while ((fgets(b_buf, sizeof(b_buf)-1, bf)) != NULL && badword==NULL) {
                        b_read = strlen(b_buf);
                        /* if line within mail starts with "From " prepend it with '>' */
                        if (strncmp(b_buf, "From ", 5)==0) fputc('>', lf);
                        fputs(b_buf, lf);
                        /* now scan the body from temp file or queued data file */
                          if (tTd(49, 1))      printf("checkcompat: LogAll: bodybytes=%ld\n", bodybytes);
                        if (maxscan!=NULL && bodybytes<maxsize) {
                              b_buf[b_read] = '\0';
                              token = strtok(b_buf, sep_list);
                              while (token!=NULL) {
                                      if (tTd(49, 1))
                                          printf("checkcompat: LogAll: tok=\"%s\"\n", token);
                                    if (wordinclass(token, mid)) {
                                          badword = strdup(token);
                                          break;
                                          }
                                    token = strtok(NULL, sep_list);
                                    }
                              }
                        bodybytes += b_read;
                        }
                  }

            if (e->e_dfp != NULL)      /* if body temp file is open use it */
                  fseek(e->e_dfp, bfpos, SEEK_SET); /* set old pos    */
            else      fclose(bf);

            if (badword!=NULL) {
                  /* found bad word so discard the last body log          */
                  fseek(lf, lfpos, SEEK_SET);       /* set old pos      */
                  ftruncate(fileno(lf), lfpos);
                  }
            else      {
                  fprintf(lf, "\n");      /* print trailing empty line*/
                  }
            if (lockfile(fileno(lf), logall, NULL, LOCK_UN)) ; /* unlock*/
            }
          fclose(lf);
          }
          if (badword!=NULL) {
            if (LogLevel >= LOGALLLEVEL) sm_syslog(LOG_INFO, e->e_id,
                  "LogAll rejected bad word \"%s\" to=%s from=%s\n",
                        badword, to->q_paddr, e->e_from.q_paddr);
            free(badword);
            usrerr("553 Bad words in mail not allowed");
            e->e_flags |= EF_NO_BODY_RETN;
            to->q_status = "5.7.1";
            return (EX_UNAVAILABLE);
                }
        }

/*   ------------------------------------------------------------
 *      LogAll End
 *      (c) /ARX cleanware
 *      $Revision: 1.24 $
 *   ------------------------------------------------------------
 */
}
0
 
LVL 15

Expert Comment

by:samri
ID: 6322226
sohaib69,

It's quite straight forward.  All you need to do is to get yourself a copy of sendmail source from http://www.sendmail.org.  And I believe the current version is 8.11.4  (ftp://ftp.sendmail.org/pub/sendmail/sendmail.8.11.4.tar.gz), uncompress is and go to the directory, sendmail-8.11.4/src/, and edit the file conf.c.  Well read the top part of logall.c.  Make sure you copy the file logall.c to that directory too.   And compile sendmail.

It does work.  I tried it.  The problem is, it will captured almost all the mail that went thru you server.  Maybe a bit of midification would achieve you goal (if you knew C).

*     INSTALLATION
                     *     This source fragment must be included into the source-file:
                     *     .../sendmail-8.x.y/src/conf.c
                     *     at the following position (with the full path name of its
                     *     current location - here "/root/adm/mail/sendmail/logall.c"):
                     *
                     *>>old          if (tTd(49, 1))
                     *>>old               printf("checkcompat(to=%s, from=%s)\n",            
                     *>>old                    to->q_paddr, e->e_from.q_paddr);          
                     *>>old
                     *>>new          #include "/root/adm/mail/sendmail/logall.c"
                     *>>old
                     *>>old          # ifdef EXAMPLE_CODE
                     *
                     *     the sendmail binary must be remaked and reinstalled at
                     *     its proper position (normally /usr/sbin/sendmail).
                     *     The daemon must be restarted.
                     *
0
 
LVL 1

Author Comment

by:sohaib69
ID: 6322631
Thank you for your email..

I have sendmail running on my server. the version is
sendmail-8.9.3-15

and the sendmail.cf file is as below . so please tell me where to make changes in order to run that thing which I request you.. I hope you help me.. Thanks A lot.

#
# Copyright (c) 1998 Sendmail, Inc.  All rights reserved.
# Copyright (c) 1983, 1995 Eric P. Allman.  All rights reserved.
# Copyright (c) 1988, 1993
#      The Regents of the University of California.  All rights reserved.
#
# By using this file, you agree to the terms and conditions set
# forth in the LICENSE file which can be found at the top level of
# the sendmail distribution.
#
#

######################################################################
######################################################################
#####
#####            SENDMAIL CONFIGURATION FILE
#####
##### built by root@porky.devel.redhat.com on Wed Sep 1 09:40:32 EDT 1999
##### in /usr/src/bs/BUILD/sendmail-8.9.3/cf/cf
##### using ../ as configuration include directory
#####
######################################################################
######################################################################

#####  @(#)cfhead.m4      8.23 (Berkeley) 10/6/1998  #####
#####  @(#)cf.m4      8.29 (Berkeley) 5/19/1998  #####



#####  @(#)linux.m4      8.7 (Berkeley) 5/19/1998  #####









#####  @(#)smrsh.m4      8.8 (Berkeley) 5/19/1998  #####


#####  @(#)mailertable.m4      8.10 (Berkeley) 10/6/1998  #####


#####  @(#)virtusertable.m4      8.8 (Berkeley) 10/6/1998  #####


#####  @(#)redirect.m4      8.10 (Berkeley) 5/19/1998  #####


#####  @(#)always_add_domain.m4      8.6 (Berkeley) 5/19/1998  #####


#####  @(#)use_cw_file.m4      8.6 (Berkeley) 5/19/1998  #####



#####  @(#)local_procmail.m4      8.11 (Berkeley) 5/19/1998  #####




#####  @(#)access_db.m4      8.8 (Berkeley) 5/19/1998  #####


#####  @(#)blacklist_recipients.m4      8.9 (Berkeley) 5/19/1998  #####


#####  @(#)accept_unresolvable_domains.m4      8.7 (Berkeley) 5/19/1998  #####



#####  @(#)proto.m4      8.243 (Berkeley) 2/2/1999  #####


# level 8 config file format
V8/Berkeley

# override file safeties - setting this option compromises system security
# need to set this now for the sake of class files
#O DontBlameSendmail=safe

##################
#   local info   #
##################

Cwlocalhost
# file containing names of hosts for which we receive email
Fw/etc/sendmail.cw

# my official domain name
# ... define this only if sendmail cannot automatically determine your domain
#Dj$w.Foo.COM


CP.

# "Smart" relay host (may be null)
DS


# operators that cannot be in local usernames (i.e., network indicators)
CO @ % !

# a class with just dot (for identifying canonical names)
C..

# a class with just a left bracket (for identifying domain literals)
C[[

# Mailer table (overriding domains)
Kmailertable hash -o /etc/mailertable





# Virtual user table (maps incoming users)Kvirtuser hash -o /etc/virtusertable

# Access list database (for spam stomping)
Kaccess hash -o /etc/mail/access



# Hosts that will permit relaying ($=R)
FR-o /etc/mail/relay-domains

# who I send unqualified names to (null means deliver locally)
DR

# who gets all local email traffic ($R has precedence for unqualified names)
DH

# dequoting map
Kdequote dequote

# class E: names that should be exposed as from this host, even if we masquerade
# class L: names that should be delivered locally, even if we have a relay
# class M: domains that should be converted to $M
#CL root
CE root

# who I masquerade as (null for no masquerading) (see also $=M)
DM

# my name for error messages
DnMAILER-DAEMON


CPREDIRECT

# Configuration version number
DZ8.9.3


###############
#   Options   #
###############

# strip message body to 7 bits on input?
O SevenBitInput=False

# 8-bit data handling
O EightBitMode=pass8


# wait for alias file rebuild (default units: minutes)
O AliasWait=10

# location of alias file
O AliasFile=/etc/aliases

# minimum number of free blocks on filesystem
O MinFreeBlocks=100

# maximum message size
#O MaxMessageSize=1000000

# substitution for space (blank) characters
O BlankSub=.

# avoid connecting to "expensive" mailers on initial submission?
O HoldExpensive=False

# checkpoint queue runs after every N successful deliveries
#O CheckpointInterval=10

# default delivery mode
O DeliveryMode=background

# automatically rebuild the alias database?
O AutoRebuildAliases=

# error message header/file
#O ErrorHeader=/etc/sendmail.oE

# error mode
#O ErrorMode=print

# save Unix-style "From_" lines at top of header?
#O SaveFromLine

# temporary file mode
O TempFileMode=0600

# match recipients against GECOS field?
#O MatchGECOS

# maximum hop count
#O MaxHopCount=17

# location of help file
O HelpFile=/usr/lib/sendmail.hf

# ignore dots as terminators in incoming messages?
#O IgnoreDots

# name resolver options
#O ResolverOptions=+AAONLY

# deliver MIME-encapsulated error messages?
O SendMimeErrors=True

# Forward file search path
O ForwardPath=$z/.forward.$w:$z/.forward

# open connection cache size
O ConnectionCacheSize=2

# open connection cache timeout
O ConnectionCacheTimeout=5m

# persistent host status directory
#O HostStatusDirectory=.hoststat

# single thread deliveries (requires HostStatusDirectory)?
#O SingleThreadDelivery

# use Errors-To: header?
O UseErrorsTo=False

# log level
O LogLevel=9

# send to me too, even in an alias expansion?
#O MeToo

# verify RHS in newaliases?
O CheckAliases=False

# default messages to old style headers if no special punctuation?
O OldStyleHeaders=True

# SMTP daemon options
#O DaemonPortOptions=Port=esmtp

# privacy flags
O PrivacyOptions=authwarnings

# who (if anyone) should get extra copies of error messages
#O PostMasterCopy=Postmaster

# slope of queue-only function
#O QueueFactor=600000

# queue directory
O QueueDirectory=/var/spool/mqueue

# timeouts (many of these)
#O Timeout.initial=5m
O Timeout.connect=1m
#O Timeout.iconnect=5m
#O Timeout.helo=5m
#O Timeout.mail=10m
#O Timeout.rcpt=1h
#O Timeout.datainit=5m
#O Timeout.datablock=1h
#O Timeout.datafinal=1h
#O Timeout.rset=5m
#O Timeout.quit=2m
#O Timeout.misc=2m
#O Timeout.command=1h
#O Timeout.ident=30s
#O Timeout.fileopen=60s
O Timeout.queuereturn=5d
#O Timeout.queuereturn.normal=5d
#O Timeout.queuereturn.urgent=2d
#O Timeout.queuereturn.non-urgent=7d
O Timeout.queuewarn=4h
#O Timeout.queuewarn.normal=4h
#O Timeout.queuewarn.urgent=1h
#O Timeout.queuewarn.non-urgent=12h
#O Timeout.hoststatus=30m

# should we not prune routes in route-addr syntax addresses?
#O DontPruneRoutes

# queue up everything before forking?
O SuperSafe=True

# status file
O StatusFile=/var/log/sendmail.st

# time zone handling:
#  if undefined, use system default
#  if defined but null, use TZ envariable passed in
#  if defined and non-null, use that info
#O TimeZoneSpec=

# default UID (can be username or userid:groupid)
O DefaultUser=8:12

# list of locations of user database file (null means no lookup)
#O UserDatabaseSpec=/etc/userdb

# fallback MX host
#O FallbackMXhost=fall.back.host.net

# if we are the best MX host for a site, try it directly instead of config err
O TryNullMXList=true

# load average at which we just queue messages
#O QueueLA=8

# load average at which we refuse connections
#O RefuseLA=12

# maximum number of children we allow at one time
#O MaxDaemonChildren=12

# maximum number of new connections per second
#O ConnectionRateThrottle=3

# work recipient factor
#O RecipientFactor=30000

# deliver each queued job in a separate process?
#O ForkEachJob

# work class factor
#O ClassFactor=1800

# work time factor
#O RetryFactor=90000

# shall we sort the queue by hostname first?
#O QueueSortOrder=priority

# minimum time in queue before retry
#O MinQueueAge=30m

# default character set
#O DefaultCharSet=iso-8859-1

# service switch file (ignored on Solaris, Ultrix, OSF/1, others)
#O ServiceSwitchFile=/etc/service.switch

# hosts file (normally /etc/hosts)
#O HostsFile=/etc/hosts

# dialup line delay on connection failure
#O DialDelay=10s

# action to take if there are no recipients in the message
#O NoRecipientAction=add-to-undisclosed

# chrooted environment for writing to files
#O SafeFileEnvironment=/arch

# are colons OK in addresses?
#O ColonOkInAddr

# how many jobs can you process in the queue?
#O MaxQueueRunSize=10000

# shall I avoid expanding CNAMEs (violates protocols)?
#O DontExpandCnames

# SMTP initial login message (old $e macro)
O SmtpGreetingMessage=$j Sendmail $v/$Z; $b

# UNIX initial From header format (old $l macro)
O UnixFromLine=From $g  $d

# From: lines that have embedded newlines are unwrapped onto one line
#O SingleLineFromHeader=False

# Allow HELO SMTP command that does not include a host name
#O AllowBogusHELO=False

# Characters to be quoted in a full name phrase (@,;:\()[] are automatic)
#O MustQuoteChars=.

# delimiter (operator) characters (old $o macro)
O OperatorChars=.:%@!^/[]+

# shall I avoid calling initgroups(3) because of high NIS costs?
#O DontInitGroups

# are group-writable :include: and .forward files (un)trustworthy?
#O UnsafeGroupWrites

# where do errors that occur when sending errors get sent?
#O DoubleBounceAddress=postmaster

# what user id do we assume for the majority of the processing?
#O RunAsUser=sendmail

# maximum number of recipients per SMTP envelope
#O MaxRecipientsPerMessage=100

# shall we get local names from our installed interfaces?
O DontProbeInterfaces=true






###########################
#   Message precedences   #
###########################

Pfirst-class=0
Pspecial-delivery=100
Plist=-30
Pbulk=-60
Pjunk=-100

#####################
#   Trusted users   #
#####################

# this is equivalent to setting class "t"
#Ft/etc/sendmail.ct
Troot
Tdaemon
Tuucp
#########################
#   Format of headers   #
#########################

H?P?Return-Path: <$g>
HReceived: $?sfrom $s $.$?_($?s$|from $.$_)
      $.by $j ($v/$Z)$?r with $r$. id $i$?u
      for $u; $|;
      $.$b
H?D?Resent-Date: $a
H?D?Date: $a
H?F?Resent-From: $?x$x <$g>$|$g$.
H?F?From: $?x$x <$g>$|$g$.
H?x?Full-Name: $x
# HPosted-Date: $a
# H?l?Received-Date: $b
H?M?Resent-Message-Id: <$t.$i@$j>
H?M?Message-Id: <$t.$i@$j>
#
######################################################################
######################################################################
#####
#####                  REWRITING RULES
#####
######################################################################
######################################################################

############################################
###  Ruleset 3 -- Name Canonicalization  ###
############################################
S3

# handle null input (translate to <@> special case)
R$@                  $@ <@>

# strip group: syntax (not inside angle brackets!) and trailing semicolon
R$*                  $: $1 <@>                  mark addresses
R$* < $* > $* <@>      $: $1 < $2 > $3                  unmark <addr>
R@ $* <@>            $: @ $1                        unmark @host:...
R$* :: $* <@>            $: $1 :: $2                  unmark node::addr
R:include: $* <@>      $: :include: $1                  unmark :include:...
R$* [ $* : $* ] <@>      $: $1 [ $2 : $3 ]            unmark IPv6 addrs
R$* : $* [ $* ]            $: $1 : $2 [ $3 ] <@>            remark if leading colon
R$* : $* <@>            $: $2                        strip colon if marked
R$* <@>                  $: $1                        unmark
R$* ;                     $1                        strip trailing semi
R$* < $* ; >               $1 < $2 >                  bogus bracketed semi

# null input now results from list:; syntax
R$@                  $@ :; <@>

# strip angle brackets -- note RFC733 heuristic to get innermost item
R$*                  $: < $1 >                  housekeeping <>
R$+ < $* >               < $2 >                  strip excess on left
R< $* > $+               < $1 >                  strip excess on right
R<>                  $@ < @ >                  MAIL FROM:<> case
R< $+ >                  $: $1                        remove housekeeping <>

# make sure <@a,@b,@c:user@d> syntax is easy to parse -- undone later
R@ $+ , $+            @ $1 : $2                  change all "," to ":"

# localize and dispose of route-based addresses
R@ $+ : $+            $@ $>96 < @$1 > : $2            handle <route-addr>

# find focus for list syntax
R $+ : $* ; @ $+      $@ $>96 $1 : $2 ; < @ $3 >      list syntax
R $+ : $* ;            $@ $1 : $2;                  list syntax

# find focus for @ syntax addresses
R$+ @ $+            $: $1 < @ $2 >                  focus on domain
R$+ < $+ @ $+ >            $1 $2 < @ $3 >                  move gaze right
R$+ < @ $+ >            $@ $>96 $1 < @ $2 >            already canonical

# do some sanity checking
R$* < @ $* : $* > $*      $1 < @ $2 $3 > $4            nix colons in addrs

# convert old-style addresses to a domain-based address
R$- ! $+            $@ $>96 $2 < @ $1 .UUCP >      resolve uucp names
R$+ . $- ! $+            $@ $>96 $3 < @ $1 . $2 >            domain uucps
R$+ ! $+            $@ $>96 $2 < @ $1 .UUCP >      uucp subdomains

# if we have % signs, take the rightmost one
R$* % $*            $1 @ $2                        First make them all @s.
R$* @ $* @ $*            $1 % $2 @ $3                  Undo all but the last.
R$* @ $*            $@ $>96 $1 < @ $2 >            Insert < > and finish

# else we must be a local name
R$*                  $@ $>96 $1


################################################
###  Ruleset 96 -- bottom half of ruleset 3  ###
################################################

S96

# handle special cases for local names
R$* < @ localhost > $*            $: $1 < @ $j . > $2            no domain at all
R$* < @ localhost . $m > $*      $: $1 < @ $j . > $2            local domain
R$* < @ localhost . UUCP > $*      $: $1 < @ $j . > $2            .UUCP domain
R$* < @ [ $+ ] > $*            $: $1 < @@ [ $2 ] > $3            mark [a.b.c.d]
R$* < @@ $=w > $*            $: $1 < @ $j . > $3            self-literal
R$* < @@ $+ > $*            $@ $1 < @ $2 > $3            canon IP addr





# if really UUCP, handle it immediately

# try UUCP traffic as a local address
R$* < @ $+ . UUCP > $*            $: $1 < @ $[ $2 $] . UUCP . > $3
R$* < @ $+ . . UUCP . > $*      $@ $1 < @ $2 . > $3

# pass to name server to make hostname canonical
R$* < @ $* $~P > $*            $: $1 < @ $[ $2 $3 $] > $4

# local host aliases and pseudo-domains are always canonical
R$* < @ $=w > $*            $: $1 < @ $2 . > $3
R$* < @ $j > $*                  $: $1 < @ $j . > $2
R$* < @ $=M > $*            $: $1 < @ $2 . > $3
R$* < @ $* $=P > $*            $: $1 < @ $2 $3 . > $4
R$* < @ $* . . > $*            $1 < @ $2 . > $3


##################################################
###  Ruleset 4 -- Final Output Post-rewriting  ###
##################################################
S4

R$* <@>                  $@                        handle <> and list:;

# strip trailing dot off possibly canonical name
R$* < @ $+ . > $*      $1 < @ $2 > $3

# eliminate internal code -- should never get this far!
R$* < @ *LOCAL* > $*      $1 < @ $j > $2

# externalize local domain info
R$* < $+ > $*            $1 $2 $3                  defocus
R@ $+ : @ $+ : $+      @ $1 , @ $2 : $3            <route-addr> canonical
R@ $*                  $@ @ $1                        ... and exit

# UUCP must always be presented in old form
R$+ @ $- . UUCP            $2!$1                        u@h.UUCP => h!u

# delete duplicate local names
R$+ % $=w @ $=w            $1 @ $2                        u%host@host => u@host



##############################################################
###   Ruleset 97 -- recanonicalize and call ruleset zero   ###
###               (used for recursive calls)               ###
##############################################################

S97
R$*                  $: $>3 $1
R$*                  $@ $>0 $1


######################################
###   Ruleset 0 -- Parse Address   ###
######################################

S0

R$*                  $: $>Parse0 $1            initial parsing
R<@>                  $#local $: <@>            special case error msgs
R$*                  $: $>98 $1            handle local hacks
R$*                  $: $>Parse1 $1            final parsing

#
#  Parse0 -- do initial syntax checking and eliminate local addresses.
#      This should either return with the (possibly modified) input
#      or return with a #error mailer.  It should not return with a
#      #mailer other than the #error mailer.
#

SParse0
R<@>                  $@ <@>                  special case error msgs
R$* : $* ; <@>            $#error $@ 5.1.3 $: "List:; syntax illegal for recipient addresses"
#R@ <@ $* >            < @ $1 >            catch "@@host" bogosity
R<@ $+>                  $#error $@ 5.1.3 $: "User address required"
R$*                  $: <> $1
R<> $* < @ [ $+ ] > $*      $1 < @ [ $2 ] > $3
R<> $* <$* : $* > $*      $#error $@ 5.1.3 $: "Colon illegal in host name part"
R<> $*                  $1
R$* < @ . $* > $*      $#error $@ 5.1.2 $: "Invalid host name"
R$* < @ $* .. $* > $*      $#error $@ 5.1.2 $: "Invalid host name"

# now delete the local info -- note $=O to find characters that cause forwarding
R$* < @ > $*            $@ $>Parse0 $>3 $1            user@ => user
R< @ $=w . > : $*      $@ $>Parse0 $>3 $2            @here:... -> ...
R$- < @ $=w . >            $: $(dequote $1 $) < @ $2 . >      dequote "foo"@here
R< @ $+ >            $#error $@ 5.1.3 $: "User address required"
R$* $=O $* < @ $=w . >      $@ $>Parse0 $>3 $1 $2 $3      ...@here -> ...
R$-                   $: $(dequote $1 $) < @ *LOCAL* >      dequote "foo"
R< @ *LOCAL* >            $#error $@ 5.1.3 $: "User address required"
R$* $=O $* < @ *LOCAL* >
                  $@ $>Parse0 $>3 $1 $2 $3      ...@*LOCAL* -> ...
R$* < @ *LOCAL* >      $: $1

#
#  Parse1 -- the bottom half of ruleset 0.
#

SParse1
# handle numeric address spec
R$* < @ [ $+ ] > $*      $: $>98 $1 < @ [ $2 ] > $3      numeric internet spec
R$* < @ [ $+ ] > $*      $#esmtp $@ [$2] $: $1 < @ [$2] > $3      still numeric: send

# handle virtual users
R$+ < @ $=w . >       $: < $(virtuser $1 @ $2 $@ $1 $: @ $) > $1 < @ $2 . >
R<@> $+ + $* < @ $* . >
                  $: < $(virtuser $1 + * @ $3 $@ $1 $: @ $) > $1 + $2 < @ $3 . >
R<@> $+ + $* < @ $* . >
                  $: < $(virtuser $1 @ $3 $@ $1 $: @ $) > $1 + $2 < @ $3 . >
R<@> $+ < @ $+ . >      $: < $(virtuser @ $2 $@ $1 $: @ $) > $1 < @ $2 . >
R<@> $+                  $: $1
R< error : $- $+ > $*       $#error $@ $(dequote $1 $) $: $2
R< $+ > $+ < @ $+ >      $: $>97 $1

# short circuit local delivery so forwarded email works
R$=L < @ $=w . >      $#local $: @ $1            special local names
R$+ < @ $=w . >            $#local $: $1                  regular local name

# not local -- try mailer table lookup
R$* <@ $+ > $*            $: < $2 > $1 < @ $2 > $3      extract host name
R< $+ . > $*            $: < $1 > $2                  strip trailing dot
R< $+ > $*            $: < $(mailertable $1 $) > $2      lookup
R< $~[ : $* > $*       $>95 < $1 : $2 > $3            check -- resolved?
R< $+ > $*            $: $>90 <$1> $2                  try domain

# resolve remotely connected UUCP links (if any)

# resolve fake top level domains by forwarding to other hosts



# pass names that still have a host to a smarthost (if defined)
R$* < @ $* > $*            $: $>95 < $S > $1 < @ $2 > $3      glue on smarthost name

# deal with other remote names
R$* < @$* > $*            $#esmtp $@ $2 $: $1 < @ $2 > $3            user@host.domain

# handle locally delivered names
R$=L                  $#local $: @ $1                  special local names
R$+                  $#local $: $1                  regular local names

###########################################################################
###   Ruleset 5 -- special rewriting after aliases have been expanded   ###
###########################################################################

S5

# deal with plussed users so aliases work nicely
R$+ + *                  $#local $@ $&h $: $1
R$+ + $*            $#local $@ + $2 $: $1 + *

# prepend an empty "forward host" on the front
R$+                  $: <> $1


# see if we have a relay or a hub
R< > $+                  $: < $H > $1                  try hub
R< > $+                  $: < $R > $1                  try relay
R< > $+                  $: < > < $1 $&h >            nope, restore +detail
R< > < $+ + $* > $*         < > < $1 > + $2 $3            find the user part
R< > < $+ > + $*      $#local $@ $2 $: @ $1            strip the extra +
R< > < $+ >            $@ $1                        no +detail
R$+                  $: $1 <> $&h                  add +detail back in
R$+ <> + $*            $: $1 + $2                  check whether +detail
R$+ <> $*            $: $1                        else discard
R< local : $* > $*      $: $>95 < local : $1 > $2      no host extension
R< error : $* > $*      $: $>95 < error : $1 > $2      no host extension
R< $- : $+ > $+            $: $>95 < $1 : $2 > $3 < @ $2 >
R< $+ > $+            $@ $>95 < $1 > $2 < @ $1 >

###################################################################
###  Ruleset 90 -- try domain part of mailertable entry       ###
###################################################################

S90
R$* <$- . $+ > $*      $: $1$2 < $(mailertable .$3 $@ $1$2 $@ $2 $) > $4
R$* <$~[ : $* > $*      $>95 < $2 : $3 > $4            check -- resolved?
R$* < . $+ > $*       $@ $>90 $1 . <$2> $3            no -- strip & try again
R$* < $* > $*            $: < $(mailertable . $@ $1$2 $) > $3      try "."
R< $~[ : $* > $*      $>95 < $1 : $2 > $3            "." found?
R< $* > $*            $@ $2                        no mailertable match

###################################################################
###  Ruleset 95 -- canonify mailer:[user@]host syntax to triple      ###
###################################################################

S95
R< > $*                        $@ $1                  strip off null relay
R< error : $- $+ > $*            $#error $@ $(dequote $1 $) $: $2
R< local : $* > $*            $>CanonLocal < $1 > $2
R< $- : $+ @ $+ > $*<$*>$*      $# $1 $@ $3 $: $2<@$3>      use literal user
R< $- : $+ > $*                  $# $1 $@ $2 $: $3      try qualified mailer
R< $=w > $*                  $@ $2                  delete local host
R< $+ > $*                  $#relay $@ $1 $: $2      use unqualified mailer

###################################################################
###  Ruleset CanonLocal -- canonify local: syntax            ###
###################################################################

SCanonLocal
# strip local host from routed addresses
R< $* > < @ $+ > : $+            $@ $>97 $3
R< $* > $+ $=O $+ < @ $+ >      $@ $>97 $2 $3 $4

# strip trailing dot from any host name that may appear
R< $* > $* < @ $* . >            $: < $1 > $2 < @ $3 >

# handle local: syntax -- use old user, either with or without host
R< > $* < @ $* > $*            $#local $@ $1@$2 $: $1
R< > $+                        $#local $@ $1    $: $1

# handle local:user@host syntax -- ignore host part
R< $+ @ $+ > $* < @ $* >      $: < $1 > $3 < @ $4 >

# handle local:user syntax
R< $+ > $* <@ $* > $*            $#local $@ $2@$3 $: $1
R< $+ > $*                   $#local $@ $2    $: $1

###################################################################
###  Ruleset 93 -- convert header names to masqueraded form      ###
###################################################################

S93


# special case the users that should be exposed
R$=E < @ *LOCAL* >      $@ $1 < @ $j . >            leave exposed
R$=E < @ $=M . >      $@ $1 < @ $2 . >
R$=E < @ $=w . >      $@ $1 < @ $2 . >

# handle domain-specific masquerading
R$* < @ $=M . > $*      $: $1 < @ $2 . @ $M > $3      convert masqueraded doms
R$* < @ $=w . > $*      $: $1 < @ $2 . @ $M > $3
R$* < @ *LOCAL* > $*      $: $1 < @ $j . @ $M > $2
R$* < @ $+ @ > $*      $: $1 < @ $2 > $3            $M is null
R$* < @ $+ @ $+ > $*      $: $1 < @ $3 . > $4            $M is not null

###################################################################
###  Ruleset 94 -- convert envelope names to masqueraded form      ###
###################################################################

S94
R$* < @ *LOCAL* > $*      $: $1 < @ $j . > $2

###################################################################
###  Ruleset 98 -- local part of ruleset zero (can be null)      ###
###################################################################

S98

# addresses sent to foo@host.REDIRECT will give a 551 error code
R$* < @ $+ .REDIRECT. >            $: $1 < @ $2 . REDIRECT . > < ${opMode} >
R$* < @ $+ .REDIRECT. > <i>      $: $1 < @ $2 . REDIRECT. >
R$* < @ $+ .REDIRECT. > < $- >      $# error $@ 5.1.1 $: "551 User has moved; please try " <$1@$2>


######################################################################
###  LookUpDomain -- search for domain in access database
###
###      Parameters:
###            <$1> -- key (domain name)
###            <$2> -- default (what to return if not found in db)
###            <$3> -- passthru (additional data passed unchanged through)
######################################################################

SLookUpDomain
R<$+> <$+> <$*>            $: < $(access $1 $: ? $) > <$1> <$2> <$3>
R<?> <$+.$+> <$+> <$*>      $@ $>LookUpDomain <$2> <$3> <$4>
R<?> <$+> <$+> <$*>      $@ <$2> <$3>
R<$*> <$+> <$+> <$*>      $@ <$1> <$4>

######################################################################
###  LookUpAddress -- search for host address in access database
###
###      Parameters:
###            <$1> -- key (dot quadded host address)
###            <$2> -- default (what to return if not found in db)
###            <$3> -- passthru (additional data passed through)
######################################################################

SLookUpAddress
R<$+> <$+> <$*>            $: < $(access $1 $: ? $) > <$1> <$2> <$3>
R<?> <$+.$-> <$+> <$*>      $@ $>LookUpAddress <$1> <$3> <$4>
R<?> <$+> <$+> <$*>      $@ <$2> <$3>
R<$*> <$+> <$+> <$*>      $@ <$1> <$4>

######################################################################
###  CanonAddr --      Convert an address into a standard form for
###                  relay checking.  Route address syntax is
###                  crudely converted into a %-hack address.
###
###      Parameters:
###            $1 -- full recipient address
###
###      Returns:
###            parsed address, not in source route form
######################################################################

SCanonAddr
R$*                  $: $>Parse0 $>3 $1      make domain canonical
R< @ $+ > : $* @ $*      < @ $1 > : $2 % $3      change @ to % in src route
R$* < @ $+ > : $* : $*      $3 $1 < @ $2 > : $4      change to % hack.
R$* < @ $+ > : $*      $3 $1 < @ $2 >

######################################################################
###  ParseRecipient --      Strip off hosts in $=R as well as possibly
###                  $* $=m or the access database.
###                  Check user portion for host separators.
###
###      Parameters:
###            $1 -- full recipient address
###
###      Returns:
###            parsed, non-local-relaying address
######################################################################

SParseRecipient
R$*                        $: <?> $>CanonAddr $1
R<?> $* < @ $* . >            <?> $1 < @ $2 >                  strip trailing dots
R<?> $- < @ $* >            $: <?> $(dequote $1 $) < @ $2 >      dequote local part

# if no $=O character, no host in the user portion, we are done
R<?> $* $=O $* < @ $* >            $: <NO> $1 $2 $3 < @ $4>
R<?> $*                        $@ $1



R<NO> $* < @ $* $=R >            $: <RELAY> $1 < @ $2 $3 >
R<NO> $* < @ $+ >            $: $>LookUpDomain <$2> <NO> <$1 < @ $2 >>
R<$+> <$+>                  $: <$1> $2

R<RELAY> $* < @ $* >            $@ $>ParseRecipient $1
R<$-> $*                  $@ $2

######################################################################
###  check_relay -- check hostname/address on SMTP startup
######################################################################

SLocal_check_relay
Scheck_relay
R$*                  $: $1 $| $>"Local_check_relay" $1
R$* $| $* $| $#$*      $#$3
R$* $| $* $| $*            $@ $>"Basic_check_relay" $1 $| $2

SBasic_check_relay
# check for deferred delivery mode
R$*                  $: < ${deliveryMode} > $1
R< d > $*            $@ deferred
R< $* > $*            $: $2

R$+ $| $+            $: $>LookUpDomain < $1 > <?> < $2 >
R<?> < $+ >            $: $>LookUpAddress < $1 > <?> < $1 >
R<?> < $+ >            $: $1
R<OK> < $* >            $@ OK
R<RELAY> < $* >            $@ RELAY
R<REJECT> $*            $#error $@ 5.7.1 $: "550 Access denied"
R<DISCARD> $*            $#discard $: discard
R<$+> $*            $#error $@ 5.7.1 $: $1


######################################################################
###  check_mail -- check SMTP `MAIL FROM:' command argument
######################################################################

SLocal_check_mail
Scheck_mail
R$*                  $: $1 $| $>"Local_check_mail" $1
R$* $| $#$*            $#$2
R$* $| $*            $@ $>"Basic_check_mail" $1

SBasic_check_mail
# check for deferred delivery mode
R$*                  $: < ${deliveryMode} > $1
R< d > $*            $@ deferred
R< $* > $*            $: $2

R<>                  $@ <OK>
R$*                  $: <?> $>CanonAddr $1
R<?> $* < @ $+ . >      <?> $1 < @ $2 >                  strip trailing dots
# handle non-DNS hostnames (*.bitnet, *.decnet, *.uucp, etc)
R<?> $* < $* $=P > $*      $: <OK> $1 < @ $2 $3 > $4
R<?> $* < @ $+ > $*      $: <OK> $1 < @ $2 > $3            ... unresolvable OK

# handle case of @localhost on address
R<$+> $* < @localhost >      $: < ? $&{client_name} > <$1> $2 < @localhost >
R<$+> $* < @localhost.$m >
                  $: < ? $&{client_name} > <$1> $2 < @localhost.$m >
R<$+> $* < @localhost.UUCP >
                  $: < ? $&{client_name} > <$1> $2 < @localhost.UUCP >
R<? $=w> <$+> $*      <?> <$2> $3
R<? $+> <$+> $*            $#error $@ 5.5.4 $: "553 Real domain name required"
R<?> <$+> $*            $: <$1> $2

# lookup localpart (user@)
R<$+> $* < @ $+ > $*      $: <USER $(access $2@ $: ? $) > <$1> $2 < @ $3 > $4
# no match, try full address (user@domain rest)
R<USER ?> <$+> $* < @ $* > $*
                  $: <USER $(access $2@$3$4 $: ? $) > <$1> $2 < @ $3 > $4
# no match, try address (user@domain)
R<USER ?> <$+> $+ < @ $+ > $*
                  $: <USER $(access $2@$3 $: ? $) > <$1> $2 < @ $3 > $4
# no match, try (sub)domain (domain)
R<USER ?> <$+> $* < @ $+ > $*
                  $: $>LookUpDomain <$3> <$1> <>
# check unqualified user in access database
R<?> $*                  $: <USER $(access $1@ $: ? $) > <?> $1
# retransform for further use
R<USER $+> <$+> $*      $: <$1> $3

# handle case of no @domain on address
R<?> $*                  $: < ? $&{client_name} > $1
R<?> $*                  $@ <OK>                        ...local unqualed ok
R<? $+> $*            $#error $@ 5.5.4 $: "553 Domain name required"
                                          ...remote is not
# check results
R<?> $*                  $@ <OK>
R<OK> $*            $@ <OK>
R<TEMP> $*            $#error $@ 4.1.8 $: "451 Sender domain must resolve"
R<PERM> $*            $#error $@ 5.1.8 $: "501 Sender domain must exist"
R<RELAY> $*            $@ <RELAY>
R<DISCARD> $*            $#discard $: discard
R<REJECT> $*            $#error $@ 5.7.1 $: "550 Access denied"
R<$+> $*            $#error $@ 5.7.1 $: $1            error from access db

######################################################################
###  check_rcpt -- check SMTP `RCPT TO:' command argument
######################################################################

SLocal_check_rcpt
Scheck_rcpt
R$*                  $: $1 $| $>"Local_check_rcpt" $1
R$* $| $#$*            $#$2
R$* $| $*            $@ $>"Basic_check_rcpt" $1

SBasic_check_rcpt
# check for deferred delivery mode
R$*                  $: < ${deliveryMode} > $1
R< d > $*            $@ deferred
R< $* > $*            $: $2

R$*                  $: $>ParseRecipient $1            strip relayable hosts



# blacklist local users or any host from receiving mail
R$*                  $: <?> $1
R<?> $+ < @ $=w >      $: <> <USER $1> <FULL $1@$2> <HOST $2> <$1 < @ $2 >>
R<?> $+ < @ $* >      $: <> <FULL $1@$2> <HOST $2> <$1 < @ $2 >>
R<?> $+                  $: <> <USER $1> <$1>
R<> <USER $+> $*      $: <$(access $1 $: $)> $2
R<> <FULL $+> $*      $: <$(access $1 $: $)> $2
R<OK> <FULL $+> $*      $: <$(access $1 $: $)> $2
R<> <HOST $+> $*      $: <$(access $1 $: $)> $2
R<OK> <HOST $+> $*      $: <$(access $1 $: $)> $2
R<> <$*>            $: $1
R<OK> <$*>            $: $1
R<RELAY> <$*>            $: $1
R<REJECT> $*            $#error $@ 5.2.1 $: "550 Mailbox disabled for this recipient"
R<$+> $*            $#error $@ 5.2.1 $: $1                  error from access db

# anything terminating locally is ok
R$+ < @ $=w >            $@ OK
R$+ < @ $* $=R >      $@ OK
R$+ < @ $* >            $: $>LookUpDomain <$2> <?> <$1 < @ $2 >>
R<RELAY> $*            $@ RELAY
R<$*> <$*>            $: $2


# check for local user (i.e. unqualified address)
R$*                  $: <?> $1
R<?> $* < @ $+ >      $: <REMOTE> $1 < @ $2 >
# local user is ok
R<?> $+                  $@ OK
R<$+> $*            $: $2

# anything originating locally is ok
R$*                  $: <?> $&{client_name}
# check if bracketed IP address (forward lookup != reverse lookup)
R<?> [$+]            $: <BAD> [$1]
# pass to name server to make hostname canonical
R<?> $* $~P             $: <?> $[ $1 $2 $]
R<$-> $*            $: $2
R$* .                  $1                        strip trailing dots
R$@                  $@ OK
R$=w                  $@ OK
R$* $=R                  $@ OK
R$*                  $: $>LookUpDomain <$1> <?> <$1>
R<RELAY> $*            $@ RELAY
R<$*> <$*>            $: $2

# check IP address
R$*                  $: $&{client_addr}
R$@                  $@ OK                  originated locally
R0                  $@ OK                  originated locally
R$=R $*                  $@ OK                  relayable IP address
R$*                  $: $>LookUpAddress <$1> <?> <$1>
R<RELAY> $*             $@ RELAY            relayable IP address
R<$*> <$*>            $: $2
R$*                  $: [ $1 ]            put brackets around it...
R$=w                  $@ OK                  ... and see if it is local


# anything else is bogus
R$*                  $#error $@ 5.7.1 $: "550 Relaying denied"

#
######################################################################
######################################################################
#####
#####                  MAILER DEFINITIONS
#####
######################################################################
######################################################################


######################*****##############
###   PROCMAIL Mailer specification   ###
##################*****##################

#####  @(#)procmail.m4      8.11 (Berkeley) 5/19/1998  #####

Mprocmail,      P=/usr/bin/procmail, F=DFMSPhnu9, S=11/31, R=21/31, T=DNS/RFC822/X-Unix,
            A=procmail -Y -m $h $f $u

#####################################
###   SMTP Mailer specification   ###
#####################################

#####  @(#)smtp.m4      8.38 (Berkeley) 5/19/1998  #####

Msmtp,            P=[IPC], F=mDFMuX, S=11/31, R=21, E=\r\n, L=990,
            T=DNS/RFC822/SMTP,
            A=IPC $h
Mesmtp,            P=[IPC], F=mDFMuXa, S=11/31, R=21, E=\r\n, L=990,
            T=DNS/RFC822/SMTP,
            A=IPC $h
Msmtp8,            P=[IPC], F=mDFMuX8, S=11/31, R=21, E=\r\n, L=990,
            T=DNS/RFC822/SMTP,
            A=IPC $h
Mrelay,            P=[IPC], F=mDFMuXa8, S=11/31, R=61, E=\r\n, L=2040,
            T=DNS/RFC822/SMTP,
            A=IPC $h

#
#  envelope sender rewriting
#
S11
R$+                  $: $>51 $1                  sender/recipient common
R$* :; <@>            $@                        list:; special case
R$*                  $: $>61 $1                  qualify unqual'ed names
R$+                  $: $>94 $1                  do masquerading


#
#  envelope recipient rewriting --
#  also header recipient if not masquerading recipients
#
S21
R$+                  $: $>51 $1                  sender/recipient common
R$+                  $: $>61 $1                  qualify unqual'ed names


#
#  header sender and masquerading header recipient rewriting
#
S31
R$+                  $: $>51 $1                  sender/recipient common
R:; <@>                  $@                        list:; special case

# do special header rewriting
R$* <@> $*            $@ $1 <@> $2                  pass null host through
R< @ $* > $*            $@ < @ $1 > $2                  pass route-addr through
R$*                  $: $>61 $1                  qualify unqual'ed names
R$+                  $: $>93 $1                  do masquerading


#
#  convert pseudo-domain addresses to real domain addresses
#
S51

# pass <route-addr>s through
R< @ $+ > $*            $@ < @ $1 > $2                  resolve <route-addr>

# output fake domains as user%fake@relay

# do UUCP heuristics; note that these are shared with UUCP mailers
R$+ < @ $+ .UUCP. >      $: < $2 ! > $1                  convert to UUCP form
R$+ < @ $* > $*            $@ $1 < @ $2 > $3            not UUCP form

# leave these in .UUCP form to avoid further tampering
R< $&h ! > $- ! $+      $@ $2 < @ $1 .UUCP. >
R< $&h ! > $-.$+ ! $+      $@ $3 < @ $1.$2 >
R< $&h ! > $+            $@ $1 < @ $&h .UUCP. >
R< $+ ! > $+            $: $1 ! $2 < @ $Y >            use UUCP_RELAY
R$+ < @ $+ : $+ >      $@ $1 < @ $3 >                  strip mailer: part
R$+ < @ >            $: $1 < @ *LOCAL* >            if no UUCP_RELAY


#
#  common sender and masquerading recipient rewriting
#
S61

R$* < @ $* > $*            $@ $1 < @ $2 > $3            already fully qualified
R$+                  $@ $1 < @ *LOCAL* >            add local qualification


#
#  relay mailer header masquerading recipient rewriting
#
S71

R$+                  $: $>61 $1
R$+                  $: $>93 $1


##################################################
###   Local and Program Mailer specification   ###
##################################################

#####  @(#)local.m4      8.30 (Berkeley) 6/30/1998  #####

Mlocal,            P=/usr/bin/procmail, F=lsDFMAw5:/|@qSPfhn9, S=10/30, R=20/40,
            T=DNS/RFC822/X-Unix,
            A=procmail -Y -a $h -d $u
Mprog,            P=/usr/sbin/smrsh, F=lsDFMoqeu9, S=10/30, R=20/40, D=$z:/,
            T=X-Unix,
            A=sh -c $u

#
#  Envelope sender rewriting
#
S10
R<@>                  $n                  errors to mailer-daemon
R@ <@ $*>            $n                  temporarily bypass Sun bogosity
R$+                  $: $>50 $1            add local domain if needed
R$*                  $: $>94 $1            do masquerading

#
#  Envelope recipient rewriting
#
S20
R$+ < @ $* >            $: $1                  strip host part

#
#  Header sender rewriting
#
S30
R<@>                  $n                  errors to mailer-daemon
R@ <@ $*>            $n                  temporarily bypass Sun bogosity
R$+                  $: $>50 $1            add local domain if needed
R$*                  $: $>93 $1            do masquerading

#
#  Header recipient rewriting
#
S40
R$+                  $: $>50 $1            add local domain if needed

#
#  Common code to add local domain name (only if always-add-domain)
#
S50
R$* < @ $* > $*       $@ $1 < @ $2 > $3            already fully qualified
R$+                  $@ $1 < @ *LOCAL* >            add local qualification
0
 
LVL 5

Expert Comment

by:vsamtani
ID: 6326149
sohaib,

I have compiled and tested a modified version of sendmail 8.9.3 on a Redhat 6.1 system, that correctly seems to log all messages. If you would like me to send it to you, please email me at vijay.samtani@mailandnews.com, and I can send you the program. You will also need to add a few lines to your sendmail.cf (and also your sendmail.mc, if you are using it).

Vijay
0
 
LVL 15

Expert Comment

by:samri
ID: 6326209
sohaib,

basically you need to rebuild sendmail from scratch.  And if the need is too immediate, I would go for vsamtani recommendation.  But building it would be 'fun' and educational.
0
 
LVL 1

Author Comment

by:sohaib69
ID: 6326865
Send me the programme, and also let me know how to rubild the SENDMAIL from SCRACTH.

Cos just to tell you that I am very nill on that.. I dontk now anything abt sendmail.. I just wanted to run that log messages like when ever anyone sends an email thru my smtp.mail.com I will get the copy of the email.

So I hope you will help me , and yes I have both sendmail.mc and sendmail.cf
0
 
LVL 5

Accepted Solution

by:
vsamtani earned 300 total points
ID: 6327190
OK, I am sending the rebuilt sendmail binary file to your email address. You need to shut down sendmail on your linux box:

/etc/rc.d/init.d/sendmail stop

Now make backups/keep copies of your original sendmail files:

mv /usr/sbin/sendmail /usr/sbin/sendmail.orig
cp /etc/sendmail.cf /etc/sendmail.cf.orig
cp /etc/sendmail.mc /etc/sendmail.mc.orig

then copy the sendmail I have sent you to /usr/sbin/sendmail, then chmod the new binary:

chmod u=rws,g=rs,o=rx /usr/sbin/sendmail

Now edit your /etc/sendmail.mc, and add the following lines at the very end:

LOCAL_CONFIG
D{LogAll}/var/log/mail.log

/var/log/mail.log is where your mail copies will be kept. Change it if you like. Remember it will be quite a big file.

Now type:

m4 < /etc/sendmail.mc >/etc/sendmail.cf

This will create a new /etc/sendmail.cf for you, with the extra line telling sendmail where to keep logged copies.

You have to create this file before sendmail will start using it.

touch /var/log/mail.log

If you don't want anyone to read it except root,

chmod 600 /var/log/mail.log

Now restart sendmail:

/etc/rc.d/init.d/sendmail start

And tell us if it works :)

(I am not going to tell you how to rebuild sendmail from scratch, because the instructions on www.sendmail.org are what you should be reading. As samri said above, learning to rebuild sendmail will be educational.)

Vijay

0
 
LVL 1

Author Comment

by:sohaib69
ID: 6327337
I have that file on my server in /var/log/maillog

I think that file just give me the time and date that I have sent to the email address. u know.. Did u understand what I mean like.. if i send an email i want that email copy thats what i mean.. On that comments, of EE.

-rw-r--r--   1 root     root            0 Jul 28 02:36 152132 maillog


Thanks.

And the file u email me was just the file I have to put in my /usr/sbin/sendmail

still i have to compile my sendmail, after putting that sendmail in /usr/sbin/sendmail oR just the below :-

chmod u=rws,g=rs,o=rx /usr/sbin/sendmail

edit file /etc/sendmail.mc, and add the following lines at the:

LOCAL_CONFIG
D{LogAll}/var/log/mail.log

m4 < /etc/sendmail.mc >/etc/sendmail.cf

Is that what I have to do.. Please let me knwo and, once again thank you for your HELP
0
 
LVL 5

Expert Comment

by:vsamtani
ID: 6327514
No - you have /var/log/maillog. This file is where sendmail sends its logging information. I told you to create /var/log/mail.log , which is a different file. Note the . This is where the modified sendmail will put copies of emails.

You just have to replace your existing /usr/sbin/sendmail with the file I sent you. Keep a backup copy of the current file, also as I instructed.

Then carry out the remainder of the instructions.

Vijay



0
 
LVL 1

Author Comment

by:sohaib69
ID: 6328250
ok ..

What i did is I upload your sendmail in /usr/sbin/sendmail

and then I put the following entries in

/etc/sendmail.mc

LOCAL_CONFIG
D{LogAll}/var/log/mail.log

and then I run
m4 < /etc/sendmail.mc >/etc/sendmail.cf
stdin:11: m4: Cannot open /usr/lib/sendmail-cf/m4/cf.m4: No such file or directory
[root@ns /etc]#

Why I got that error, I dont understand that...

Please help me..
0
 
LVL 1

Author Comment

by:sohaib69
ID: 6329830
Dear Vijay,
 
I still await your reply regarding the error I got yesterday. Please help me in this regard..
 
Thank you for your support.
 
Sohaib
0
How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

 
LVL 5

Expert Comment

by:vsamtani
ID: 6333779
Sohaib

Sorry for not getting back sooner - I have been away over the weekend.

It sounds like you don't have the sendmail-cf package installed, or it has lost some files. If you have your RedHat cd, it should be on there, in the RPMS directory, probably sendmail-cf-8.9.3-15.i386.rpm. If it is, change into that directory and type

rpm -i --force sendmail-cf-8.9.3.i386.rpm

which will install it for you. Then retry the m4 command.

Vijay
0
 
LVL 1

Author Comment

by:sohaib69
ID: 6335758
thank you for the update of this ticket I did and it did work , by

m4 /etc/sendmail.mc > /etc/sendmail.cf

but the thing is when I was sending email, it wasn't showing any mail.log file on my /var/log/mail.log

there is no file there by the name of that when i try to send an email from my smtp server... so i dont know what to do now..

0
 
LVL 1

Author Comment

by:sohaib69
ID: 6335774
its not making up that fileon my /var/log/

now what I have to do vijay ... please let meknow ..

Thanks..

0
 
LVL 1

Author Comment

by:sohaib69
ID: 6335813
sendmail its working fine but its not making up that file, and i also check just now.. that I am sending email thru my smtp server... but why its not making up that file - you have to tell me with your expertise.

Thanks.

Sohaib
0
 
LVL 5

Expert Comment

by:vsamtani
ID: 6336949
sendmail won't create the file - you have to create the file, and then sendmail will *add* to it. Create the file by typing

touch /var/log/mail.log

and then sending emails through your server.

Vijay
0
 
LVL 5

Expert Comment

by:vsamtani
ID: 6336952
By the way, you also need to restart sendmail if you haven't:

/etc/rc.d/init.d/sendmail restart

Vijay
0
 
LVL 1

Author Comment

by:sohaib69
ID: 6340102
Thank you very much it works...

I really appreciated for the expertise you show thanks
0
 
LVL 5

Expert Comment

by:vsamtani
ID: 6340142
You're welcome.

Vijay
0
 
LVL 1

Author Comment

by:sohaib69
ID: 6341390
let me know if you need any help you are more than welcome ..

wcws@wcws.net
0
 
LVL 1

Author Comment

by:sohaib69
ID: 6347451
hi vijay , after few days I have notice that my alias file and my virtusertable file arent working i have set a alias filelike

abc.com       abcuser

Change it to:

abc.com       abcalias

and edit your /etc/aliases file so that you have a line

abcalias: abcuser, sohaib

This way all email thta comes in for <anyone>@abc.com will go to abcuser and also to sohaib

and things are working fine before, i have also check my alias location in sendmail.cf they are fine but why its not working when ever I send an email to sohaib why the abcuser is not getting an email, i dont understand that . . .

Thanks.
0
 
LVL 1

Author Comment

by:sohaib69
ID: 7289808
hello again, I have upgraded my server, but now when I am trying to restart my sendmail by following the save above step I am getting the following error :-

[root@ns mail]# /etc/rc.d/init.d/sendmail start
Starting sendmail: 554 /etc/sendmail.cf: line 115: readcf: map arith: class arith not available
554 /etc/sendmail.cf: line 259: DaemonPortOptions parameter "Name=MTA" unknown
554 /etc/sendmail.cf: line 472: readcf: unknown option name AuthOptions
554 Warning: .cf version level (9) exceeds sendmail version 8.9.3 functionality (8)
[FAILED]



my sendmail version is now

sendmail-8.11.6-6

Please let me know what Do I have to do now.

Thanks.
0
 
LVL 15

Expert Comment

by:samri
ID: 7291749
sohaib,

that is the beauty if *hacking* the source,  everytime you upgrade the sendmail, you would need to repatch the conf.c all over again.  It's fun, but needs to be done, otherwise, the whole thing won't work.

alternative is to look for the sendmail rules (hack the cf file directly).  I do recally one EE member said that s/he manage to get it to work.

PAQ (0-pts)
http://www.experts-exchange.com/Networking/Email_Groupware/Sendmail/Q_20314200.html

Related links:
http://www.geocities.com/sbmilbur/sendmail

I personally never tested it, but it looks promising.

cheers.
0
 
LVL 1

Author Comment

by:sohaib69
ID: 7294795
thanks for ur update.

http://www.geocities.com/sbmilbur/sendmail/

I have visited that above web site but the thing is If I know how to do it then I would never ask any one in EE, I will really appreciate if you please kindly help me step by step in setting up my sendmail thru above link ,

I am not a advance user I am just a begineer if you help me where I am going to insert conf.c  or whatever mention on that web site.

Await your early update regarding this matter.

Thanks.

Sohaib
0
 

Expert Comment

by:atulltd
ID: 13562327
For having copies of outgoing mails, will the same procedure work for Red Hat Linux AS3 also?
0

Featured Post

Do email signature updates give you a headache?

Do you feel like all of your time is spent managing email signatures? Too busy to visit every user’s desk to make updates? Want high-quality HTML signatures on all devices, including on mobiles and Macs? Then, let Exclaimer solve all your email signature problems today!

Join & Write a Comment

Marketers need statistics and metrics like everybody else needs oxygen. In this article we explain how to enable marketing campaign statistics for Microsoft Exchange mail.
This process describes the steps required to Import and Export data from and to .pst files using Exchange 2010. We can use these steps to export data from a user to a .pst file, import data back to the same or a different user, or even import data t…
To show how to generate a certificate request in Exchange 2013. We show this process by using the Exchange Admin Center. Log into Exchange Admin Center.:  First we need to log into the Exchange Admin Center. Navigate to the Servers >> Certificates…
The basic steps you have just learned will be implemented in this video. The basic steps are shown to configure an Exchange DAG in a live working Exchange Server Environment and manage the same (Exchange Server 2010 Software is used in a Windows Ser…

706 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

18 Experts available now in Live!

Get 1:1 Help Now