Sendmail & POP



E-mail : cypark@kari.re.kr


1. E-Mail


sendmail
Mail testing
sendmail.cf
sendmail.cf

2. Mail

3. Mail Addressing

Within Internet

From Internet to BITNET

From BITNET to Internet

 

From Internet to UUCP

From UUCP to Internet

4. Sendmail

(KAIST), Berkeley Sendmail 8.6.12
security hole fixed
MIME (Multipurpose Internet Mail Extensions)

RFC 1557¶

5. Sendmail

  step 1 :
      gzip -d sendmail.8.6.12h2.tar.gz
      tar xvf sendmail.8.6.12h2.tar

  step 2 : src/Makefile.SunOS (SunOS 4.1.3)
      DBMDEF = -DNDBM -DNIS
      LIBS = -ldbm  -lresolv

  step 3 : 
      make  -f  Makefile.SunOS
        error on-line mainual
     

  step 4 : 
      cp /usr/lib/sendmail /usr/lib/sendmail.org
      make  -f  Makefile.SunOS install-sendmail
        sendmail /usr/lib  mailq  newaliases 
        sendmail  symbolic link

  step 5 : sendmail.cf
      cp sendmail.cf.sparc-sun-sunos4.1.3 sendmail.cf
      vi sendmail.cf
      DDkari.re.kr
      Djkari.re.kr
      DMkari.re.kr

  step 6 : sendmail.cf
      cp senfdmail.cf   /etc
        Solaris 2.4 /etc/mail

  step 7 : /etc/sendmail.cw 
       : kari.re.kr

  step 8 : newaliases 
      /usr/ucb/newaliases

  step 9 : sendmail daemon restart
      $  kill  -1 `ps t"?" | grep sendmail `
      $  /usr/lib/sendmail -bd -q1h

6. Mail Testing

  $ Mail -v cypark@garam.kreonet.re.kr
    Subject: sendmail test

    This is sendmail test.
    Mail command is not supported Hangul messages
    Please use ELM Hangul version

    ctrl+D
    Cc:

  $ cypark@garam.kreonet.re.kr... Connecting to garam.kreonet.re.kr. (smtp)...

  220-garam.kreonet.re.kr Sendmail 8.6.9H1/8.6.12 ready at Thu, 26 Oct 1995 11:40:15
  220 ESMTP spoken here
  >>> EHLO kari.re.kr
  250-garam.kreonet.re.kr Hello [150.197.1.4], pleased to meet you
  250-EXPN
  250-SIZE
  250 HELP
  >>> MAIL From:<cypark@kari.re.kr> SIZE=107
  250 <cypark@kari.re.kr>... Sender ok
  >>> RCPT To:<cypark@garam.kreonet.re.kr>
  250 <cypark@garam.kreonet.re.kr>... Recipient ok
  >>> DATA
  354 Enter mail, end with "." on a line by itself
  >>> .
  250 LAA21010 Message accepted for delivery
  cypark@garam.kreonet.re.kr... Sent (LAA21010 Message accepted for delivery)
  Closing connection to garam.kreonet.re.kr.
  >>> QUIT
  221 garam.kreonet.re.kr closing connection

7. Chapter 7...

hmail elm2.4h3 sendmail compile error
      , on-line man directory(/usr/man/man?)¿¡ copy.

8. Sendmail Configuration

    Define Macros         DDkari.re.kr
    Define Class          CDkari.re.kr
    Set option            OA/etc/aliases
    Trusted Users         Troot cypark
    Message Precedence    Pfirst-class=0
    Define Mailer         Mlocal, P=/bin/mail, .....
    Define Header         H?F?From : $q
    Set Ruleset           S0, S1, S2,....
    Define Rule           Rlhs <tab> rhs <tab> comment

        lhs : pattern match,  rhs : transforming the address

