邮件系统原理及sendmail示例

邮件服务器

网易 coremail    

 

开源
sendmail postfix          qmail     

 


MUA mail user agent     邮件用户代理 用于客户端发送邮件和阅读邮件


MTA mail  tranfer agent 邮件传输代理    服务端软件,相当于是一个邮局,接收MUA发送过来的邮件,如果不是本地邮件,则发送给下一个MTA。

MDA  mail delivery agent    邮件投递代理   将MTA所接收到的邮件,依照邮件的目的地将此邮件放到本机账号


       SMTP 允许中继
  MTA 网易----------  MTA 新浪
     |      |  MDA
     |       |
     |SMTP     |  POP3
     |      |
  [email protected]  [email protected]


邮件协议:
发信:

SMTP     simple  mail transfer  protocol  简单邮件传输协议    端口号  TCP 25

sendmail


收信:
POP3   post office protocol  邮局协议  ,连接到MTA,读取或者下载邮件. 端口号  110
   
IMAP    internet message access protocal 网络报文访问协议  能在下载邮件前先下载邮件头信息,以供用户选择性的下载      端口号    143

dovecot 鸽舍


软件包

sendmail.i386                      --邮件server端      
sendmail-cf.i386                   --配置文件包
sendmail-devel.i386                --开发包    
sendmail-doc.i386                  --文档包  
m4.i386       --处理配置文件

  yum install sendmail*
  yum install m4


配置文件

/etc/mail/sendmail.cf  --sendmail邮件服务启动时读取的主配置文件
/etc/mail/sendmail.mc  --修改配置一般修改这个配置文件,如果有安装M4包的话,会自动把修改处理到sendmail.cf;如果没有安装m4包,就要手动处理
/etc/mail/local-host-names --支持短域名
/etc/mail/virtusertable  --虚拟用户列表
/etc/mail/access  --邮件中继
/etc/aliases   --用户别名


[root@36 ~]# /etc/init.d/sendmail restart


[root@36 ~]# netstat -ntlup |grep 25
tcp        0      0 127.0.0.1:25                 0.0.0.0:*                   LISTEN      6301/sendmail: acce
--上面看到只监听本地,所以现在只能自己发信给自己

 

--发送邮件方法一
[root@36 ~]# mail -s 'hello' [email protected]  --s参数是定义主题
1111111111111111  --邮件正文
.    --点号表示结束
Cc:     --抄送,这里我直接回车表示结束


[root@li ~]# mail a  --也是调用mail命令
Subject: hello a
i am root
.
Cc: b

 

查看邮件
cat /var/spool/mail/root
cat /var/mail/root


[root@36 ~]# mail -s 'hello2' [email protected] < /etc/fstab
--把/etc/fstab的内容做为邮件的正文来发

 

发邮件方法二:
[root@li ~]# telnet 127.0.0.1 25 --对25端口也就是smtp协议进行验证
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 li.cluster.com ESMTP Sendmail 8.13.8/8.13.8; Fri, 3 Sep 2010 10:31:00 +0800
helo li.cluster.com --介绍自己,用help命令查看支持的命令集,help helo查看helo的用法
250 li.cluster.com Hello localhost.localdomain [127.0.0.1], pleased to meet you
mail from:[email protected] --定义发送者,在这里随便定义
250 2.1.0 [email protected]... Sender ok
rcpt to:[email protected] --定义接收者,在这里是本机的root用户
250 2.1.5 [email protected]... Recipient ok
data  --表示后面写的是邮件内容
354 Enter mail, end with "." on a line by itself
test mail  from   qq.com            --邮件正文
.   --点号表示内容结束
250 2.0.0 o832V0tl004576 Message accepted for delivery
quit   --quit退出
221 2.0.0 li.cluster.com closing connection

 


发邮件方法三:

mutt  一个linux下的文本的MUA工具

yum install mutt -y

[root@36 ~]# mutt [email protected]   --使用root用户给user1用户发送邮件,并且有发送附件等功能


