搭建Sendmail邮件系统
1                          ☆邮件系统
电子邮件系统的工作原理
   电子邮件系统的运作方式与其它的网络应用有着根本上的不同。在其它的绝大多数的网络应用中,网络协议直接负责将数据发送到目的
   地。而在电子邮件系统中,发送者并不等待发送工作完成,而是仅仅将要发送的内容发送出去。
电子邮件的协议标准是TCP/IP协议族的一部分。它规定了电子邮件的格式和在邮局间交换电子邮件的协议。
每个电子邮件都分为两部分:邮件头和邮件内容。TCP/IP对电子邮件的邮件头的格式作了确切的规定,而将邮件内容的格式让用户自定义。
                            在邮件头中最重要的两个组成部分就是发送者和接收者的电子邮件地址。
电子邮件地址的格式如下:
   用户名@电子邮局域名 例:abc@990.net
电子邮件的传输协议(也就是在邮局间交换电子邮件的协议)主要有SMTP(简单邮件传输协议)、POP(电子邮局协议),以及现在新兴的IMAP(互联网邮件应用协议)。
整个电子邮件应用系统由两大部分构成:
1. 电子邮局系统;
     电子邮局行使着像传统邮局的功能,它在发送者和接收者之间起着一个桥梁作用。它是运行在电子邮局服务器上的一个服务器端程序。
     最常用的有Microsoft的IIS和sendmail等。
2. 电子邮件发送、接收系统。
    电子邮件发送、接收系统则象遍及千家万户的邮箱,发送者和接收者通过它将邮件从电脑中发送和接收邮件。这个部分是一个运行在电
    脑中的客户端程序,最常用的有Microsoft的Outlook Express,Netscape,The Bat,Foxmail,方正飞扬等。
有3种可提供的邮件服务
   MTA(Message Transfer Agent):消息传输代理(发送邮件服务器) sendmail, postfix, qmail
   MDA (Mail Delivery Agents):邮件传递代理(邮件处理器) procmail, maildrop
  MUA (Mail User Agent):邮件用户代理(邮件客户端上运行的程序) Mozilla, elm
☆邮件服务器
  邮件服务器是电子邮件系统的核心构件,它的主要功能是发送和接收邮件,同时向发件人报告邮件的传送情况。根据用途的不同,可以将
  邮件服务器分为发送邮件服务器(SMTP服务器)和接收邮件服务器(POP3服务器或IMAP4服务器)。
    sendmail和postfix。您可以选择任何一个MTA
  Sendmail并不处理最终的投递,当然也不会处理如何把邮件提交给最终用户这样的任务。一般来说,我们总是在Windows客户机器上处
  理各种电子邮件,因此需要一个服务程序负责将sendmail存储的邮件转交给Windows或其他任何客户机器。有两种基本的方法,一种是
  将邮件传送到客户的本地机器上处理,这是通过所谓的邮局协议实现的;另一种是允许用户远程操作其邮箱并且实现对邮件的浏览和管理,
  这是通过所谓的IMAP协议。
2                          ☆SMTP协议
SMTP即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把Email寄到收件人的服务器上了。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。
3                          ☆POP3协议
POP3即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的协议。它是Internet电子邮件的第一个离线协议标准,POP3允许从服务器上把邮件存储到本地主机即自己的计算机上,同时删除保存在邮件服务器上的邮件。遵循POP3协议来接收电子邮件的服务器是POP3服务器。
4                          ☆IMAP4协议
IMAP4即Internet信息访问协议的第4个版本,是用于从本地服务器上访问电子邮件的协议,它是一个客户/服务器模型协议,用户的电子邮件由服务器负责接收保存,用户可以通过浏览信件头来决定是否要下载此信。用户也可以在服务器上创建或更改文件夹或邮箱,删除信件或检索信件的特定部分。
5                          ☆POP和IMAP差异
虽然POP和IMAP都是处理接收邮件的,但两者在机制上却有所不同。在用户访问电子邮件时,IMAP4需要持续访问服务器,POP3则是将信件保存在服务器上,当用户阅读信件时,所有内容都会被立即下载到用户的机器上。因此,可以把IMAP4看成是一个远程文件服务器,而把POP看成是一个存储转发服务器。就目前情况看,POP3的应用远比IMAP4广泛得多。
6                          ☆mail
使用权限:所有使用者
使用方式:mail [-iInv] [-s subject] [-c cc-addr] [-b bcc-addr] user1 [user 2 ...]
说明:
mail 不仅只是一个指令, mail 还是一个电子邮件程式,不过利用 mail 来读信的人应该很少吧!对于系统管理者来说 mail 就很有用,因为管理者可以用 mail 写成 script ,定期寄一些备忘录提醒系统的使用者。
参数:
i  忽略 tty 的中断讯号。 (interrupt)
I  强迫设成互动模式。 (Interactive)
v  列印出讯息,例如送信的地点、状态等等。 (verbose)
n  不读入 mail.rc 设定档。
s   邮件标题。
c cc  邮件地址。
b bcc  邮件地址。
将信件送给一个或以上的电子邮件地址,由于没有加入其他的选项,使用者必须输入标题与信件的内容等。而 user2 没有主机位置,就会送给邮件伺服器的 user2 使用者。
    mail user1@email.address
    mail user1@email.address user2
将 mail.txt 的内容寄给 user2 同时 cc 给 user1 。如果将这一行指令设成 crontab 就可以定时将备忘录寄给系统使用者。
   mail -s 标题 -c user1 user2 < mail.txt
   mail 查看/var/spool/mail/目录下自已邮箱内容(每个用户会有一个文件保存自己所有文件)。以q退出把看过的邮件保存在~/mbox文件中。
   mail test@panda.com 直接发邮件给人。
   mail -s 'title text' test@panda.com < mail.txt 把文档中内容邮寄出去。
   mail -f ~/mbox 查看home目录下邮箱内容。
7                          ☆uuencode/uudecode
用mail发附件也是可行,要用到uuencode and uudecode命令进行编码。
编码:uuencode [file] name
uuencode hello >hello.uue
default input is stdin;se
default output is stdout.
解码:uudecode [-o outfile] name
uudecode hello.uue
可以用-o选项输出另外一个文件名。
# uuencode ~/.bashrc -o bashrc | mail -s 'test uuencode' test@panda.com
8                          ☆system-switch-mail
 切换sendmail和postfix
9                          ☆sendmail
sendmail提供SMTP服务
10              ☆sendmail安装
如果你在安装RHEL5的时候,选择了E-MAIL服务,sendmail就已经安装在LINUX系统中了,并且已经作了一些最基本的设置。
  sendmail-8.13.8-2.el5.i386.rpm       (第一张光盘,默认已装) sendmail软件包是sendmail服务器程序的安装包,是最重要的软件包.
  m4-1.4.5-3.el5.1.i386.rpm            (第一张光盘,默认已装)m4软件包中包括了配置sendmail服务器的必要工具.
  procmail-3.22-17.1.i386.rpm         (第一张光盘,默认已装)
  sendmail-cf-8.13.8-2.el5.i386.rpm     (第二张光盘,默认未装) sendmail-cf软件包中包括了重新配置sendmail服务器的必要配置文件.
  sendmail-doc-8.13.8-2.el5.i386.rpm   (第三张光盘,默认未装) sendmail-doc软件包中包括了sendmail服务器的说明文档.
  sendmail-devel-8.13.8-2.el5.i386.rpm  (第三张光盘,默认未装) 
管理员需要手动安装以下两个包,才能配置sendmail服务器:#rpm -ivh sendmail-cf-8.13.8-2.el5.i386.rpm  sendmail-doc-8.13.8-2.el5.i386.rpm
设置运行级别:#chkconfig --level 35 sendmail on
11              ☆sendmail使用前配置
sendmail的DNS设置
当sendmail程序得到一封待发送的邮件的时候,它需要根据目标地址确定将信件投递给那一个服务器,这是通过DNS服务实现的。例如,有一封邮件的目标地址是 panda@panda.com,那么,sendmail首先确定这个地址是用户名(panda)+机器名(panda.com)的格式,然后,通过查询DNS来确定需要把信件投递给某个服务器。
先用ifconfig查看服务器的ip,再把ip写入:
   #vi  /etc/resolv.conf
    ; generated by /sbin/dhclient-script
    search panda.com
    nameserver 192.168.152.128
