☆邮件系统
电子邮件系统的工作原理
电子邮件系统的运作方式与其它的网络应用有着根本上的不同。在其它的绝大多数的网络应用中,网络协议直接负责将数据发送到目的地。而在电子邮件系统中,发送者并不等待发送工作完成,而是仅仅将要发送的内容发送出去。
电子邮件的协议标准是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协议。
☆SMTP协议
SMTP即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把Email寄到收件人的服务器上了。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。
☆POP3协议
POP3即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的协议。它是Internet电子邮件的第一个离线协议标准,POP3允许从服务器上把邮件存储到本地主机即自己的计算机上,同时删除保存在邮件服务器上的邮件。遵循POP3协议来接收电子邮件的服务器是POP3服务器。
☆IMAP4协议
IMAP4即Internet信息访问协议的第4个版本,是用于从本地服务器上访问电子邮件的协议,它是一个客户/服务器模型协议,用户的电子邮件由服务器负责接收保存,用户可以通过浏览信件头来决定是否要下载此信。用户也可以在服务器上创建或更改文件夹或邮箱,删除信件或检索信件的特定部分。
☆POP和IMAP差异
虽然POP和IMAP都是处理接收邮件的,但两者在机制上却有所不同。在用户访问电子邮件时,IMAP4需要持续访问服务器,POP3则是将信件保存在服务器上,当用户阅读信件时,所有内容都会被立即下载到用户的机器上。因此,可以把IMAP4看成是一个远程文件服务器,而把POP看成是一个存储转发服务器。就目前情况看,POP3的应用远比IMAP4广泛得多。
☆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目录下邮箱内容。
☆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
☆system-switch-mail
切换sendmail和postfix
☆sendmail
sendmail提供SMTP服务
☆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
☆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程序向某个地址这样发信:
$mail someone@somedomain.com
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
每一个小时传递队列中的文件
☆sendmail防火墙
iptables -I INPUT -p tcp --dport 25 -j ACCEPT
☆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 ;
☆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 (用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 -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。那么,你可以将其别名写成
user1: user2@server2.com.REDIRECT
以后当有人向这个地址发信的时候,你的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
user2@domain.com
......
这种技术可以让每个用户自己管理自己的邮件别名。但由于个人用户安全意识差,如果设置不当会有安全漏洞,不建议使用。
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。