sendmail小结

发表于:2007-07-04来源:作者:点击数: 标签:
2005-04-09(sendmail小结) 一、邮件模型 MUA (message user agent) --从MTA取的信,或者通过POP,IMAP把信发到MTA上 MTA(message transfer agent) --监视MUA的请求 ,找出对方的MTA,把信传到对方MTA 服务器 ,或者把信收到邮件队列 MDA(message deliver a

2005-04-09(sendmail小结)
一、邮件模型
MUA  (message user agent)
 --从MTA取的信,或者通过POP,IMAP把信发到MTA上
MTA (message transfer agent)
 --监视MUA的请求 ,找出对方的MTA,把信传到对方MTA服务器,或者把信收到邮件队列
MDA (message deliver agent)
 ---把信最终投递到具体的用户

通常情况下  一封 邮件通过MUA把信传到MTA服务器 或者从MTA服务器把信取到本机 通过MTA传送给对方的MTA服务器的服务队列,通过MDA发给指定用户,


二、基础
1。smtp协议(simple mail transfer protocol)
明文传输
基于tcp服务的应用层
使用端口:25
基础使用方法:
telnet adf141.allyes.com 25
helo station1
mail from :abc@citiz.net
rcpt to :youlyy@163.com
data
it's test!
.
quit


2.sendmail 是使用smtp协议的邮件提交工具,承担mta和MDA的作用

后台进程:sendmail
脚本:/etc/init.d/sendmail
需要包:sendmail,(sendmail-doc,m4,)第三张  sendmail-cf(第二张)(rhel在第三张中)
 imap(在第二盘中)

3。logs记录在/var/log/mailog中

4。MDA把邮件根据用户名收到/var/spool/mail下,等用户阅读完信后,未被删除的邮件会自动转存到用户主目录下的mbox文件中。

5.开启调试模式
sendmail -d0 </del/null(  如果返回的主机名是localhost,检查主机名)

6。以检验模式发信
echo "abc" |mail -v -s test root@allyes.com

三、配置sendmail之sendmail.mc
1. 通常用m4生成 sendmail的配置文件sendmail.cf
默认做法是:
m4 /etc/mail/sendmail.mc >/etc/mail/sendmail.cf
做前   备份
每次修改配置需要重新启动服务。

2。关于sendmail.cf
 DNL 是注释作用
 


3。
常用语句

默认情况sendmail只监听本地连接
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')
实验时应该把他 禁掉否则无法收信
可以用netstat -lanp 监听所有,netstat -lnt监听 tcp端口


m4 /etc/mail/sendmail.mc >/etc/mail/sendmail.cf   指定sendmail.cf位置
define(`ALIAS_FILE', `/etc/aliases')dnl 定义aliases位置


FEATURE(`blacklist_recipients')dnl允许使用黑名单 查禁收件人
然后用户才可以用aclearcase/" target="_blank" >ccess文件 设定黑名单


FEATURE(`accept_unresolvable_domains')dnl
接受无法解析的域来的邮件


FEATURE(`promiscuous_relay')dnl
开启转发,默认是不允许的。


define(`confMAX_MESSAGE_SIZE',`15000000')dnl
限制最大发送字节

define(confMAX_HOP,30)
设置转发的地址不超过 30个

四、配置sendmail之access
写法:

  *举例*   *设定值(注意:不是一一对应,只是解释)*  *含义*
IP     61.152.241.137  OK     接收,即使被其他           拒绝

IP(子网) 61和61.152和61.152.241都可以  relay     允许relay

域名    allyes.com    reject     拒绝并显示错误

email地址  youyou@allyes.com   discard    安静的接收后取消

本地用户名 youyou@   xyz some other text   501是错误代码,后           面的文字是自定义           错误信息
     (如"501 no e-mail from this domain")


编辑完成/etc/mail/access后 需要在 /etc/mail目录下 make access.db

reject 时logs会抱    DSN: Service unavailable  服务器logs会抱 deny
而discard则 客户机上不报错     服务器会显示discard


五、配置sendmail之alias
在 /etc/aliases 这个档案中,您会发现没有“#”注解的每一行,开始都是一个名称,然後跟著一个“:”符号,然後在其右边又有其它的名称。其工作原理是:当 sendmail 收到一个本地邮件的时候,会检查这个 /etc/aliase 档案,如果发现“:”左边的名字跟接收者名称吻合,就会将邮件转递给“:”右边的名称。在右边的名称,可以多过一个;也可以是另一个邮件地址;也可以指向一个档案或程式。当邮件转给右边之後,又重新找一遍这个 /etc/alias 里面的设定,直到再找不到左边名称为止。例如下面这个例子:

MAILER-DAEMON:  postmaster
postmaster:     root
daemon:         root
root:          netman, kenny
kenny: "| sendmail kenny@other.mail.net"
sales: sales-list
sales-list: ":include:/etc/sales.list"

这样,凡是传给 MAILER-DAEMON 的就会转给 postmaster ,然後再转给 root,另外 daemon 也会转给 root,而 root 呢,又分别转给 netman 和 kenny,最後 natman 再也找不到名称了,直接送到 netman 的信箱去;而 kenny 呢?则通过 sendmail 转到 kenny@other.mail.net 那个地址去。另外,我们只需建立一个 /etc/sales.list 这样的档案,在里面写上所有 sales 的名称,可以全部为一行,用‘,’和一个空白键分隔;这样,所有 salse 都会收到寄给 sales 的邮件了。


六、配置sendmail之virtusertable
如同Apache一样,sendmail也允许使用虚拟主机功能,这是通过FEATURE(virtusertable)功能实现的,而虚拟主机的文件缺省是/etc/mail/virtusertable。这个文件的形式类似于aliases文件,即:左地址 右地址 ,中间用Tab键分开。还需要注意的是,虚拟域(左地址的域名),应该属于本机接收之列。

joe@yourdomain.com      jschmoe                         (1)
bogus@yourdomain.com    error:nouser No such user here  (2)
@testdomain.com         test@mydomain.com               (3)
@yourdomain.com         %1@othercompany.com             (4)

(1)    这样一行意味着本来应该发送给 joe@yourdomain.com 的邮件现在要发送给本机的 用户 jschmoe。
(2)    发向 bogus@yourdomain.com 的邮件,返回错误信息。
(3)    意味着所有发往 xxx@testdomain 的邮件都会被发送到 test@mydomain.com。
(4)    代表参数转义,例如 user1@yourdomain.com 的邮件被发送到user1@othercompany.com。

aliases 文件同样可以将本地用户,映射到其它地址,那么和 virtusertable 的优先级如何?[1]

   1. 当接收者邮件地址的域部分在 /etc/mail/local-host-names 中又在/etc/mail/virtusertable中时,优先检查virtusertable文件,应用该文件中的定义规则.
   2. 要应用virtusertable规则,则接收者邮件地址的域部分必须在 /etc/mail/local-host-names 文件中存在
   3. 若接收者邮件地址的域部分在 /etc/mail/local-host-names 文件中但不在 virtusertable 文件中有相应的定义则先只应用 aliases 中的定义去扩展别名,一旦扩展出的别名接收者邮件的域部分在 virtusertable 中有定义行时则决不再别名下去,马上运行virtusertable中的定义规则。


七、配置sendmail之 /etc/sendmail.cw
(注意:假如您将 sendmail 升级到 8.10 版本以後,sendmail.cw 已经改用 local-host-names 了)


(作用:用来设定邮件伺服器别名的档案
修改 sendmail.cw 让 sendmail 接收不同 domain 的邮件了)

从您的 Linux 主机几出去的邮件,其回邮地址格式是这样的:user@host.your.domain.name 呢?如果您按 Repply 回复到这个地址,应该没问题的,但您有试过使用 user@your.domain.name 这样的格式吗?试试就知道了:如果您没做任何设定,这样的地址是寄不到使用者信箱的。

有办法解决吗?当然有啦,而且很简单呢!您只要将 your.domain.name 放进 /etc/sendmail.cw这个档案就可以了,这是用来设定邮件伺服器别名的档案。如果您有多个别名(或曰 domain )要这台主机接收,那麽将它们全部写进这个档案,一个名称占一行。然後,您竟然无需重新启动 sendmail 或任何服务,设定就已经生效了!


八、sendmail修改配置后需要注意的
A。修改配置  m4 /etc/mail/sendmail.mc>sendmail.cf  需要重新启动服务
B。修改配置 /etc/access  需要make access.db 重新构建数据库
C。修改配置 /etc/alias        需要newalias  更新别名


九、接收邮件(pop3和IMAP)
pop3(post office protocol)是明文传输

直接telnet端口 pop3是110 imap 是143
命令如下:
telnet 61.152.241.141 110
user aaron_you
pass abc
list
retr 1
dele 1
quit

imap (internet message access protocol)和pop3相比 支持在下载邮件前 先下载邮件头预览。

开启服务方法
修改/etc/xinetd.d/pop3和imap 中yes 改no


2005-04-19 调试出错logs
这个是系统root的信,
This is a MIME-encapsulated message

--j378wHE8009941.1112864297/localhost.localdomain

The original message was received at Thu, 7 Apr 2005 16:58:17 +0800
from localhost.localdomain [127.0.0.1]

   ----- The following addresses had permanent fatal errors -----
<aaron@you.com>

   ----- Transcript of session follows -----
550 5.1.2 <aaron@you.com>... Host unknown (Name server: 192.168.0.253.you.com.: host not found)


在maillogs里
Apr  7 16:54:20 localhost sendmail[9893]: j378ZWkx009800: to=<aaron@you.com>, ctladdr=<root@localhost.localdoma
in> (0/0), delay=00:18:28, xdelay=00:00:00, mailer=esmtp, pri=210324, relay=192.168.0.253.you.com., dsn=5.1.2,
stat=Host unknown (Name server: 192.168.0.253.you.com.: host not found)


hostname没有修改

以后测试 需要先
sendmail -d0 </dev/dull

实验:sendmail

1。如果主机名没有配的话 用telnet时,会报relay deny
所以千万记得配主机名
2。如果邮件服务器没有把127.0.0.0这句默认只监听本机的sendmail.mc注释掉
那么是没有其他机器是没有办法telnet近来的。
同时对于做测试的 发邮件的客户机器,如果没有把这句注释掉,结果是telnet成功
但是用echo hello |mail -s -v aaa@aaa.com 发信 始终保持在队列里,无法发出
必须注释掉,才可以,原因不详。
3。telnet 25端口   和   用 echo hello |mail -s -v aaa@aaa.com
都可以发信,但是区别在于前者不需要mx记录,是直接发信。
后者需要解析本域的MX记录

原文转自:http://www.ltesting.net