确认/etc/hosts,
   #vi /etc/hosts
    # Do not remove the following line, or various programs
    # that require network functionality will fail.
    127.0.0.1       panda.panda.com         panda   panda
然后在/etc/named.conf中加入
   zone "panda.com" IN {
        type master;
        file "panda.com.zone";
    };
最后生成/var/named/chroot/var/named/panda.com.zone
   $TTL    86400
   @ IN SOA panda.panda.com. root.panda.panda.com. (
                              2006062700 ; Serial
                              28800 ; Refresh
                              14400 ; Retry
                              3600000 ; Expire
                              86400 ) ; Minimum
   IN     NS    panda
   IN     MX   10    panda
   panda  IN    A    192.168.152.128
重启DNS.#service named restart
DNS数据中,与电子邮件相关的是MX记录,这可以在查询DNS时设置查询类型为mx来得 到:
[root@panda ~]# nslookup
  > panda.panda.com
  Server:         192.168.152.128
  Address:        192.168.152.128#53
  Name:   panda.panda.com
  Address: 192.168.152.128
  > set q=mx
  > panda.com
  Server:         192.168.152.128
  Address:        192.168.152.128#53
  panda.com       mail exchanger = 10 panda.panda.com.
在一般的情况下,mx交换器会自动把信件内容转交给目标主机,不过,也存在这样的情况 ,目标主机(比如panda.com)可能并不存在,或者不执行smtp服务,而是由其mx交换器来执行信件的管理,这时候,最终的信件将保存在mx机器上,直到用户来察看它。
如果DNS查询无法找出对某个地址的MX记录(通常因为对方没有信件交换主机),那么sendmail将是试图直接与对方的主机(来自邮件地址)对话并且发送邮件。例如,test@china.com在DNS中没有对应的MX记录,因此sendmail在确定MX交换器失败后,将从DNS取得对方的IP地址并直接和对方对话试图发送邮件。
sendmail发送邮件时,如果经过设定的时间后仍然未能将信件投递到目的主机,它将返回一个错误信息并且休息一段时间,然后重新试图投递,如果连续多次失败,sendmail最终将放弃投递并将错误信息投递给postmaster用户。在许多机器上,postmaster用户是root用户的一个别名(参考下面关于别名的内容),你应该将它设置为邮件的实际管理员的用户名。
例如,你可能会用mail程序向某个地址这样发信:
  To:other@otherdomain.com
  Subject:test mail
  test
someone@somedomain.com 必须准确到某台主机上
那么,当sendmail发信的时候,它是向 someone@somedomain.com发信而不是 other@otherdomain.com。相应地,如果你想向两个人发信,例如你在outlook里面写上:"投递给 user1@a.com,抄送 user2@b.com",那么sendmail应该怎么做?直接同时向两个地址发信吗?否,它试图构造两个包装(称为信封),每个包装上只列出一个投递地址,各投递一次。虽然邮件正文的头部仍然包含两个地址,但是sendmail不会看它。
配置文件
  /etc/sysconfig/sendmail
  DAEMON=yes
  QUEUE=1h
每一个小时传递队列中的文件
12              ☆sendmail防火墙
iptables -I INPUT -p tcp --dport 25 -j ACCEPT
13              ☆sendmail启动
启动用:
#service sendmail start ;#/etc/init.d/sendmail start;
或 # sendmail  -bd  -q30m该命令以后台进程方式(-bd)运行,并使其每隔30分钟(-q30m)轮询一次未发送邮件队列,检查是否有新邮件。-q1h表示每隔一个小时发送一次邮件
停止用:
#service sendmail stop;#/etc/init.d/sendmail stop;#service sendmail restart ;
14              ☆sendmail主要配置文件
  #ls  /etc/mail/
  access            helpfile           Makefile      submit.mc
  access.db         local-host-names   sendmail.cf    trusted-users
  domaintable      mailertable        sendmail.mc   virtusertable
  domaintable.db   mailertable.db      submit.cf     virtusertable.db
  #ls  /etc/aliases*
   /etc/aliases      /etc/aliases.db
在/etc/mail目录中保存了sendmail服务器使用的所有配置文件,文件后缀是".cf"的是服务器配置文件,文件后缀是".db"的是服务器使用的数据库文件,下面是常用的文件说明:
配置文件sendmail.cf和sendmail.mc
  sendmail服务器的主配置文件是sendmail.cf,该文件的格式是公认的难于理解,因此即使是有经验的管理员也会避免直接编辑此文件,sendmail开发人员为
  sendmail管理者提供了更加容易理解和配置的sendmail.mc文件。一般情况下,系统管理员对sendmail.mc文件的内容进行设置后,再使用m4命令由
  sendmail.mc文件的内容生成sendmail.cf文件。但由于sendmail.mc文件的配置依然有一定的难度,因此在第一次对sendmail.mc文件进行修改前,最好先将
  该文件进行备份,以便配置错误时能够恢复默认配置,操作流程如下:
    #cd /etc/mail                   (进入主配置文件目录)
    #cp sendmail.mc  sendmail.mc-  (备份配置文件sendmail.mc)
    #vi sendmail.mc                (编缉配置文件sendmail.mc)
    #m4 sendmail.mc > sendmail.cf   (利用m4命令重新生成主配置文件sendmail.cf)
    #service sendmail restart         (重启sendmail服务使配置生效)
 注意:sendmail服务器在运行时只读取sendmail.cf文件中的设置,因此每次对sendmail.mc文件进行修改后都需要使用m4命令生成新的sendmail.cf文件, 
       而且m4命令必须在/etc/mail/目录中执行。
数据库配置文件和数据库文件
  在sendmail服务器中除了sendmail.cf主配置文件以外,还使用了许多数据库文件辅助进行sendmail服务器的配置。在/etc/mail目录中所有扩展名为".db" 的
  文件都是数据库文件,这些数据库文件的格式对于用户是不可读的。每个".db"数据库文件在同一目录下都对应有同名的无扩展名文件,例如对于access.db
  文件,对应有名为access的文本文件,access文件是用于系统管理员进行管理的,称为数据库配置文件。当管理员在数据库配置文件(文本文件)中进行了相
  应的设置后,需要使用makemap命令将数据库配置文件生成".db"的数据库文件,因为sendmail服务器只能够识别".db"的数据库文件中的配置内容。操 
  作流程如下:
    #cd /etc/mail        (进入数据库文件目录)
    #vi  access         (编辑数据库配置文件)
    #makemap  hash  access.db  <access   (用makemap命令重新生成数据库文件)
    #service sendmail restart    (重启sendmail服务让配置生效)
☆sendmail.mc
sendmail.mc文件中指令的意义:
指令
 意义
 
divert (-1)
 删除结果文件中的垃圾
 
divert (0)
 保存通常的配置文件
 
Dnl
 注解
 
Include
 包含一个文件
 
define arg1 arg2
 定义宏arg1设置为arg2
 
undefine arg1
 取消arg1的定义
 
OSTYPE ('Linux')
 定义操作系统类型
 
FEATURE
 功能选项,对应/usr/lib/sendmail-cf/feature里定义的文件名称
 
MAILER
 定义所有必要的邮件投递代理程序
 
ASQUERADE_AS
 用来处理多主机名称问题
 