9. Pattern Match & Transforming

    input address     : hunt@nbsenh.bitnet
                         |      |
    rewriting rule    : R$+<@$+.bitnet>  $1%$2<@$B>
                         |      |
    address token     : hunt<@nbsehn.bitnet>
                         |      |
    indefinite token  : hunt <nbsehn>
                         |      |
    transformation    : $1  %  $2  < @ $B>
                         |      |      |
    rewriting address : hunt%nbsehn<@cunyvm.cuny.edu>

10. Sendmail.cf

/usr/lib/sendmail -bt
/usr/lib/sendmail -bt -Ctest.cf
  /usr/lib/sendmail -bt
    ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
    Enter <ruleset> <address>
    > 0 cypark                        ¢Ð  username
    rewrite: ruleset  0   input: cypark
    rewrite: ruleset 98   input: cypark
    rewrite: ruleset 98 returns: cypark
    rewrite: ruleset  0 returns: $# local $: @ cypark
    >

    > 0 cypark@viva                   ¢Ð  hostname
    rewrite: ruleset  0   input: cypark @ viva
    rewrite: ruleset 98   input: cypark @ viva
    rewrite: ruleset 98 returns: cypark @ viva
    rewrite: ruleset 97   input: cypark @ viva
    rewrite: ruleset  3   input: cypark @ viva
    rewrite: ruleset 96   input: cypark < @ viva >
    rewrite: ruleset 96 returns: cypark < @ viva . kari . re . kr . >
    rewrite: ruleset  3 returns: cypark < @ viva . kari . re . kr . >
    rewrite: ruleset  0   input: cypark < @ viva . kari . re . kr . >
    rewrite: ruleset 98   input: cypark < @ viva . kari . re . kr . >
    rewrite: ruleset 98 returns: cypark < @ viva . kari . re . kr . >
    rewrite: ruleset  0 returns: $# local $: @ cypark
    rewrite: ruleset 97 returns: $# local $: @ cypark
    rewrite: ruleset  0 returns: $# local $: @ cypark
    >

    > 0 cypark@viva.kari.re.kr        ¢Ð  hostname.domainname
    rewrite: ruleset  0   input: cypark @ viva . kari . re . kr
    rewrite: ruleset 98   input: cypark @ viva . kari . re . kr
    rewrite: ruleset 98 returns: cypark @ viva . kari . re . kr
    rewrite: ruleset 97   input: cypark @ viva . kari . re . kr
    rewrite: ruleset  3   input: cypark @ viva . kari . re . kr
    rewrite: ruleset 96   input: cypark < @ viva . kari . re . kr >
    rewrite: ruleset 96 returns: cypark < @ viva . kari . re . kr . >
    rewrite: ruleset  3 returns: cypark < @ viva . kari . re . kr . >
    rewrite: ruleset  0   input: cypark < @ viva . kari . re . kr . >
    rewrite: ruleset 98   input: cypark < @ viva . kari . re . kr . >

    rewrite: ruleset 98 returns: cypark < @ viva . kari . re . kr . >
    rewrite: ruleset  0 returns: $# local $: @ cypark
    rewrite: ruleset 97 returns: $# local $: @ cypark
    rewrite: ruleset  0 returns: $# local $: @ cypark
    >

    > 0 cypark@garam.kreonet.re.kr    ¢Ð  Ÿ±â°üÀÇ address
    rewrite: ruleset  0   input: cypark @ garam . kreonet . re . kr
    rewrite: ruleset 98   input: cypark @ garam . kreonet . re . kr
    rewrite: ruleset 98 returns: cypark @ garam . kreonet . re . kr
    rewrite: ruleset 97   input: cypark @ garam . kreonet . re . kr
    rewrite: ruleset  3   input: cypark @ garam . kreonet . re . kr
    rewrite: ruleset 96   input: cypark < @ garam . kreonet . re . kr >
    rewrite: ruleset 96 returns: cypark < @ garam . kreonet . re . kr . >
    rewrite: ruleset  3 returns: cypark < @ garam . kreonet . re . kr . >
    rewrite: ruleset  0   input: cypark < @ garam . kreonet . re . kr . >
    rewrite: ruleset 98   input: cypark < @ garam . kreonet . re . kr . >
    rewrite: ruleset 98 returns: cypark < @ garam . kreonet . re . kr . >
    rewrite: ruleset 95   input: < > cypark < @ garam . kreonet . re . kr . >
    rewrite: ruleset 95 returns: cypark < @ garam . kreonet . re . kr . >
    rewrite: ruleset  0 returns: $# smtp $@ garam . kreonet . re . kr . $: cypark < @ garam . kreonet . re . kr . >
    rewrite: ruleset 97 returns: $# smtp $@ garam . kreonet . re . kr . $: cypark < @ garam . kreonet . re . kr . >
    rewrite: ruleset  0 returns: $# smtp $@ garam . kreonet . re . kr . $: cypark < @ garam . kreonet . re . kr . >
    >

    > 0 cypark@aaa.bitnet             ¢Ð  BITNET
    rewrite: ruleset  0   input: cypark @ aaa . bitnet
    rewrite: ruleset 98   input: cypark @ aaa . bitnet
    rewrite: ruleset 98 returns: cypark @ aaa . bitnet
    rewrite: ruleset 97   input: cypark @ aaa . bitnet
    rewrite: ruleset  3   input: cypark @ aaa . bitnet
    rewrite: ruleset 96   input: cypark < @ aaa . bitnet >
    rewrite: ruleset 96 returns: cypark < @ aaa . bitnet >
    rewrite: ruleset  3 returns: cypark < @ aaa . bitnet >
    rewrite: ruleset  0   input: cypark < @ aaa . bitnet >
    rewrite: ruleset 98   input: cypark < @ aaa . bitnet >
    rewrite: ruleset 98 returns: cypark < @ aaa . bitnet >
    rewrite: ruleset 95   input: < ibm3090 . snu . ac . kr > cypark < @ aaa . BITNET >
    rewrite: ruleset 95 returns: $# relay $@ ibm3090 . snu . ac . kr $: cypark < @ aaa . BITNET >
    rewrite: ruleset  0 returns: $# relay $@ ibm3090 . snu . ac . kr $: cypark < @ aaa . BITNET >
    rewrite: ruleset 97 returns: $# relay $@ ibm3090 . snu . ac . kr $: cypark < @ aaa . BITNET >
    rewrite: ruleset  0 returns: $# relay $@ ibm3090 . snu . ac . kr $: cypark < @ aaa . BITNET >
    >

    > 0 cypark%viva.kari.re.kr@mit.edu    ¢Ð  ¿ÜºÎ¿¡¼­ ³»ºÎ·Î
    rewrite: ruleset  0   input: cypark % viva . kari . re . kr @ mit . edu
    rewrite: ruleset 98   input: cypark % viva . kari . re . kr @ mit . edu
    rewrite: ruleset 98 returns: cypark % viva . kari . re . kr @ mit . edu
    rewrite: ruleset 97   input: cypark % viva . kari . re . kr @ mit . edu
    rewrite: ruleset  3   input: cypark % viva . kari . re . kr @ mit . edu
    rewrite: ruleset 96   input: cypark % viva . kari . re . kr < @ mit . edu >
    rewrite: ruleset 96 returns: cypark % viva . kari . re . kr < @ mit . edu . >
    rewrite: ruleset  3 returns: cypark % viva . kari . re . kr < @ mit . edu . >
    rewrite: ruleset  0   input: cypark % viva . kari . re . kr < @ mit . edu . >
    rewrite: ruleset 98   input: cypark % viva . kari . re . kr < @ mit . edu . >
    rewrite: ruleset 98 returns: cypark % viva . kari . re . kr < @ mit . edu . >
    rewrite: ruleset 95   input: < > cypark % viva . kari . re . kr < @ mit . edu . >
    rewrite: ruleset 95 returns: cypark % viva . kari . re . kr < @ mit . edu . >
    rewrite: ruleset  0 returns: $# smtp $@ mit . edu . $: cypark % viva . kari . re . kr < @ mit . edu . >
    rewrite: ruleset 97 returns: $# smtp $@ mit . edu . $: cypark % viva . kari . re . kr < @ mit . edu . >
    rewrite: ruleset  0 returns: $# smtp $@ mit . edu . $: cypark % viva . kari . re . kr < @ mit . edu . >

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

    S0

    # resolve fake top level domains by forwarding to other hosts
    R$*<@$+.BITNET>$* $: $>95 < $B > $1 <@$2.BITNET> $3 user@host.BITNET
    R$*<@$+.CSNET>$* $: $>95 < $C > $1 <@$2.CSNET> $3 user@host.CSNET

    # next 6 lines are added -- cypark 95/03/31   ¢Ð  ÇÊ¿ä½Ã ´ÙÀ½°ú °°ÀÌ ¹Ù²Û´Ù
    R$*<@karic2.$D.>$* $#local $: $1 forwared from karic2 to viva
    R$*<@$->$*         $#smtp $@ $2.$j $: $1 < @ $2.$j > user@host
    R$*<@$+.$j>$*      $#smtp $@ $2.$j $: $1 < @ $2.$j > $3
    R$*<@$+.kaist.ac.kr>$* $: $>95 < $R > $1 <@$2.kaist.ac.kr> $3
    R$*<@$+.andong.ac.kr>$* $: $>95 <ercc.snu.ac.kr > $1<@$2.andong.ac.kr>$3
    # if you are using relay host, next line is uncomment
    #R$*<@$*>$* $: $>95 < $R > $1 <@$2> $3 relayed

    > 0 cypark@abc.andong.ac.kr      ¢Ð  ruleset 0¿¡¼­ ¹Ù²Û °á°ú
    rewrite: ruleset  0   input: cypark @ abc . andong . ac . kr
    rewrite: ruleset 98   input: cypark @ abc . andong . ac . kr
    rewrite: ruleset 98 returns: cypark @ abc . andong . ac . kr
    rewrite: ruleset 97   input: cypark @ abc . andong . ac . kr
    rewrite: ruleset  3   input: cypark @ abc . andong . ac . kr
    rewrite: ruleset 96   input: cypark < @ abc . andong . ac . kr >
    rewrite: ruleset 96 returns: cypark < @ abc . andong . ac . kr >
    rewrite: ruleset  3 returns: cypark < @ abc . andong . ac . kr >
    rewrite: ruleset  0   input: cypark < @ abc . andong . ac . kr >
    rewrite: ruleset 98   input: cypark < @ abc . andong . ac . kr >
    rewrite: ruleset 98 returns: cypark < @ abc . andong . ac . kr >
    rewrite: ruleset 95   input: < ercc . snu . ac . kr > cypark < @ abc . andong . ac . kr >
    rewrite: ruleset 95 returns: $# relay $@ ercc . snu . ac . kr $: cypark < @ abc . andong . ac. kr >
    rewrite: ruleset  0 returns: $# relay $@ ercc . snu . ac . kr $: cypark < @ abc . andong . ac. kr >
    rewrite: ruleset 97 returns: $# relay $@ ercc . snu . ac . kr $: cypark < @ abc . andong . ac. kr >
    rewrite: ruleset  0 returns: $# relay $@ ercc . snu . ac . kr $: cypark < @ abc . andong . ac. kr >
    >

