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)과 호환
⊙ 다양한 운영체제 지원 (30여종)
⊙ 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. 설치시 유의사항

⊙ 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에 로그인 하지 않고 client에서 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에서 YP를 사용할때에는 /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       |
 +------------------+-------------------------------------------------+