su - user1
mutt去查看

 

发送邮件方法四:
[root@36 ~]# cat /etc/rc.local | sendmail -v [email protected]

--邮件报警脚本,就可以按下面的方式来发送(nagios就是用类似下面的命令)
# printf "***** test ******\n\n姓名:张 三\n性别:男\n年龄:25\n职业:IT\n"  |mail -s "haha" mail2


发送邮件方法五:
 安装别的软件,进行软件收发

 

====================================================================
邮件发送也需要DNS的支持,并且,DNS要配置邮件交换记录

 

linux客户端  DNS服务器 sendmail服务器+dovecot服务器
2.2.2.35----------2.2.2.35--------2.2.2.244
      |  
      | 
      | 
   客户端  windows xp
   2.2.2.245

 

前期准备:
1,主机名和IP
2,时间同步
3,关闭iptables,selinux
4, 配置好yum

 

先在244上把主机名和域定义好

#hostname mail.cluster.com
#vim /etc/hosts
2.2.2.244 mail.cluster.com
#vim /etc/sysconfig/network
HOSTNAME=mail.cluster.com

 


下面在2.2.2.35上做DNS

[root@li ~]# vim /var/named/chroot/etc/named.conf

options {
        directory "/var/named";
};

zone "cluster.com" IN {
        type master;
        file "data/master.cluster.com.zone";
};


[root@li ~]# vim /var/named/chroot/var/named/data/master.cluster.com.zone

$TTL 86400
@       IN      SOA     li.cluster.com. root.   (
                        2011072601
                        60
                        30
                        3600
                        86400 )
        IN      NS      li.cluster.com.
        IN      MX 0    li.cluster.com. --加上这一句,MX是邮件交换记录,0代表优先级别,0-20,0代表优先级最高
mail      IN      A      2.2.2.244 --这里指向的244为sendmail服务器的IP


/etc/init.d/named    restart

 


再在xp2.2.2.187上把DNS指向35,然后进行验证
--下面的验证是linux上做的,但是在XP的cmd命令行模式也是一样的命令来验证

[root@li ~]# nslookup mail.cluster.com --验证域名OK
Server:         2.2.2.35
Address:        2.2.2.35#53

Name:   mail.cluster.com
Address: 2.2.2.244


[root@li ~]# nslookup   --验证邮件交换记录
> set type=mx
> cluster.com   --这里写域,不是域名
Server:           2.2.2.35
Address:          2.2.2.35#53

web.com mail exchanger = 0 mail.cluster.com
>


安装图形邮件客户端,这里使用claws-mail
[root@li ~]# ls /share/soft/soft/mail_client/
claws-mail-3.5.0.tar.gz                libetpan-0.57.tar.gz


tar xvf libetpan-0.57.tar.gz -C /usr/src/ --IMAP4和NNTP支持,要先装这个包才能编译claws-mail
tar xvf claws-mail-3.5.0.tar.gz -C /usr/src/


cd /usr/src/libetpan-0.57/
./configure ;make ;make install

 cd /usr/src/claws-mail-3.5.0/
./configure && make && make install

--安装完成后,使用claws-mail &命令来打开,如果报找不到libetpan.so.13这个库文件,则使用下面的命令做一个软链接

# ln -s /usr/local/lib/libetpan.so.13 /lib/libetpan.so.13

# ldconfig  --5.7版要用这个命令后,才能使用


或者你要用thunderbird

# tar xf /share/soft/thunderbird-3.0b2.tar.bz2 -C /usr/src/
# cd /usr/src/thunderbird/

# ./thunderbird  --直接使用这个命令去打开

 

=================================================

 


例一:修改sendmail配置,让其监听所有


# vim /etc/mail/sendmail.mc


DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl

# /etc/init.d/sendmail restart


# netstat -ntlup |grep 25
tcp        0      0 0.0.0.0:25                  0.0.0.0:*                   LISTEN      4274/sendmail: acce