11. POP(Post Office Protocol)

POP Server
POP Server
POP Server Log
POP Server Troubleshooting

12. POP

U. C Berkeley
Mail server ­ mail check
RFC 1081, 1082
Server S/W
Client S/W
      Eudora, Qvtnet POP3

13. POP Server(Popper)

  step 1 :
      uncompress popper-1.831beta.tar.Z
      tar xvf popper-1.831beta.tar


  step 2 : Makefile 
      ${TARGET}  :  ${OBJS}
      cc ${OBJS}  -o ${TARGET} -lresolv

  step 3 : compile & install
      make
      make install

  step 4 : /etc/service 
      pop 110/tcp
      pop2    109/tcp

  step 5 : /etc/inetd.conf 
      pop tcp nowait  root    /usr/etc/popper     popper
      pop2    tcp nowait  root    /usr/etc/popper popper

  step 6 : inetd daemon restart
      $ kill -1 `ps t"?" | grep inetd`
      $ inetd

14. POP Server (Qpop)

  Step 1 :
      uncompress qpop2.1.4-r3.tar.Z
      tar xvf qpop2.1.4-r3.tar

  Step 2 : popper.h and make.xxx 
      ­ parameter

  Step 3 : compile
      make sunos
      popper.sunos(O/S popper.xxx)

  Step 4 : install
      cp popper.sunos  /usr/etc/popper

  Step 5 :  popper1.83 Step 4