divert(-1)dnl
dnl #
dnl # This is the sendmail macro config file for m4. If you make changes to
dnl # /etc/mail/sendmail.mc, you will need to regenerate the
dnl # /etc/mail/sendmail.cf file by confirming that the sendmail-cf package is
dnl # installed and then performing a
dnl #     make -C /etc/mail
include(`/usr/share/sendmail-cf/m4/cf.m4')dnl
VERSIONID(`setup for linux')dnl
OSTYPE(`linux')dnl    //设定使用的操作系统类别
dnl # Do not advertize sendmail version.
dnl define(`confSMTP_LOGIN_MSG', `$j Sendmail; $b')dnl
dnl # default logging level is 9, you might want to set it higher to
dnl # debug the configuration
dnl define(`confLOG_LEVEL', `9')dnl
dnl # Uncomment and edit the following line if your outgoing mail needs to
dnl # be sent out through an external mail server:
dnl define(`SMART_HOST', `smtp.your.provider')dnl
define(`confDEF_USER_ID', ``8:12'')dnl
dnl define(`confAUTO_REBUILD')dnl
define(`confTO_CONNECT', `1m')dnl
define(`confTRY_NULL_MX_LIST', `True')dnl
define(`confDONT_PROBE_INTERFACES', `True')dnl
define(`PROCMAIL_MAILER_PATH', `/usr/bin/procmail')dnl
define(`ALIAS_FILE', `/etc/aliases')dnl
define(`STATUS_FILE', `/var/log/mail/statistics')dnl
define(`UUCP_MAILER_MAX', `2000000')dnl
define(`confUSERDB_SPEC', `/etc/mail/userdb.db')dnl
define(`confPRIVACY_FLAGS', `authwarnings,novrfy,noexpn,restrictqrun')dnl
define(`confAUTH_OPTIONS', `A')dnl
dnl # The following allows relaying if the user authenticates, and disallows
dnl # plaintext authentication (PLAIN/LOGIN) on non-TLS links
dnl define(`confAUTH_OPTIONS', `A p')dnl
dnl # PLAIN is the preferred plaintext authentication method and used by
dnl # Mozilla Mail and Evolution, though Outlook Express and other MUAs do
dnl # use LOGIN. Other mechanisms should be used if the connection is not
dnl # guaranteed secure.
dnl # Please remember that saslauthd needs to be running for AUTH.
ddnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl # Rudimentary information on creating certificates for sendmail TLS:
dnl #     cd /usr/share/ssl/certs; make sendmail.pem
dnl # Complete usage:
dnl #     make -C /usr/share/ssl/certs usage
dnl define(`confCACERT_PATH', `/etc/pki/tls/certs')dnl
dnl define(`confCACERT', `/etc/pki/tls/certs/ca-bundle.crt')dnl
dnl define(`confSERVER_CERT', `/etc/pki/tls/certs/sendmail.pem')dnl
dnl define(`confSERVER_KEY', `/etc/pki/tls/certs/sendmail.pem')dnl
dnl # This allows sendmail to use a keyfile that is shared with OpenLDAP's
dnl # slapd, which requires the file to be readble by group ldap
dnl define(`confDONT_BLAME_SENDMAIL', `groupreadablekeyfile')dnl
dnl define(`confTO_QUEUEWARN', `4h')dnl
dnl define(`confTO_QUEUERETURN', `5d')dnl
dnl define(`confQUEUE_LA', `12')dnl
dnl define(`confREFUSE_LA', `18')dnl
define(`confTO_IDENT', `0')dnl
dnl FEATURE(delay_checks)dnl
FEATURE(`no_default_msa', `dnl')dnl
FEATURE(`smrsh', `/usr/sbin/smrsh')dnl
FEATURE(`mailertable', `hash -o /etc/mail/mailertable.db')dnl
FEATURE(`virtusertable', `hash -o /etc/mail/virtusertable.db')dnl
FEATURE(redirect)dnl
FEATURE(always_add_domain)dnl
FEATURE(use_cw_file)dnl
FEATURE(use_ct_file)dnl
dnl # The following limits the number of processes sendmail can fork to accept
dnl # incoming messages or process its message queues to 20.) sendmail refuses
dnl # to accept connections once it has reached its quota of child processes.
dnl define(`confMAX_DAEMON_CHILDREN', `20')dnl
dnl # Limits the number of new connections per second. This caps the overhead
dnl # incurred due to forking new sendmail processes. May be useful against
dnl # DoS attacks or barrages of spam. (As mentioned below, a per-IP address
dnl # limit would be useful but is not available as an option at this writing.)
dnl define(`confCONNECTION_RATE_THROTTLE', `3')dnl
dnl # The -t option will retry delivery if e.g. the user runs over his quota.
FEATURE(local_procmail, `', `procmail -t -Y -a $h -d $u')dnl
FEATURE(`access_db', `hash -T<TMPF> -o /etc/mail/access.db')dnl
FEATURE(`blacklist_recipients')dnl    //允许使用黑名单查禁收件人。因此用户可以在access文件中设定黑名单。
EXPOSED_USER(`root')dnl
dnl # For using Cyrus-IMAPd as POP3/IMAP server through LMTP delivery uncomment
dnl # the following 2 definitions and activate below in the MAILER section the
dnl # cyrusv2 mailer.
dnl define(`confLOCAL_MAILER', `cyrusv2')dnl
dnl define(`CYRUSV2_MAILER_ARGS', `FILE /var/lib/imap/socket/lmtp')dnl
dnl # The following causes sendmail to only listen on the IPv4 loopback address
dnl # 127.0.0.1 and not on any other network devices. Remove the loopback
dnl # address restriction to accept email from the internet or intranet.
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
dnl # The following causes sendmail to additionally listen to port 587 for
dnl # mail from MUAs that authenticate. Roaming users who can't reach their
dnl # preferred sendmail daemon due to port 25 being blocked or redirected find
dnl # this useful.
dnl DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea')dnl
dnl # The following causes sendmail to additionally listen to port 465, but
dnl # starting immediately in TLS mode upon connecting. Port 25 or 587 followed
dnl # by STARTTLS is preferred, but roaming clients using Outlook Express can't
dnl # do STARTTLS on ports other than 25. Mozilla Mail can ONLY use STARTTLS
dnl # and doesn't support the deprecated smtps; Evolution <1.1.1 uses smtps
dnl # when SSL is enabled-- STARTTLS support is available in version 1.1.1.
dnl # For this to work your OpenSSL certificates must be configured.
dnl #
dnl DAEMON_OPTIONS(`Port=smtps, Name=TLSMTA, M=s')dnl
dnl # The following causes sendmail to additionally listen on the IPv6 loopback
dnl # device. Remove the loopback address restriction listen to the network.
dnl DAEMON_OPTIONS(`port=smtp,Addr=::1, Name=MTA-v6, Family=inet6')dnl
dnl # enable both ipv6 and ipv4 in sendmail:
dnl DAEMON_OPTIONS(`Name=MTA-v4, Family=inet, Name=MTA-v6, Family=inet6')
dnl # We strongly recommend not accepting unresolvable domains if you want to
dnl # protect yourself from spam. However, the laptop and users on computers
dnl # that do not have 24x7 DNS do need this.
FEATURE(`accept_unresolvable_domains')dnl  //接受无法反向解析的域来的邮件
dnl FEATURE(`relay_based_on_MX')dnl   //自动接受DNS中MX记录来源的邮件转发
dnl # Also accept email sent to "localhost.localdomain" as local email.
LOCAL_DOMAIN(`localhost.localdomain')dnl
dnl # The following example makes mail from this host and any additional
dnl # specified domains appear to be sent from mydomain.com
dnl MASQUERADE_AS(`mydomain.com')dnl
dnl # masquerade not just the headers, but the envelope as well
dnl FEATURE(masquerade_envelope)dnl
dnl # masquerade not just @mydomainalias.com, but @*.mydomainalias.com as well
dnl FEATURE(masquerade_entire_domain)dnl
dnl MASQUERADE_DOMAIN(localhost)dnl
dnl MASQUERADE_DOMAIN(localhost.localdomain)dnl
dnl MASQUERADE_DOMAIN(mydomainalias.com)dnl
dnl MASQUERADE_DOMAIN(mydomain.lan)dnl
MAILER(smtp)dnl
MAILER(procmail)dnl
dnl MAILER(cyrusv2)dnl
☆mc语法
一个mc模板文件通常可以包含几个段落:
注意里面的正反引号,而且不能随便加入空格。
sendmail宏定义说明
divert(n) 为m4定义一个缓冲动作,当n=-1时缓冲被删除,n=0时开始一个新缓冲
OSTYPE 定义宏所使用的操作系统,该宏允许m4程序增加同相关操作系统相关的文件
Domain 定义MTA将使用哪些域来传输邮件
Feature 定义配置文件中使用的一个特定的功能集
Define 定义配置文件中的一个特定的选项值
MASQUERADE_AS 定义sendmail来应答邮件的其它主机名
MAILER 定义sendmail使用的邮件传输方法
dnl 注释
divert
通常总是设置为divert(-1)让m4在输出中去掉一些垃圾。
OSTYPE OSTYPE
定义使用的操作系统类型,当然在我们的情况下就是linux,但是一定要注意m4程序中引号的用法,一个反引号和一个正引号才代表把对应的东西括起来。
define
定义一些全局设置,对于Linux系统,设置了OSTYPE之后,可以定义下面的一些全局 参数,如果不定义,就使用缺省值。例如:
define(ALIAS_FILE,/etc/aliases)
变量名 说明(方括号中为缺省值)
ALIAS_FILE [/etc/aliases]
别名文件的位置。如果有多个别名文件,需要把它们用引号括起来(别忘了引号规则 !)。
confCR_FILE [/etc/mail/relay-domains]
缺省的域定义文件,在这个域中定义的域中机器可以通过你的服务器进行邮件发送。
HELP_FILE [/usr/lib/sendmail.hf]
此文件中含有对SMTP的HELP命令进行响应时要列出的信息。
QUEUE_DIR [/var/spool/mqueue]
邮件队列文件所在目录。
STATUS_FILE [/etc/sendmail.st]
sendmail的状态信息文件。
LOCAL_MAILER_PATH [/bin/mail]
用于投递本地邮件的程序。
LOCAL_MAILER_FLAGS [rmn9]
local mailer要用到的标志,永远包含标志lsDFM。
LOCAL_MAILER_ARGS [mail -d $u]
在投递本地邮件时所传送的参数。
LOCAL_MAILER_MAX [没有]
如定义了此参数,则为此邮件服务器所能接收最大单个邮件大小。
LOCAL_MAILER_CHARSET [没有]
如果定义了此参数,则被转化为MIME格式的从其他地址到local mailer的含有8位字符 的信息将被标为此字符集。
LOCAL_SHELl_PATH [/bin/sh]
用于投递利用管道功能处理的邮件的shell.
LOCAL_SHELL_FLAGS [eu9]
prog mailer用到的标志。在此标志中永远包含标志lsDFM.
LOCAL_SHELL_DIR [$z:/]
shell运行时所要查找的目录路径。
USENET_MAILER_PATH [/usr/lib/news/inews]
用于投递电子新闻组的程序名称。
USENET_MAILER_FLAGS [rlsDFMmn]
usenet mailer的投递标志。
USENET_MAILER_ARGS [-m -h -n]
usenet mailer的命令行参数。
USENET_MAILER_MAX [100000]
usenet mailer所能接收的最大信息大小。
SMTP_MAILER_FLAGS [没有]
SMTP mailer附加标志。对所有基于SMTPmailer其默认标志为mDFMUX;基于esmtp的邮差 (mailer)加上a标志;而基于"smtp8"的邮差则加上8。
SMTP_MAILER_MAX [没有]
使用smtp,smtp8或esmtp传输的单个邮件最大容量。
SMTP_MAILER_CHARSET [没有]
如果定义了此参数,则被转化为MIME格式的从其他地址到任一个smtp mailer的含有8 位字符的信息将被标为此字符集。
POP_MAILER_PATH [/usr/lib/mh/spop]
pop邮差的路径名。
POP_MAILER_FLAGS [Penu]
pop邮差附加标志。同时总是加上标志lsDFM。
POP_MAILER_ARGS [pop $u]
传给pop邮差的参数。
PROCMAIL_MAILER_PATH [/usr/local/bin/procmail]
procmail程序的路径名。此外FEATURE(local procmail)也用到此参数。
PROCMAIL_MAILER_FlAGS [SPhnu9]加给Procmail邮差的标志。同时总是加上"DFM"标志 。
PROCMAIL_MAILER_MAX [没有]
procmail所接收的最大单个邮件容量。如果你对某些人发送巨大的邮件感到困扰,启 用这个选项。
FEATURE
定义sednamil的一些运行参数,通常对我们来说最重要的一些选项是:
use_cw_file
读取文件/etc/sendmail.cw以确定这台机器应该替哪些机器接受邮件。此主机的别名 。当你使用 MX记录将此主机定义为其他主机的邮件交换机时需要使用这个特性。例如: FEATURE(use_cw_file)
relay_hosts_only
通常情况下,sendmail为sendmail.cf中明确列出的域(一般是localhost)和/etc/ mail/relay-domains中定义的域进行投递代理。缺省下这两处定义的都是域的名字。如果你定义了这个参数,那么这两处的内容将被解释为主机名字。
use_ct_file
读取文件/etc/sendmail.ct以取得系统"信任"的用户名字,这些用户可以使用-f设置其发信信封上的from地址而不产生警告信息。
redirect
使用REDIRECT特性,这个特性允许你对某些已经搬迁的用户发出重定向信息。(见下 一节)。
例如:
FEATURE(redirect)
mailertable
包含一个用于覆盖到特定域路由(routing)的"mailer table".此特性参数定义可以是 一个关键词定义。如未指定任何参数, 其定义通常是:
FEATURE(mailertable,`hash -o /etc/mailertable)
domaintable
包含一个用于提供域名映象的"domain table",当改变你自已的域名时可能有用(如 你公司由oldname.com改为newname.com)。其定义通常是:
FEATURE(domiaintable,`hash -o /etc/domaintable)
always_add_domain
在本地发送邮件时也加上其主机域名。例如:
FEATURE(always_add_domain)
allmasquerade
如果使用了伪装(masquerading,使用MASQUERADE_AS),则此特性将使接收者的地址也伪 装为来自所伪装为主机。
limitd_masquerade
通常情况下$w所列出的所有主机将被伪装。如果使用了此特性,则只对那些$m所列出的主机进行伪装。
masquerade_entire_domain
如使用了伪装且设置了MASQUERADE_DOMAIN,此特性将引起 地址重写,使所要伪装的网 域整个被隐藏。所有含有被伪装域名的主机用伪装域名(通常是MASQUERADE_AS)进行重写 。
masquerade_envelope
用此特性告知sendmail将信封和信件头中上的发送者和接收者进行伪装。
定义了有关masq的选项之后,就可以使用伪装了,可以直接将伪装命令写入mc模板, 示例如下:
MASQUERADE_AS(masq.com)
MASQUERADE_DOMAIN(foo.org)
这意味着我们的 someone@foo.org发信的时候,sendmail将会把它的信封伪装为some one@masq.com。这对于统一整个域的电子邮件是非常重要的。
virtusertable
允许在同一个主机上使用多个虚拟域。参考下一节。例如:
FEATURE(`virtusertable,`hash -o /etc/mail/virtusertable)
nullclient
这是一个特殊情况--它生成一个除了支持将所有的邮件通过本地的基于SMTP的网络转 递到一个中心邮件HUB之外不含任何内容的配置文件。其参数是此邮件HUB的主机名。唯 一可与nullclient一起使用的其他特性是"nocanonify"(这样可以使非完全地址可通过S MTP连接进行发送;通常情况下地址将使用伪装名字转变为完全邮件名称,此伪装名字默 认值为邮件HUB主机的名字)。 在此特性使用是不应定义任何邮差。当然也不进行别名 处理或转寄。
local_procmail
使用procmail作为本地邮差。
smrsh
对到程序的邮件使用使用sendmail发行版所带的SendMail Restricted SHell (smrsh )而不是/bin/sh。由于sendmail是以root权限执行,某个发送到恶意程序的邮件可以破 坏系统,只要利用别名转向使得邮件被转发到对应的程序,因此缺省下sendmail用smrsh来处理邮件转发到程序的请求。这可以提高本地系统管理员控制对那些通过邮件运行程 序的行为,例如
FEATURE(`smrsh,`/usr/sbin/smrsh)
注意有些程序无法通过smrsh运行(例如majordomo的wrapper程序),这是出于安全 性的考虑,smrsh不准用户程序使用一些setuid功能。如果你一定要使用这些程序,清将 smrsh定义成其他shell程序,如sh。
access_db
本地存取控制文件的名字,缺省是/etc/mail/access.db,也可以用命令行指出,例 如:
FEATURE(`access_db)
或者 或者
FEATURE(`access_db,`hash -o /etc/mail/access)
mailertable
允许使用mailertable文件。这个文件定义对某确定的域使用什么样的邮差。例如:
FEATURE(`mailertable',`hash -o /etc/mail/mailertable)。
blacklist_recipients
允许你用前面定义的access_db来禁止某个地方来的邮件,或是某个人的邮件,等等 。
relay_based_on_MX
是否允许别人用你的机器当成MX交换器。如果你设置了这个选项,那么任何人只要在 域名服务器中将你的机器设置成为他的MX交换就可以用你的机器转发电子邮件。这个功 能意味着:你的机器替它接受电子邮件,再提交给它;一般来说这个功能是不必要的; 如果你一定要使用这个选项,记住你可能被庞大的邮件流量吞没。但是在一种情况下这 个功能又是不可缺少的:假如你的系统有防火墙,只有邮件服务器能够对外连接,那么 这个功能是使网络内部其他主机能够接受自己电子邮件的唯一方法。
DOMAIN
这个关键字一般用来定义邮件中继,假如你的系统里面除了Internet互连之外还有类似Decnet,UUCP之类的东西,那么你就需要设置DOMAIN来保证非internet的邮件被正确 中继。对于一般的系统,不需要定义这个属性。
MAILER
定义可以使用的投递程序(邮差)。
例如:
MAILER(smtp)
定义smtp投递。
MAILER(local)
定义局部投递。
如果你想做邮件服务,这样两个邮差是必须的。
☆sendmail.cf
#m4  sendmail.mc > /etc/sendmail.cf
sendmail.cf语法复杂,内容繁多,它的配置信息和选项用于限定sendmail守护进程的运行。由于太复杂,很难逐条去建立它,而是通过用m4宏预处理器对
有限而直观的.mc配置宏文件进行处理生成的。
(1)sendmail.cf文件构成
   sendmail.cf文件由定义不同内容的多个小节构成,这些小节的作用见下表:
 小节
 功能
 
Local Information
 定义有关个人主机的信息
 
General Macros
 定义有关本地网络的宏
 
Classes
 定义用于特殊邮件传输程序的主机名群或域名群
 
Version Number
 标识sendmail.cf文件的版本号
 
Special Macros
 定义由sendmail所用的一些特殊的宏
 
Option
 定义sendmail选项
 
Message Precedence
 定义sendmail所用的各种消息的优先级值
 
Trusted Users
 定义在发送邮件时可以忽略发送者地址的用户
 
Format of Headers
 定义sendmail插入的邮件首部格式
 
Rewriting Rules
 定义用于重写邮件地址的规则
 
Mailers
 定义sendmail用来调用邮件传输程序的指令
 
Ruleset Zero
 定义一组称为ruleset zero的重写规则
 
Machine-dependent part of Ruleset Zero
 定义与配置相关的Ruleset Zero部分
 
 (2)sendmail.cf文件的命令
    sendmail.cf文件的每一行都以一个命令字符打头,后边是具体的设置内容。命令字符说明了本行的作用,设置内容说明了设置的对象,空行将被忽略。
    如果行的第一个字符是空格,说明是上一行的继续行。所有指令的意义如下:
    #:说明了本行是注释行;
    D:宏定义操作符;
       用法:DK [字符串],这就将宏K定义成了后面的字符串,可以在配置文件中对它进行引用,避免了多次输入某一相同的字符串。
       提示:宏的名字应该是单独的一个大写字母,因为sendmail用小写字母定义自己的宏变量。
    C和F:类定义操作符;
       用法:CK[类名]或者FK文件名,这就定义了类K或者定义了从指定的文件中读取类K的值。
       提示:一个类可以包含一个或多个单词,也要使用单独的大写字母,原因同上。
    H:邮件头定义操作符,一般不用对配置文件中缺省提供的邮件头做任何修改;
    O:设置选项操作符,sendmail具有多种可以设置其操作的选项,还可以通过这些选项来告诉sendmail,所要使用的文件放在什么位置。当然这些选项也
       可以通过命令行来提供,两种方法是等价的,人们常常将很少改变的设置在配置文件中通过O操作符给出;
    P:优先级操作符,用来指定邮件的优先级别。另外,sendmail还指定了一些具体的邮件标题,这些特定的邮件标题本身就具有了确定的优先级。例如:
        Pspecial-delivery = 100
        Pfirst-class = 0
        Plist = -30
        Pjunk = -100
    V:sendmail.cf的版本级别操作符,它能够使sendmail知道在配置文件中可以找到哪些特性;
       提示:sendmail.cf的版本级别和Sendmail的版本级别不是一回事。
    K:关键字数据库操作符,因为sendmail使用了一些关键字数据库,例如别名库等等。K操作符可以用来告诉sendmail这些可利用的数据库的位置或类别
        等类似信息,缺省支持DBM格式的库,一般可以支持DBM,BTREE,HASH,NIS等。
    M:邮件发送器的操作符,对于每一个目标,可以定义一个专门的邮件发送器。邮件发送器将通过定义在其中的sendmail固定的SMTP传输器,把邮件
        发送给其他主机。所有邮件发送器都是用M操作符和邮件发送器的名字开头的一行来定义,举例如下:
          Mlocal,  P=/bin/mail,  F=lsDFMfSn,  S=10,  R=20,  A=mail-d  $  u
        在上面本地邮件发送器的定义中:
         P操作项用来提供投递邮件的程序所处的位置的路径名称;
         F用来为本地邮件发送器提供sendmail标志;
         A项用来为运行的程序(这里是/bin/mail)提供命令行,所以sendmail将运行命令:mail-d $u,其中的宏$u将被替换为邮件应该被发送的用户的用户名。
         S和R是规则集操作符。规则集用来发现地址中的错误,将地址改写为远程邮件发送器能够理解的形式,以及将邮件解析到sendmail内部的某个邮
                               件发送器。sendmail将按固定的顺序向规则集传送地址,规则集也可以调用其他的规则集。规则集由S来指定,S的后面
                               是用来表示规则集的编号。
 (3)sendmail.cf中的预定义宏
     sendmail.cf中的预定义宏参见下表:
   
宏名
 意义
 
a
 RFCs822格式的原始日期
 
b
 RFCs822格式的当前日期
 
c
 Hop计数
 
d
 UNIX格式的日期
 
e
 SMTP数据项信息
 
f
 邮件发送者地址
 
g
 相对于接收者的发送者地址
 
h
 接收主机
 
i
 队列标识
 
j
 节点的正式域名
 
l
 UNIX的行格式
 
n
 用于错误信息中的名字
 
o
 地址中的操作符集合
 
p
 sendmail的PID
 
q
 默认的发送者格式
 
r
 所用的协议
 
s
 发送者的主机名
 
t
 当前时间的数值表示
 
u
 接收方用户
 
v
 sendmail的版本号
 
w
 该节点的主机名
 
X
 发送者全名
 
z
 接收者主目录
 
☆acces                                                       
限制某些域的邮件,/etc/mail/access访问控制列表设置文件的格式是这样:
 [地址] [操作]
中间的分割符是空格键。
 [地址]栏 可以是主机地址或者名字,也可以是统配符,规则是这样:
      yourdomain.com :代表所有*.yourdomain.com的名字。
      192.168.12   :代表所有192.168.12.*的地址。
      202.135  :代表所有202.135.*.*的地址。
      someone@somedomain.com  :代表一个特定的邮件发信人
 [操作]栏通常有:
      OK       :正常接受这封邮件,远程主机可以向你的邮件服务器发送邮件;
      RELAY   :允许SMTP代理投递,这样这封邮件就可以从你的机器中转到别的机器上去; 例如:127.0.0.1  RELAY
                                                                                          192.168.10  RELAY
                 表示允许本机和192.168.10.0网段中的机器通过该邮件服务器转发邮件。
      REJECT  :拒绝接受,不能向你的邮件服务器发邮件和不能中转;
      DISCARD :发来的邮件将被丢弃,同时并不向发送者返回错误信息。忽略这封邮件,这种情况下,邮件看上去是正常投递了,但是由
                于没有人接受,邮件会自动地"消失"在网络中。
      nnn text--  :发来的邮件将被丢弃,但sendmail将会向发送者返回nnn确定的smtp代码和text变量确定的文本描述。
      错误代码+任何其他字符串:将向发信者返回这个字符串作为出错信息。错误代码是RFC 822定义的标准出错代码。例如
                        550 We don like a spammer!。客户机器在投递邮件的时候,就会产生一个"we don like a spammer"投递失败信
                        息。比如,你认为 someone@spammer是个专门投递垃圾邮件的家伙,那么你可以这样写:
                        someone@spammer 550 we don like a spammer ,然后重新启动sendmail就可以使用这些功能了。
 
 
 
   192.168  RELAY
   panda.NET  OK
   panda.COM  REJECT
   panda.COM  550  SORRY,WE DON'T ALLOW SPAMMERS HERE
   panda.ORG  DISCARD
 
设置完成后要用#makemap  hash  access.db < access命令生成数据库。
☆access.db
一般/etc/mail/access.db是一个散列表数据库,它是用/etc/mail/access为模版产生出来的。
☆aliases
/etc/aliases,这个文件用来设置用户的别名。文件/etc/aliases允许为本地用户,应用程序,甚至其他别名提供虚拟邮箱:
aliases文件的格式是
  邮件别名:实际用户名
如果一个别名有多个用户就用逗号分开 ,每个别名一行。
1.最简单的情况是需要作信件分发的情况:
要把发给postmaster的信件发送给supervisor和manager,需要写上这样一行:
   postmaster:supervisor,manager
别名还可以用在这样的情况,即定义自动的邮件转发。
某个用户以前在你的系统上接受电子邮件,现在他有了一个新的电子邮件,希望发到你的机器上的邮件自动被转发到他新的电子邮件地址上,那么,可以使用类似这样的别名方式:(假设你的机器是 panda@panda.com)
   panda:epeppanda@hotmail.com
以后发给 panda@panda.com的电子邮件就自动中转到 epeppanda@hotmail.com。注意左边自动加上你的机器名字,所以左边只能是账号名字,不能是全限定邮件地址。
2.别名的右侧也可以是文件或程序。
上面的postmaster别名可以用这样方法来设置:
   panda: :include: /etc/mail/myaliases
include:关键字表示让sendmail去读取对应的包含文件。而/etc/mail/myaliases的内容要设置成:
   pandeng
   manager
3.要把邮件重定向到程序,可以使用管道
   panda:"|/home/panda/testpg"
那么,sendmail会将发给panda的邮件的内容作为/home/panda/testpg程序的输入来执行这个程序。
另一个常用的办法是重定向。如果你在模板文件中定义了REDIRECT特性,那么可以使用这个功能。
某个人在你的机器上开了一个账户user1,后来迁移到 user2@server2.com。那么,你可以将其别名写成
以后当有人向这个地址发信的时候,你的sendmail会将其退回,并且返回一个551 User not local; please try user2@server2.com的信息。
在使用别名的时候,必须注意的是不要造成循环,例如user1转发给user2,user2又将 其转发给user1....如此循环。在这种情况下,转发17次后,sendmail将把它退还给发信 人。最常见的错误发生在你试图在转发邮件的同时在本地保留备份的情况下,例如:
    user1: user1,user2
就构成了一个循环。
在修改了别名文件之后,重新初始化别名数据库:
    [root@mail mail]# newaliases
     /etc/aliases: 17 aliases, longest 31 bytes, 241 bytes total
也可以使用sendmail -bi命令:
    [root@mail mail]# sendmail -bi
     /etc/aliases: 17 aliases, longest 31 bytes, 241 bytes total
两种方式实际是完全一样的。
当前版本的sendmail对各种附加文件和配置文件的属性都有着严格的要求,特别是/etc/aliases文件,必须至少为0644以避免非授权的修改。
☆.forward
  ~/.forward
其实该文档的作用和aliases数据库的作差不多啦,都是配置别名,做邮件转发的。因为alises只能由管理员控制,个人用户不能修改,所以就可以在test个人的目录下建立一个转寄文档。以设置个人的邮件转寄列表。文档格式如下:
   test
   test1
   test2
   test3
   ......
这种技术可以让每个用户自己管理自己的邮件别名。但由于个人用户安全意识差,如果设置不当会有安全漏洞,不建议使用。
☆local-host-names
 /etc/mail/local-host-names
将FEATURE(use_cw_file)包含在你的sendmail.mc文件当中,Sendmail将用本地主机名来作为你的本地别名。
主机别名文件
它给出本地主机的别名。如果你的主机有多个名字,或者你的主机是整个域的信件交换主机,你就需要这个文件了。
   # local-host-names - include all aliases for your machine here.
   panda.com
   mail.panda.com
   otherdomain.com
如果Sendmail没有在收件列表中发现相应的主机名,它将拒绝接受对方发来的邮件。
如果你有多个别名或者需要负责的交换域,每个需要单独写上一行。
请记住在修改了这个或其他任何配置文件后你必须重启Sendmail。
 
 
☆trusted-users
设置可信任用户
可以代表其他用户发邮件的用户
这个可选的特性在sendmail.mc中的名称为use_ct_file。
这个列表中的用户可以改变电子邮件的寄件人。
在/etc/mail/trusted-users文件中每个用户名占一行。
这对运行在你的服务器上的脚本或应用程序给某个人或组发信息是非常有用的。
它可以更容易的快速识别一个电子邮件的信息。
☆virtusertable
改域名后,可以做域名的转换 旧域 新域
类似于aliases文件,但用于外部用户
/etc/mail/virtusertable
虚拟用户表格向你服务器上的真实邮箱发送虚拟域和邮箱的邮件。这些邮箱可以是本地的,远程的,或是由/etc/aliases定义的别名。这些是在你的sendmail.mc文件中一命令行的形式进行初始配置的。
语法如下:
   左地址 右地址
中间用Tab键分开。
例如: someone@otherdomain.com  localuser
这样一行意味着本来应该发送给 someone@otherdomain.com的邮件现在要发送给本机的用户localuser。当然,这意味着:第一,你的DNS记录中,本机应该是otherdomain.com的MX交换器;第二,你的本机local-host-names文件应该包含otherdomain.com这个名字。
当然纯粹的这样的域意义不大,但是sendmail还支持邮件虚拟域的参数翻译。例如:
   @testdomain.com  test@mydomain.com
意味着所有发往 xxx@testdomain的邮件都会被发送到 test@mydomain.com。而
   @testdomain.com  %1test@mydomain.com
则代表参数转义,例如 user1@testdomain.com的邮件被发送到 user1test@mydomain.comuser2@testdomain.com被发送到 user2test@mydomain.com。同样,这样的功能也要通过MX记录和local-host-names文件加上去。
建立virtusertable的方法与建立access的办法是一样的:
   #makemap  hash  virtusertable.db < virtusertable
然后重新启动sendmail。
☆virtusertable.db
如同Apache一样,sendmail也允许使用虚拟主机功能,这是通过FEATURE(virtusertable)功能实现的,而虚拟主机的文件缺省是/etc/mail/virtusertable.db,它用/etc/mail/virtusertable文件生成,这个文件的形式类似于aliases文件,
    #makemap hash virtusertable.db < virtusertable
☆mailertable
定义邮差
/etc/mail/mailertable文件(在FEATURE(`mailertable')里定义)用来定义对某个域名或者用户使用什么样的邮差,如sz.st-anda.com smtp:[10.100.100.252]等等。一般情况下,并不需要定义这个功能。建立这个文件的方式与上面的几个hash数据库相同。
☆spamassassin
给/etc/procmailrc增加:
    INCLUDERC=/etc/mail/spamassassin/spamassassin-default.rc
来支持SpamAssassin
☆statistics
/var/log/mail/statistics
用mailstats来读取这个文件,主要记录sendmail收发信件的相关信息。
☆submit.mc
可以让使用sendmail的限定于组
☆Makefile
/etc/mail/Makefile中是编译选项,用make -C /etc/mail来处理mail目录中的所有文件
☆mqueue
/var/spool/mqueue是邮件队列临时存放的目录。在/var/spool/mqueue下,有不同的队列。消息存放在不同的队列中。消息队列文件有以下形式: qf* ------消息队列控制文件          df* ------数据文件        tf* -------临时文件
     nf* -------每个用户对应的消息队列   xf* ------当前会话过程的transcript文件
一般来说,sendmail守护子进程周期性地处理此队列,尝试发送每个消息。//etc/init.d/sendmail脚本启动sendmail进程,使它每15分钟fork出一个子进程,来处理这个mail队列,每次sendmail处理这个队列的时候 ,它就读取此队列并排序,然后试图依次运行各个任务。
15              ☆mail日志
Sendmail很好的利用的它的日志文件,你可以追捕到大部分问题的所在。
mail.log和mail.err是你需要注意的两个主要文件,还有就是mail.warn和mail.info。
这些文件有许多共同之处,所以我一般只看前两个文件。一般而言,你可以在 /var/log/下找到这些文件,对特定的系统和Linux版本,可能在其他目录下。如果必要的话,你可以察看/etc/syslog.conf文件。典型的电子邮件成功发送一般是这样的:
Oct 25 18:22:14 example sendmail[29322]: SAA29322: from=user, size=193, class=0, pri=60193, nrcpts=2, msgid=< 200110260122.SAA29322@panda.com>, relay=user@local
Oct 25 18:22:14 example sendmail[29324]: SAA29322: to=help@techsupport.net, ctladdr=user (500/1000), delay=00:00:00, xdelay=00:00:00, mailer=local, stat=Sent
你可以在mail.log看到和下面类似的拒绝信息:
Oct 23 14:23:51 example sendmail[27467]: OAA27467: ruleset=check_rcpt, arg1=, relay=west1.mail-abuse.org [204.152.186.193], reject=550 ...  Relaying denied
通常,你所需要的所有信息都存储在这些日志文件中,包括用户名,主机名,出错代码。这些出错代码很有用处,可以通过这些让你对自己有更好的了解。
#tail  -f  /var/log/maillog  使用tail的-f命令可以观察日志文件内容的实时更新,特别适合于对服务器进行调试和错误检查。
16              ☆Sendmail的常见配置举例
假设配置的要求如下:
 ·邮件服务器的IP地址为192.168.1.2,主机域名为mail.1test.com
 ·邮件服务器将为1test.com域中的用户提供邮件服务
 ·为了防止垃圾邮件,服务器需要具有SMTP用户认证功能
邮件服务器的基本配置步骤:
1.首先一定要安装以下两个软件包,否则m4,newaliaes,makemap命令都无法使用:
    #rpm  -ivh  sendmail-cf-8.13.8-2.el5.i386.rpm      (第二张光盘,默认未装)
   #rpm -ivh  sendmail-doc-8.13.8-2.el5.i386.rpm (第三张光盘,默认未装)
2.域名设置
   邮件服务器的正常工作需要在DNS服务器中进行相应的设置,对于主机域名为mail.1test.com的邮件服务器需要在1test.com域的主DNS服务器中进行设置:
     mail   IN   A   192.168.1.2
     @      IN   MX   5    mail.1test.com. 
3.设置local-host-names文件
   在sendmail服务器的配置目录下,local-host-names文件用于设置邮件服务器提供邮件服务的域名。例如,为了对1test.com域提供邮件服务,local-host-names
   文件中需要添加1test.com设置行。
    #vi /etc/mail/local-host-names
     1test.com      //添加邮件服务器提供邮件服务的域名
   在local-host-names文件中设置域名后,sendmail服务器将对文件中设置的域名提供邮件服务。
4.开启sendmail服务器的网络接口
   sendmail服务器出于安全考虑,默认只对lo回环网络接口(IP地址为127.0.0.1)提供服务,为了使服务器能够为主机的所有网络接口(地址为0.0.0.0)提供服务
   需要在sendmail.mc文件中进行配置的修改:
    #vi /etc/mail/sendmail.mc
    DAEMON_OPTIONS('Port=smtp,Addr=127.0.0.1,Name=MTA')dn1    //查找到此行,修改为:
    DAEMON_OPTIONS('Port=smtp,Addr=0.0.0.0,Name=MTA')dn1
   在sendmail.mc文件中进行以上修改后,sendmail服务器将监听主机所有网络接口的25端口。
5.sendmail服务器的用户管理
  (1)设置SMTP的用户认证
    邮件服务器提供发送邮件的功能是很正常的,但是如果为所有人都能够无条件地发送(投递)邮件是很危险的,非常容易造成大量垃圾邮件产生。因此在sendmail
    服务器中需要设置发送邮件的用户认证,当用户使用MUA软件通过SMTP向邮件服务器发送邮件时,邮件服务器会要求用户提供用户账号和口令进行身份认证,只有
    通过身份认证的用户才能通过邮件服务器向外部发送邮件。RHEL5系统中提供的sendmail服务器提供了SMTP的用户认证功能,但是默认的设置没有启用此功能,因
    此需要在sendmail.mc文件中进行相应的配置:
     #vi /etc/mail/sendmail.mc
      dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl  //查找到以下两行
      dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
     修改为:
         TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl  //去掉前面的注释字符串dnl
         define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl   //去掉前面的注释字符串dnl
      特别注意:以上两行去掉了前面的注释串dnl后,前面一定不能留有空格,否则在启动sendmail服务时会出错!
     在sendmail服务器中,使用了sasl的第二版sasl2作为SMTP的认证方式,在/usr/lib/sasl2/Sendmail.conf配置文件中设置了使用saslauthd服务程序提供用户认
     证服务,因此当sendmail服务器使用SMTP认证功能时,需要确保saslauthd服务程序正确运行:
     #cat  /usr/lib/sasl2/Sendmail.conf
      pwcheck_method:saslauthd
     #chkconfig  --level 35  saslauthd on
     #service saslauthd start       
  (2)用户账号
     sendmail服务器使用linux系统中的用户账号作为邮件账号,因此为用户添加邮件账号只需要添加linux用户账号即可。为了便于对邮件用户进行管理,需要先建
     立邮件用户组mailuser,新建立的邮件用户账号应属于该组账号。由于邮件账号通常不需要登录linux系统,因此在adduser命令中可以使用“-s”选项指定用户
     的shell为“/sbin/nologin”,即不允许用户登录linux系统。在建立邮件用户账号之后,需要使用passwd命令为用户设置口令,以便用户发送和收取邮件时进
     行身份认证。
         #groupadd mailuser       //建立邮件用户组mailuser;
         #adduser -g  mailuser -s  /sbin/nologin  name1    //创建邮件用户账号name1和name2;
         #adduser -g  mailuser -s  /sbin/nologin  name2
         #passwd name1           //设置邮件用户口令
         #passwd name2
  (3)设置邮件别名和邮件群发功能
     在sendmail服务器中使用aliases机制实现邮件别名和邮件群发功能,在“/etc”目录下同时存在名为aliases和aliases.db两个文件。aliases文件是文本文
     件,其内容是可阅读和可编辑的,aliases.db是数据库文件,是由aliases文件生成而来的。对“/etc/aliases”文件的内容进行修改后,需要执行newaliases
     命令,该命令根据aliases文件的内容重新生成aliases.db文件。只有对aliases.db文件进行了更新,aliases文件中新的别名设置在系统中才会生效,在aliases
     文件中每行作为一个别名设置记录,记录的格式如下:
        name: addr_1, addr_2, addr_3,...addr_N
     在aliases记录的格式中name表示虚拟邮件账号,addr_N表示真实邮件账号名,aliases记录可实现邮件别名和邮件群发功能。在RHEL5系统的“/etc/aliases”
     文件中已经默认设置了一些别名记录,其中大部分都是为root用户设置的别名。
     例1.为邮件用户name1设置别名admin的记录如下:
          #vi /etc/aliases
          admin: name1
          #newaliases
       sendmail服务器会根据设置的别名记录将发往admin用户的所有邮件转发到name1用户的邮箱中,即实现了为name1用户设置别名。
     例2.设置别名记录,将发往testgroup邮箱的所有邮件都转发到name1和name2用户的邮箱中,实现邮件的群发功能:
          #vi /etc/aliases
          testgroup: name1, name2
          #newaliases
       为了实现邮件群发功能,需要在别名记录中设置多个真实邮件账号的名称。
 
 
 
 
 6.访问控制的设置
    在sendmail服务器中使用access.db数据库进行基于主机地址的访问控制,默认开启了对邮件服务器本机用户的邮件投递,即在sendmail服务器所在主机中的用
    户可以任意发送邮件,而不需要进行任何身份认证。
         #vi /etc/mail/access
          localhost.localdomain    RELAY
          localhost                 RELAY
          127.0.0.1                 RELAY
    access.db数据库文件和SMTP认证功能配合使用,可以保证sendmail服务器具有较好的安全性。
 7.生成sendmail.cf文件
    在对sendmail.mc文件修改完成了所有的配置后,需要使用m4命令生成新的sendmail.cf配置文件:
         #cd /etc/mail
         #m4  sendmail.mc > sendmail.cf
    注意:m4命令一定要在/etc/mail目录下执行!
 8.重新启动sendmail服务器
    当完成对sendmail服务器的配置之后,需要使用sendmail脚本重新启动服务程序,使新的配置生效:
         #service  sendmail  restart
    使用netstat命令可以查询到sendmail服务程序已经对所有的网络接口的25端口进行了邮件服务的监听:
         #netstat -ntpl  | grep 25
    通过telnet邮件服务器的25端口可以验证邮件服务器的SMTP认证功能:
         #telnet  localhost  25
          .......
    ehlo  localhost  //登录到邮件服务器的25端口后,输入ehlo localhost命令会显示邮件服务器的状态信息;
    ........
    250-AUTH  DIGEST-MD5 CRAM-MD5 LOGIN  PLAIN   //如果在250-AUTH开始的行中出现了LOGIN PLAIN,则说明sendmail服务器中设置的SMTP认证功能生效。 
    通过telnet命令与SMTP服务交互通信的步骤,演示SMTP的工作过程:
     (1)客户机通过telnet命令与服务器的25端口建立一个TCP连接,连接成功后,服务器返回一个表示通信连接成功的220应答代码:
            #telnet  localhost  25
            220 localhost.localdomain ESMTP Sendmail 8.13.8/8.13.8;Sun, 5 0ct 2008 04:14:52 +0800
     (2)发送HELO,向服务器标识发件人的身份,若成功,则会收到表示邮件系统命令成功的250应答码:
            HELO localhost    //输入此语句
            250  localhost.localdomain Hello localhost.localdomain [127.0.0.1],pleased to meet you
     (3)使用MAIL FROM:命令给服务器传送发信人地址,传送成功后,收到250应答码:
            MAIL FROM: tjj@benet.com    //输入此语句
            250 2.1.0 tjj@benet.com......Sender ok
     (4)使用RCPT TO:命令传送收信人地址,可以传送多行收信人地址到服务器,服务器收到有效的收信人地址后,将返回250成功应答码:
            RCPT TO:root     //输入此语句
            250 2.1.5 root.....Recipient ok
     (5)向服务器发送DATA命令,准备开始传送邮件内容,服务器若返回354应答码,即表示已经准备接收邮件内容,可以在下一行开始输入邮件内容,并在最后一行,
        以只含一个圆点的行表示输入结束(即在新行中键入圆点字符,然后回车,将结束邮件内容的输入)。服务器接受输入后,返回250应答码,开始传送邮件:
            data           //输入此语句,准备开始传送邮件内容
            354 Enter mail ,end with "." on a line by itself
            I love your ,LINUX!    //此行开始输入邮件内容
            .              //结束行中只输入一个圆点表示将结束邮件内容的输入
            250 2.0.0 m94KG5YI029186 Message accepted for delivery  
     (6)使用QUIT命令退出通信过程,相应的用户将会收到该信件:
            QUIT      //表示退出通信过程
            221 2.0.0 localhost.localdomain closing connection
            Connection closed by foreign host.
邮局的基本配置步骤:
  在整个邮件系统中sendmail服务器实现了SMTP功能,因此只实现了邮件的发送功能,并不为MUA软件提供收取邮件的功能,收取邮件需要单独安装实现POP3或IMAP
  功能的服务器程序,可以使用dovecot服务器实现POP3功能。
 1.安装dovecot软件包
    由于安装dovecot服务器依赖的软件包较多,建议使用RHEL5系统的软件包管理程序来安装docecot软件包:#system-config-packages,或依次安装以下rpm包:
      #rpm  -ivh  perl-DBI-1.52-1.fc6.i386.rpm   (第二张光盘)
      #rpm -ivh   mysql-5.0.22-2.1.i386.rpm     (第二张光盘)
      #rpm -ivh  dovecot-1.0-1.2.rc15.el5.i386.rpm  (第二张光盘)
   若是RHEL4系统则需依次以下包:
          #rpm -ivh  perl-DBI-1.40.5.i386.rpm --aid    (第二张光盘)
          #rpm -ivh  perl-DBD-MySQL-2.9004.3-1.i386.rpm --aid  (第二张光盘)
          #rpm -ivh  mysql-4.1.7-4.RHEL4.1.i386.rpm   (第二张光盘)
          #rpm -ivh  postgresql-libs.7.4.6-1.RHEL4.2.i386.rpm  (第二张光盘)
          #rpm -ivh  dovecot-0.99.11-2.EL4.1.i386.rpm        (第四张光盘)
 2.设置dovecot服务器
     dovecot服务器的配置文件是/etc/dovecot.conf,dovecot服务器可以提供IMAP和POP3服务,但是默认只提供IMAP服务,因此需要在/etc/dovecot.conf配置
     文件中进行设置的修改:
       #vi /etc/dovecot.conf
       #protocols = imap imaps  //修改此行,去掉注释“#”;添加pop3,pop3s两项服务
       修改为:
       protocols = imap imaps pop3 pop3s
  3.启动dovecot服务程序,并设置启动状态
     对dovecot.conf配置文件进行设置后,需要重新启动dovecot服务程序,以便新的设置生效,而且dovecot服务程序安装后默认设置并不自动启动,所以需要使用
     chkconfig命令设置自动运行,以保障邮件服务器的正常运行:
       #service dovecot restart
       #chkconfig --level 35  dovecot on
       #netstat -ntpl | grep 110
 
 
17              ☆sendmail校验
看sendmail是否启动:
     #netstat -nutlp | grep :25
确定sendmail没有在启动的时候出现错误,/var/log/maillog中。检查此文件中的最后出现"starting"的地方以确保sendmail在启动的时候没有任何错误。
sendmail可执行文件位于/usr/sbin/sendmail,为了确定sendmail是否正确标识您的主机名称,通过命令行开关开启其调试模式并且设定为0:
[root@panda mail]# sendmail -d0 < /dev/null
Version 8.13.1
 Compiled with: DNSMAP HESIOD HES_GETMAILHOST LDAPMAP LOG MAP_REGEX
                MATCHGECOS MILTER MIME7TO8 MIME8TO7 NAMED_BIND NETINET NETINET6
                NETUNIX NEWDB NIS PIPELINING SASLv2 SCANF STARTTLS TCPWRAPPERS
                USERDB USE_LDAP_INIT
============ SYSTEM IDENTITY (after readcf) ============
      (short domain name) $w = panda
  (canonical domain name) $j = panda.panda.com
         (subdomain name) $m = panda.com
              (node name) $k = panda
========================================================
Recipient names must be specified
如果sendmail返回您的主机名称为localhost,您可能错误配置了/etc/hosts文件。检查您的/etc/hosts文件,删除所有的但记住留下localhost的指向。
    127.0.0.1   panda.panda.com   panda   localhost
如果/etc/hosts文件是正确的,那么检查一下在/etc/sysconfig/network中的HOSTNAME的定义。
试图向 root@panda发送简单的邮件。您可以看到一个合理的您的主机的转发服务器的SMTP交换。
    echo "hello root" | mail -v -s hello root@panda
[root@panda ~]# echo "hello root" | mail -v -s hello root@panda
root@panda... Connecting to [127.0.0.1] via relay...
220 panda.panda.com ESMTP Sendmail 8.13.1/8.13.1; Thu, 27 Jul 2006 08:46:11 +0800
>>> EHLO panda.panda.com
250-panda.panda.com Hello panda.panda.com [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH DIGEST-MD5 CRAM-MD5
250-DELIVERBY
250 HELP
250 2.1.0 < root@panda.panda.com>... Sender ok
>>> RCPT To:< root@panda.panda.com>
>>> DATA
250 2.1.5 < root@panda.panda.com>... Recipient ok
354 Enter mail, end with "." on a line by itself
>>> .
250 2.0.0 k6R0kBQO005444 Message accepted for delivery
root@panda... Sent (k6R0kBQO005444 Message accepted for delivery)
Closing connection to [127.0.0.1]
>>> QUIT
221 2.0.0 panda.panda.com closing connection
You have mail in /var/spool/mail/root
如果SMTP交换向上面一样正确,那么消息将被转发到您的工作站上的本地的转发服务器上,并且mailq -Ac将会报告一个空的对列。接下来检查mail(不使用参数)来检查一下消息是否从本地的转发到server1。这样对列也应该是空的。
[root@panda public_html]# mailq -Ac
/var/spool/clientmqueue is empty
                Total requests: 0
您的消息是不是在/var/log/maillog中正确的记录呢?在下面的步骤中,监视文件/var/log/maillog。下面的命令将会十分的有用:
#xterm -e tail -f /var/log/maillog &
18              ☆sendmail收取邮件
为了安全的原因,sendmail和postfix的缺省的配置允许发邮件但是不允许从网络上接收邮件(缺省的它们只接受从回环接口上的连接)。
确保在Server上的sendmail.mc文件中的DAEMON_OPTIONS被注释并且重新编译sendmail.cf文件使得能构接受来自其他主机的电子邮件。
修改 /etc/mail/sendmail.mc
使用dnl注释在下面的行之前,就象这样:
dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')
先将您的sendmail.cf文件做一个备份:
cp /etc/mail/sendmail.cf /etc/mail/sendmail.cf.bak
在同一个目录下,编译sendmail.cf
m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
重新启动sendmail