当前位置:Linux教程 - Linux - 使用solaris自带的sendmail快速建立一个邮件服务器

使用solaris自带的sendmail快速建立一个邮件服务器

本文出自:http://www.chinaunix.net 作者:三少爷 整理:段誉
原文出自:http://www.chinaunix.net [Solaris]精华区
整理文档出自:http://www.wway.net/ay/docs/sendmail_toc.html


第一节、了解sendmail

sendmail的启动文档一般是/etc/init.d/sendmail,我们通过他可以清楚的了解sendmail 使用的几个文档。

# cd /etc/init.d/
# more sendmail
通过这个文档我可以清楚的看到几个相关文件:
/usr/lib/sendmail 实际运行的执行文件
/etc/mail/sendmail.cf 主配置文件
/var/spool/mqueue 邮件队列
/etc/default/sendmail 初始变量设置文件等等。
运行机制简单的说就是由/etc/init.d/sendmail启动/usr/lib/sendmail,/usr/lib/sendmail加载/etc/mail/sendmail.cf里面关于sendmail的设置。

#!/sbin/sh
#
# Copyright (c) 1992, 1995, 1997 - 2000 by Sun Microsystems, Inc.
# All rights reserved.
#
#ident ""@(#)sendmail 1.16 00/09/06 SMI""

ERRMSG1=''WARNING: /var/mail is NFS-mounted without setting actimeo=0,''
ERRMSG2=''this can cause mailbox locking and access problems.''

''start'')
if [ -f /usr/lib/sendmail -a -f /etc/mail/sendmail.cf ]; then
if [ ! -d /var/spool/mqueue ]; then
/usr/bin/mkdir -m 0750 /var/spool/mqueue
/usr/bin/chown root:bin /var/spool/mqueue
fi
MODE=""-bd""
if [ -f /etc/default/sendmail ]; then
. /etc/default/sendmail
fi

if [ -z ""$QUEUEINTERVAL"" ]; then
QUEUEINTERVAL=""15m""
fi
case $QUEUEINTERVAL in
*s | *m | *h | *d | *w) ;;
*) QUEUEINTERVAL=""15m"" ;;
esac
if [ $QUEUEINTERVAL -le 0 ]; then
QUEUEINTERVAL=""15m""
fi
/usr/lib/sendmail $MODE -q$QUEUEINTERVAL $OPTIONS &

for i in $ETRN_HOSTS; do
SERVER=``echo $i | /usr/bin/sed -e ''s/:.*$//''``
CLIENTS=``echo $i | /usr/bin/sed -n -e ''s/,/ /g''
-e ''/:/s/^.*://p''``
/usr/sbin/etrn $SERVER $CLIENTS >/dev/null 2>&1 &
done
fi

if /usr/bin/nawk ''BEGIN{s = 1}
$2 == ""/var/mail"" && $3 == ""nfs"" && $4 !~ /actimeo=0/ &&
$4 !~ /noac/{s = 0} END{exit s}'' /etc/mnttab; then

/usr/bin/logger -p mail.crit ""$ERRMSG1""
/usr/bin/logger -p mail.crit ""$ERRMSG2""
fi
;;

''stop'')
/usr/bin/pkill -x -u 0 sendmail
;;

*)
echo ""Usage: $0 { start | stop }""
exit 1
;;
esac
exit 0

第二节、sendmail.cf的配置
/etc/mail/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部分

sendmail.cf命令从每一行的第一格开始,#开头的表示注释,第一个字符表示指令,以下是每个指令的意义:
V 设定组态文件sendmail.cf的版本
M 指定一个MTA
D 定义宏x的值为values
命令D用来定义宏,然后该宏就可以被sendmail.cf文件中的其他配置命令和sendmail程序自身调用。宏的名字可以是任何单个的ASCII字符,以下是sendmail中所有的内部宏:
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 接收者宿主目录

R 重写lhs为rhs
地址重写是sendmail的核心部分,它的作用是分析来自邮件程序的电子邮件的地址,并将它们重写成邮件传输程序所需要的格式。
规则集是一组可以由数字引用的相关重写规则。Sn命令标志一个规则集的开始,其中n是这个规则集的编号,其范围从0~29。其中0~4号规则集是被sendmail直接调用的,它们的说明如下:
0 在规则集3之后调用,它将生成一个三元组:<传输程序,接收方主机,接 收用户名>
1 用于消息中所有发送者地址
2 用于消息中所有接收者地址
3 最大和最复杂的规则集,也是用于地址的第一个规则集,将地址转化成正规形式,即:[email protected]
4 用于消息中所有地址并将内部地址转换成外部地址形式
地址重写规则由命令R定义,其格式如下:

Rlhs rhs comment