15. POP Server Testing

    $ telnet localhost 110
    Connected to localhost
    Escape character is '^['
    +OK UCB POP Server (Version 1.831beta) at viva starting
    user cypark         
    +OK password requird for cypark
    pass xxxx           
    +OK cypark has 0 message(s) (0 octets)
    quit                

 

16. POP Server Log

  step 1 : /etc/syslog.conf
      local0.notice, local0.debug  /usr/spool/mqueue/POPlog

  step 2 : POPlog
      touch /usr/spool/mqueue/POPlog

  step 3 : Syslog daemon restart
      $ kill -1 `ps t"?" | grep syslogd`
      $ syslogd

17. POP Server Troubleshooting

Sun /var/yp ­ make
/usr/spool/mail/.username.pop size zero . (zero)
/etc/inetd.conf, /etc/service entry delimit <tab>
POP password space (popper1.83beta)
PC ­ Eudora Menu bar ­ Special-Setting-Sending mail "May use Quoted-Printable" disable.

: Sendmail Configuration

Configuration File Syntax

+---------------+-----------------------+-----------------------------------+
| Command       | Syntax                | Meaning                           |
+---------------+-----------------------+-----------------------------------+
| Define Macro  | Dxvalue               | set macro x to value              |
| Define Class  | Ccword1 [word2]..     | set class c to word1, word2..     |
|               | Fcfile                | load class c from  file           |
| Set Option    | Oovalue               | set option o to value             |
| Trusted Users | Tuser1 [user2]..      | trusted users are user1 user2..   |
| Set Precedence| Pname=number          | set name to precedence number     |
| Define Mailer | Mname,{field=value}   | define mailer name                |
| Define Header | H[?mflag?]name:format | set header format                 |
| Set Ruleset   | Sn                    | start ruleset number n            |
| Define Rule   | Rlhs rhs comment      | rewrite lhs pattern to rhs format |
+---------------+-----------------------+-----------------------------------+