# netstat -ntl |grep 25 --发现监听所有端口了
tcp        0      0 0.0.0.0:25                  0.0.0.0:*                   LISTEN     


然后使用linux客户端对服务器的用户进行发邮件测试
# telnet 2.2.2.244 25 --去发一封邮件,测试,是可以收到的

# mail -s "2222" [email protected]  --可以收到


=====================================================


例二:
使用outlook或claws-mail收发邮件


发送一份邮件给本机用户,点收信时会报连接到mail.cluster.com:110失败

因为还没有配置pop3,imap服务器

--现在的情况上sendmail 配置OK了,两边可以互发,邮件可以在sendmail服务器上查看到,但是两边客户端不能下载下来


--在244邮件服务器上安装
# yum install dovecot -y --安装此软件包


vim /etc/dovecot.conf  --主配置文件

 protocols = imap imaps pop3 pop3s --打开这一行

 /etc/init.d/dovecot restart


# /etc/init.d/dovecot restart


# netstat -ntlup |grep 110 --pop3
tcp        0      0 :::110                      :::*                        LISTEN      4363/dovecot       
# netstat -ntlup |grep 143 --imap
tcp        0      0 :::143                      :::*                        LISTEN      4363/dovecot

 

--再来进行测试,发现使用邮件客户端收邮件也OK

 

我这里用了二个账号,注意这两个用户都是在sendmail服务器上的,与客户端有没有此用户无关
[email protected] --用来登录35这个客户端的claws-mail软件
[email protected]  --用来登录245这个客户端的outlook软件


在claws-mail这个软件上的账号编辑要注意不要写错


主要注意的不要乱写的地方

mail address :  [email protected]

server for receiving : mail.cluster.com
smtp server (send) : mail.cluster.com  

User ID :   zhangsan      Password:  *** --密码为zhangsan用户的系统密码


outlook的配置省略


实现zhangsan和lisi用户的互发

 


============================================================


实现短域名互发

# vim /etc/mail/local-host-names
mail.cluster.com
cluster.com


# vim /etc/mail/sendmail.mc    --如果是rhel5.5版本,做了上面那步还不行的话,尝试还把下面一句改为自己的域