lhs,rhs和comment这三个字段之间用tab隔开。重写规则将输入地址与lhs进行匹配,如果成功,就按照rhs进行重写。重写后的结果再次与lhs匹配,如果成功,就再次按照rhs进行重写,直到结果不再与rhs匹配。

S 开始一个规则集合
C 定义类别宏
F 文件定义类别
O 设定sendmail.cf选项
命令O给sendmail的选项赋值。赋给选项的值可以是字符,整数,布耳值或时间间隔值。每个选项都在sendmail中进行了定义。以下是sendmail中所有选项的含义和用法:
选项 用 法 解 释
A Afile 指定别名文件的名字
a aN 为@:@等待N分钟,然后重建别名文件
B Bc 定义空代替字符
c c 将邮件队列排队以等待邮件传输程序
D D 重建别名数据库
db db 以后台方式传输
di di 交互式传输
dq dq 在下一个队列运行时传输
ee ee 邮递错误信息,总是返回退出状态0
em em 邮回错误信息
ep ep 打印错误信息
eq eq 仅返回退出状态,无错误信息
ew ew 写回退出状态
f f 保持UNIX风格的From行
g gn 设置邮件传输程序默认的GroupID为n
H Hfile 定义SMTP帮助文件的名字
I I 使用BIND名字服务器来解析所用的名字
i i 忽略入局信息中的点
L Ln 设置日志级别为n
M Mxval 设置宏x的值为val
m m 同时发往自身
N Nnet 定义宿主网络名
o o 接受旧格式首部
Q Q 定义队列目录名
q qn 定义用于决定何时排队任务的因子n
r rt 设置用于超时的内部时间间隔t
S Sfile 定义统计日志文件名
s s 在试图传输前总是创建队列文件
T Tt 设置排队超时为t
u un 设置邮件传输程序默认的UserID为n
v v 以冗余方式运行
W Wpass 定义用于远程调试的口令
X X1 如果平均负载超过1则拒绝SMTP连接
x x1 如果平均负载超过1则排队邮件
Y Y 在不同的进程中传输每个排队邮件
y yn 每个接收者作业时间优先级差为n
Z Zn 每次运行时减少n个作业优先级
z zn 同前缀一起决定邮件优先级





H 定义标头
P 优先权设定
T 信任的用户
K 具有键值的数据库
E 重设环境变量
L 扩充负载的支持
第三节、sendmail别名

sendmail别名
别名是sendmail最重要的功能之一。它在aliases中定义。aliases文件的位置由sendmail.cf中的选项A指定,一般位于/etc/mail目录中。aliases是一个文本文件,其中每一行的格式如下:

alias:recipeint[,recipeint,...]

其中alias为邮件中地址的名字,recipient为邮件目的地址的名字。邮件目的地址名可以有很多,每个之间用逗号符隔开。下面介绍别名的几种主要用法:

保护登陆帐号

许多网络黑客进攻网络计算机的第一步是获取目标机上合法用户的帐号,而电子邮件帐号一般和登陆帐号相同,这就使黑客有机可乘。但是可以用别名来保护合法用户的帐号。如一位合法用户的登陆帐号为mmmmmn,而他的电子邮件帐号可以是tiaozao。只要在别名文件中加入“tiaozao:mmmmmn”就可以达到这一目的。

电子邮件转发

如果想要将发给mmmmmn用户的电子邮件自动转发给root用户,只需在别名文件中加入“mmmmmn:root”。又如用户mmmmmn离开这个单位。从安全角度上讲应该将他的用户帐号删除。但是由于他不可能马上将新的电子邮件帐号通知所有人,所以希望将他原来的电子邮件帐号保留一段时间。这只要在别名文件中加入“mmmmmn:新的电子邮件地址”。

邮件列表的实现

别名最重要的功能就是实现邮件列表。通过它可以实现填写一个接收者地址而将信发给许多人。例如在主机上设置一个邮件列表boycw,包括mmmmmn,bear,joy 和peng。只需在别名文件中加入:
boycw:mmmmmn,bear,joy,peng
owner_boycw:mmmmmn
当接收者是boycw时,信会自动发给mmmmmn,bear,joy和peng。当发送邮件给boycw时如果出错,将把错误信息发给mmmmmn。
第四节、access 的用法

对付垃圾邮件,以及进行权限控制。

关于access的用法在http://www.fanqiang.com/a6/b3/20010724/1000011015.html已经讲的很清楚了,我补充点如下:--好象8.10版以后的才能使用次功能,主要是增加了LHS 部分的变量内容。

新增的变量为:
Connect: connection information (${client_addr}, ${client_name})
From: sender
To: recipient

很容易理解,举例如下:
From:[email protected] REJECT
To:friend.domain RELAY
Connect:friend.domain OK
Connect:from.domain RELAY
From:[email protected] OK
From:another.dom REJECT