The Define Macro Command( D )

defines a macro and stores a value in it
a macro name can be any single ASCII character
lowcase letters and special symbols are used internal macros(reserved)
uppercase letters are used user-defined macros

  Required sendmail macros
  +--------+-------------------------------+------------------------------+
  |  Macro | Value assigned this macro     | Example                      |
  +--------+-------------------------------+------------------------------+
  |    e   | SMTP entry message            | De$j Sendmail $v ready at $b |
  |    j   | site's official domain name   | Dj$w.$D                      |
  |    l   | format of UNIX from line      | DlFrom $g $d                 |
  |    n   | name used in error messages   | DnMAILER-DAEMON              |
  |    o   | set of operators in address   | Do.:%\@!^=/                  |
  |    q   | default sender address format | Dq$g$?x ($x)$.               |
  +--------+-------------------------------+------------------------------+

        DDkari.re.kr

Sendmail's Internal Macros(reserverd)

  +------+-----------------------------------------------------+
  |Macro | Function                                            |
  +------+-----------------------------------------------------+
  |   a  | origination date in RFC822 format                   |
  |   b  | current date in RFC822 format                       |
  |   c  | hop count                                           |
  |   d  | date in UNIX(ctime) format                          |
  |   e  | SMTP entry messages                                 |
  |   f  | sender "from" address                               |
  |   g  | sender address relative to the recipient            |
  |   h  | recipient host                                      |
  |   i  | queue id                                            |
  |   j  | "official" domain name for this site                |
  |   l  | format of the UNIX from line                        |
  |   n  | name of the daemon(for error messages)              |
  |   o  | set of "operators" in address                       |
  |   p  | sendmail's PID                                      |
  |   q  | default format of sender address                    |
  |   r  | protocol used                                       |
  |   s  | sender's hostname                                   |
  |   t  | numeric representation of the current time          |
  |   u  | recipient user                                      |
  |   v  | version number of sendmail                          |
  |   w  | hostname of this site                               |
  |   x  | full name of the sender                             |
  |   z  | home directory of the recipient                     |
  +------+-----------------------------------------------------+

          Dwgaram
          DDkreonet.re.kr
          Dj$w.$D