155 LOCAL_DOMAIN(`cluster.com')dnl


# /etc/init.d/sendmail restart

 

还要把244(也就是sendmail服务器)的DNS指向为35这台DNS服务器

# vim /etc/resolv.conf
search cluster.com
nameserver 2.2.2.35

 

===========================================================


例四;邮件别名,邮件转发,邮件群发

vim /etc/aliases

a:      b --发给a用户的邮件,转发给b用户了,a用户自己不收的
c:      d,e --发给c用户的邮件,转发给d和e用户了,c用户自己不收的
it:     :include:/etc/mail/it --发给it用户(这个it用户在系统上可以不存在)的邮件会群发给/etc/mail/it这个文件里的所有用户


vim /etc/mail/it --定义的文件不存在,要手动建立,并写上群发的用户名,一行写一个
a  --这个比较特殊,因为发给it的会群发给a用户,但因为a用户上面配置了转发给b用户,所以a用户还是收不到的,还是由b用户收到了

 

/etc/init.d/sendmail   restart


====================================

 

例五:邮件的虚拟账号,虚拟用户表格,虚拟域  --后面的postfix课程里会使用一台邮件服务器配置多个虚拟域 


一般来说账号分为本地用户账号(系统用户)和虚拟用户账号(一般放在数据库里)


为什么需要虚拟账号? 
 以前一台邮件服务器只能用来配置一个域;那么如果企业有多个域,或者是服务商要管理多个域,那么这样就需要多台服务器,成本高。所以就产生了虚拟账号和虚拟域等概念

 

==================================

 

邮件中继
 中继就是让你的MTA能够把邮件发送到外面的网络
默认情况下,只允许本机把邮件发送到外面的网络,拒绝别的机器登录过来的用户发送外部邮件(防止被利用做为垃圾邮件中转站)


--在sendmail邮件服务器本机上telnet发外部邮件
[root@mail ~]# telnet 2.2.2.244 25
Trying 2.2.2.244...
Connected to mail.cluster.com (2.2.2.244).
Escape character is '^]'.
220 mail.cluster.com ESMTP Sendmail 8.13.8/8.13.8; Tue, 26 Jul 2011 16:02:29 +0800
mail from:[email protected]
250 2.1.0 [email protected]... Sender ok
rcpt to:[email protected]  --指定一个外部邮箱
250 2.1.5 [email protected]... Recipient ok (will queue)  --这里为OK,表示允许本机发外部邮件

 

--在linux客户端35上通过sendmail服务器发送外部邮件
[root@li ~]# telnet 2.2.2.244 25
Trying 2.2.2.244...
Connected to mail.cluster.com (2.2.2.244).
Escape character is '^]'.
220 mail.cluster.com ESMTP Sendmail 8.13.8/8.13.8; Tue, 26 Jul 2011 16:04:04 +0800
mail from:[email protected]
250 2.1.0 [email protected]... Sender ok
rcpt to:[email protected] ... Relaying denied. IP name possibly forged [2.2.2.35] --报中继拒绝

 

--解决方法:
# vim /etc/mail/access
Connect:2.2.2                       RELAY   --表示允许2.2.2网段的发送外部邮件


/etc/mail/access的一些写法
FROM:sina.com  REJECT  --拒绝从@sina.com来的邮件
TO:gmail.com  discard  --发往@gmail.com的丢弃
Connect:10.1.1.160           OK  --非常信任的主机可以用OK


--reject拒绝并返回错误信息,discard直接丢弃


=============================================================


 实现   两个不同域的短域名互发

1,两个域要能互相解析,并且要有MX记录,互相做转发,能够解析对方
2,两个服务器都/etc/mail/local-host-names 写上自己的主机名和域名
3, 允许中继
4, 重启服务


============================================================

 

squirrelmail --基于php的webmail程序

一个简单的webmail安装测试

--在邮件服务器上做下面操作
# yum install httpd* php php-devel squirrelmail   -y

# vim /etc/squirrelmail/config.php
$provider_uri     = 'http://mail.cluster.com/';

# /etc/init.d/httpd restart


然后通过firefox  使用http://mail.cluster.com/webmail进行登录界面
 使用用户名:lisi
 密码  :******
登录后和zhangsan进行邮件互发


=========================================================


smtp  验证  
 假设一个用户要公司是可以自由收发邮件,但如果在家里,或者笔记本用户,IP经常会变动,那这种情况,/etc/mail/access的规则就显得死板


 使用smtp验证,只要提供正确的账号和密码,就不受/etc/mail/access的规则限制


smtp协议不带验证,需要第三方工具来实现验证


# yum install cyrus-sasl* --安装验证有关的软件包
   
  simple authention and security layer 


vim /etc/mail/sendmail.mc

把下面三行的注释打开,并且注意要顶格
 
 搜索MD5关键字

TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

 搜索submission关键字

DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea')dnl


把下面这句
 DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea')dnl
改为
 DAEMON_OPTIONS(`Port=25, Name=MSA, M=Ea')dnl 


然后还要
DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl --把这名注释掉,注意注释时用dnl ,不用#


--表示强制使用smtp验证

 

[root@li ~]# /etc/init.d/sendmail restart
[root@li ~]# /etc/init.d/dovecot restart
[root@li ~]# /etc/init.d/saslauthd restart


======================================

 

用claws-mail验证


点设置-目前账号的偏好设置-发送-把SMPT授权打勾-授权方式选plain-用户ID写本机的一个普通用户名和密码就OK

 

outlook验证设置

点工具-账号-对应用户的属性-服务器-我的服务器要求身份验证

 


==================================


NTP   network time protocol  网络时间协议

 

rdate 内网同步,做起来速度快
ntp  可同步外网专有的时间同步服务,并且机制更复杂


man ntpd

 

时区的概念:
 GMT (格林威治时间 ,以经度为0的英国城市命名)
 UTC (coordinated universal time,协和标准时间,利用物理时钟(原子钟)为基准定义出来的时间)
 
 主板的bios是属于UTC时间,利用主机的原子钟来计算时间,会有少许误差,但对于长时间动作并对时间准确性要求高的环境是不允许有这样的误差

ssh 10.1.1.218 date;date   --这样去比较两台电脑的时间差(先要配ssh等效性)
 15 15:26:36 CST 2010
 15 15:26:45 CST 2010   --时间差有9秒,这在集群环境里是不容许的

[root@li b]# file /etc/localtime  
/etc/localtime: timezone data --这是一个时区文件,不是ASCII类型,所以vi是看不了的,对应了/usr/share/zoneinfo/Asia/Shanghai这个文件(因为装系统时选的是上海时区)
 
 ls /usr/share/zoneinfo/     --这里保存了系统开机时所选的所有的时区文件

 

--使用md5验证,这两个文件是一致的
[root@li ~]# md5sum /usr/share/zoneinfo/Asia/Shanghai
7f2ed1adc71a3a0f4ebcfed2fcca92d5  /usr/share/zoneinfo/Asia/Shanghai
[root@li ~]# md5sum /etc/localtime
7f2ed1adc71a3a0f4ebcfed2fcca92d5  /etc/localtime

 

 

如果服务迁移到了另一个时区的地段,或者是迁移到另一个国家,系统如果没有重做,而且是用于集群环境,那么
第一步:/usr/share/zoneinfo/里对应的时区给拷到/etc/localtime,就换了时区了
第二步:vim /etc/sysconfig/clock去修改对应的新时区

 

同步的过程: (与tcp三次握手相似)
 1,client  发送信息到 server
 2,ntp server 发送回信息到 client
 3,client  根据回送信息修改时间


时间同步服务的阶层概念:
  可以把同步服务分层,(最多15个阶层)
  层与层会有时间误差,网络延迟的计算


# ls /usr/share/doc/ntp-4.2.2p1/
--ntp有关的文档文件路径

 

[root@li b]# cat /etc/ntp.conf |grep -v ^# |grep -v ^$


restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict -6 ::1
server 10.1.1.1 perfer  --指定上层的时间同步服务器为10.1.1.1,perfer表示优先
server 10.1.1.2
driftfile /var/lib/ntp/drift --记录本机与上层时间服务的频率误差
keys /etc/ntp/keys
server 127.127.1.0  --如果上层服务器不能连通,则以主板的BIOS(UTC)为准
fudge   127.127.1.0 stratum 10 --主板时间的层级为10

 ignore   拒绝所有ntp连接
 nomodify 不能改
 noquery 不能query
 notrap  trap是一个远端事件
 nopeer  不能peer
不加任何参数就代表都不限制


服务端的配置一(以本服务器为第一层):
1,把第一句的default改为127.0.0.1
2,把第三句restrict 127.0.0.1给注释掉,保存退出
3,重启服务

客户端的难证:
ntpdate   10.1.1.35   --大概五分钟后,才能同步,注意(客户端不能启动ntp服务)


服务端的配置二(以10.1.1.1为上层时间同步服务器);
1,先把上面修改的还原
2,加上下面两句,并保存退出
server 10.1.1.1
restrict 10.1.1.0 netmask 255.255.255.0  nomodify notrap
3,重启服务 --会监听udp的123端口


时间的分类:   软件时间,硬件时间(BIOS) 

 hwclock - query and set the hardware clock (RTC)

 hwclock    -r   读出bios的时间
 hwclock    -w   把系统时间写入bios

 所以可以在ntpdate同步时间之后,用hwclock命令写入到bios,让主板时间与系统时间保持一致


 

你可能感兴趣的:(代理,用户,服务端,网易,邮件系统)