The Define Class Command ( C, F )

 array of values
used for anything with multiple values, such as multiple names for the local host or list of UUCP hostname

           CVbronson ora
           Fw/etc/sendmail.cw

The Set Option Command( O )

internal options set inside the sendmail.cf file
string, integer, boolean, time interval

           OA/etc/aliases
           OH/usr/lib/sendmail.hf
           OF0600
           OT3d

Defining Trusted Users ( T )

users who are permitted to override the sender name using -f flag
must be valid user name from the /etc/passwd file

           OTroot
           OTdaemon uucp
           OTcypark

Defining Mail Precedence ( P )

assign priority to message entering its queue
higher number means high precedence
default value is zero
negative number indicate especially low priority mail

           Pfirst-class=0
           Pspecial-delivery=100
           Pjunk=-100

Defining Mail Headers ( H )

optional head flag enclosed in question marks, a header name, a colon and a header template

           H?P?Return-Path: <$g>
           HReceived: $?sfrom $s $.by $j ($v/$Z)
           H?D?Recent-Date: $a
           H?D?Date: $a
           H?F?Recent-From: $q
           H?F?From: $q
           H?x?Full-Name: $x
           HSubject:
           H?M?Recent-Message-Id: <$t.$i@$j>
           H?M?Message-Id: <$t.$i@$j>

Defining Mailers ( M )

mail delivery programs used by sendmail

  Mailer Definition Fields
  +-------+-----------+----------------------------------+-------------+
  | Field | Meaning   | Contents                         |Example      |
  +-------+-----------+----------------------------------+-------------+
  |   P   | Path      | path of the mailer               |P=/bin/mail  |
  |   F   | Flags     | sendmail flags for this mailer   |F=lsDFMe     |
  |   S   | Sender    | ruleset for sender address       |S=10         |
  |   R   | Recipient | ruleset for recipient address    |R=20         |
  |   A   | Argv      | the mailer's argument vector     |A=sh-c $u    |
  |   E   | Eol       | end-of-line string for the mailer|E=\r\n       |
  |   M   | Maxsize   | Maximum message length           |M=100000     |
  +-------+-----------+----------------------------------+-------------+

Defining Mailers ()

  Sendmail Mailer Flag
  +-----+---------------------------------------------------------------+
  |Name | Function                                                      |
  +-----+---------------------------------------------------------------+
  | C   | add @domain to address that do not have an @                  |
  | D   | the mailer wants a Date: header line                          |
  | E   | add > to message lines that begin with From:                  |
  | e   | this is an expensive mailer, see sendmail option c            |
  | F   | the mailer wants a From: header line                          |
  | f   | the mailer accepts a -f  flag from trusted  users             |
  | h   | preserve uppercase in hostnames                               |
  | I   | the mailer will be speaking SMTP to another sendmail          |
  | L   | limit the line lengths are as specified in RFC821             |
  | l   | this is a local mailer                                        |
  | M   | this mailer wants a Message-Id: header line                   |
  | m   | the mailer can send to multiple users in one transaction      |
  | n   | don't insert a UNIX-style From: line in the message           |
  | P   | the mailer wants a Return-Path: line                          |
  | R   | use the MAIL From: return path rather than the return address |
  | r   | the mailer accepts a -r  flag from trusted users              |
  | S   | don't reset the userid before calling the mailer              |
  | s   | strip quotes off of the address before calling the mailer     |
  | U   | the mailer wants Unix-style From: lines                       |
  | u   | preserve uppercase in the usernames                           |
  | X   | prepend a dot to lines beginning with a dot                   |
  | x   | the mailer wants a Full-Name: header line                     |
  +-----+---------------------------------------------------------------+

       Mlocal, P=/bin/mail, F=rlsDFMmn, S=10, R=20, A=mail -d $u

Rewriting the Mail Address ( R )

rulesets are groups of individual rewrite rules used to phase e-mail address from user mail program and rewrite them into the form required by the mail delivery program
seperated by tab characters

  a) Pattern Matching ( The Left Hand Side )
       Pattern Matching Symbols
  +---------+-----------------------------------------------------------+
  | Symbol  |  Meaning                                                  |
  +---------+-----------------------------------------------------------+
  |    $*   |  match zero or more tokens                                |
  |    $+   |  match one or more tokens                                 |
  |    $-   |  match exactly one token                                  |
  |    $=x  |  match any token in class x                               |
  |    $~x  |  match any token not in class x                           |
  |    $x   |  match all token in macro x                               |
  |    $%x  |  match any token in NIS map named in macro x (Sun)        |
  |    $!x  |  match any token not in NIS map named in macro x (Sun)    |
  |    $%y  |  match any token in NIS hosts.byname map (Sun)            |
  +---------+-----------------------------------------------------------+

          cypark@garam.kreonet.re.kr
               |           |
              $-     @    $+
               |           |
              $1     @    $2

  b) Transfomation the Address ( The Right Hand Side )
       Transformation Metasymbols
  +---------------+------------------------------------------------+
  | Symbol        | Meaning                                        |
  +---------------+------------------------------------------------+
  |    $x         | expand macro x                                 |
  |    $n         | substitute indefinite token n from LHS         |
  |    $>n        | call ruleset n                                 |
  |    $#mailer   | resolve to mailer                              |
  |    $@         | terminate rewrite ruleset                      |
  |    $:         | terminate rewrite rule                         |
  |    $[host$]   | map to primary hostname                        |
  |    ${x name$} | map name through yp map $x (Sun)               |
  +---------------+------------------------------------------------+

         input address :  hunt@nbsenh.bitnet
                              |       |
         rewriting address: R$+<@$+.bitnet>   $1%$2<@$B>
                              |       |
         address tocken:    hunt<@nbsenh.bitnet>
                              |      |
         indefinite token:  hunt   nbsenh
                              |      |
         transformation     $1 %  $2 < @  $B>
                              |      |       |
         rewritten address: hunt%nbsenh<@cunyvm.cuny.edu>

Sendmail Command-line Arguments

 +------------------+-------------------------------------------------+
 |     option       |        meaning                                  |
 +------------------+-------------------------------------------------+
 |       -bd        |        run as a daemon                          |
 |       -bt        |        run in test mode                         |
 |       -bi        |        initialize the alias database            |
 |       -bp        |        print mail queue                         |
 |       -bz        |        freeze the configuration file            |
 |       -q[time]   |        repeat at interval time                  |
 |       -Cfile     |        use file as the configuration file       |
 +------------------+-------------------------------------------------+