Mail邮件服务


10000@qq.com


smtp服务器的IP <---

pop3服务器IP



部署一个合法的能够接受和发送互联网邮件的服务器,必须具备以下条件:

1、购买一个合法的域名

2、域名要设定MX记录,解析到邮件服务器的IP

3、邮件服务器的IP必须是公网的IP



一、准备操作

作为邮件服务器的(MTA)必须是静态IP,FQDN主机名,并且绑定到/etc/hosts

如果存在DNS服务器的话,为邮件服务器所使用的域名添加MX记录并且解析到邮件服务器的IP


DNS服务器的IP: 172.16.2.7

邮件服务器的IP: 172.16.2.7

主机名: node5.sex.com


# vim /etc/hosts

172.16.2.7      node5.sex.com   node5




# vim /var/named/chroot/var/named/data/master.sex.com.zone

....

@       IN      NS      node5.sex.com.

@       IN      MX 0    node5.sex.com. <---添加邮件记录

node5   IN      A       172.16.2.7

....

添加MX记录是为了能够让别的邮件服务器能够把所有发送到??@sex.com的邮件发到MX记录指向的服务器


# service named reload


验证MX的记录是否生效

# nslookup

> set type=MX

> sex.com

Server:172.16.2.7

Address:172.16.2.7#53


sex.commail exchanger = 0 node5.sex.com.




二、部署smtp服务器(MTA)


Linux常用的邮件服务软件:

sendmail <---元老级,rhel6默认不是用它

postfix <--- rhel6默认使用它


# rm -rf /etc/postfix


1、安装


# yum reinstall postfix -y



2、设定本机使用的MTA是postfix而不是sendmail


# alternatives --config mta


共有 2 个程序提供“mta”。


 选择    命令

-----------------------------------------------

*  1           /usr/sbin/sendmail.sendmail

+ 2           /usr/sbin/sendmail.postfix <---保证是postfix


按 Enter 来保存当前选择[+],或键入选择号码:2


如果原本是sendmail,就必须保证马上停止sendmail服务,而且设定为开机不启动

# service sendmail stop

# chkconfig sendmail off


# chkconfig postfix on <---理论上应该设定为开机启动



3、配置postfix

# cp /etc/postfix/main.cf /etc/postfix/main.cf.default

# vim /etc/postfix/main.cf


...

myhostname = node5.sex.com

mydomain = sex.com

myorigin = $mydomain<--- 能够让服务知道什么邮件地址是属于本机管理

inet_interfaces = all<--- 把localhost修改成all,服务启动的时候在哪些接口进行监听

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

定义什么的邮件后缀是本机可以接受并且保存起来的。

如果邮件服务器接受到的邮件收件人是  ??@node5.sex.com 或者 ??@localhost.sex.com 或者 ??@localhost 或者 ??@sex.com 就会保存起来


mynetworks = 127.0.0.0/8, 172.16.0.0/16, 10.1.1.0/24



# service postfix restart


# lsof -i:25

COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

master  3181 root   12u  IPv4  15781      0t0  TCP *:smtp (LISTEN)

master  3181 root   13u  IPv6  15783      0t0  TCP *:smtp (LISTEN)



# iptables -F

# setenforce 0



使用最原始的命令是了解和测试邮件服务器的工作过程:

# telnet 127.0.0.1 25

Trying 127.0.0.1...

Connected to 127.0.0.1.

Escape character is '^]'.

220 node5.sex.com ESMTP Postfix

helo node5 <---打招呼。

250 node5.sex.com

mail from: root@sex.com  发件人

250 2.1.0 Ok

rcpt to: tom@sex.com 收件人 <--- 如果收件人是其域的,必须保证能够解析该域名的MX记录

250 2.1.5 Ok

data <---编辑邮件内容

354 End data with <CR><LF>.<CR><LF>

can you see me?  <---具体的邮件内容

.<---新的一行 以. 开头代表邮件编辑完毕

250 2.0.0 Ok: queued as 0F000661

quit<--退出

221 2.0.0 Bye



查看tom的邮件文件

# cat /var/mail/tom



使用专用的命令发送邮件:收件人是互联网的合法的邮箱地址

前提:

保证smtp服务器可以上网

DNS指向自己配置的DNS服务器(可以解析自己配置sex.com),并且自己配置的DNS服务器也必须要能够解析外网的域名(配置转发)

可选: postfix的DNS直接指向8.8.8.8


# mail -s "test mail title" tom@sex.com < /etc/fstab

# cat /etc/hosts | mail -s "test mail2" tom@node5.sex.com

# echo "can you see me? 139.com" | mail -s "test mail" l.t.b@126.com




验证邮件是否成功送出去,或者是否被退信了

# mailq

-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------

2669F661        347 Sat Apr 20 08:01:11  10000@qq.com

(host mx2.mail.139.com[113.108.212.78] said: 450 2eec51724d3e7ad-35999 Mail rejected, please try again (in reply to end of DATA command))

                                        tanpao@139.com <--被退信(拒绝)




# vim /var/log/maillog





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


设定本地的群发帐号

只要it@sex.com 都是被tom@sex.com 和 mary@sex.com 收到

# vim /etc/aliases

...

it: tom,mary

...

# postalias /etc/aliases

# service postfix restart


测试

# mail -s "groupmail" it@sex.com < /etc/fstab



给本定邮件服务器绑定其他域名,让其可以接受其他域名的邮件

当我们邮件服务器接受到收件人为 ??@6nei.com的邮件的时候,会认为这是本邮件 锁管理的帐号,然后把邮件保存到本地对应的用户邮箱中



# vim /etc/postfix/main.cf

。。。

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, 6nei.com <---增加6nei.com


# service postfix restart


测试

# mail -s "gggggggg" tom@6nei.com < /etc/inittab





例子:两个同学之间配置的邮件服务器相互接受和发送邮件


同学A配置的邮件服务器IP: 172.16.2.7 ,域名: @sex.com

同学B配置的邮件服务器IP: 172.16.2.111 , 域名:@panda.com


A服务器接受到用户root@sex.com发送到wewe@panda.com:

邮件会通过MUA发送到A邮件服务器,然后A邮件服务器通过对panda.com域名的MX记录的解析之后,把邮件发送到B邮件服务器,然后B邮件服务器接受到邮件之后,发现收件人??@panda.com,这个B邮件服务器本身所管理域名,所以把邮件保存到wewe的邮箱。


A邮件服务器所用的DNS服务器必须能够解析到panda.com,所以设定一个指定域名的转发:


A邮件服务器使用的DNS # vim /var/named/chroot/etc/named.conf

...

zone "panda.com" IN {

       type forward;

       forwarders { 172.16.2.111; };

};


# service named restart


# nslookup

> set type=MX

> panda.com

Server:172.16.2.7

Address:172.16.2.7#53


Non-authoritative answer:

panda.commail exchanger = 0 mail.panda.com.




B邮件服务器使用DNS # vim /var/named/chroot/etc/named.conf

...

zone "sex.com" IN {

       type forward;

       forwarders { 172.16.2.7; };

};


# service named restart




测试邮件的发送:


A服务器的用户# echo "can you see me ?" | mail -s "testmail" wewe@panda.com


B服务器的用户#  echo "can you see me ?" | mail -s "testmail" tom@sex.com



例子:给postfix添加snmp验证功能。


相关的文档:

/usr/share/doc/postfix-2.6.6/README-Postfix-SASL-RedHat.txt



# vim /etc/postfix/main.cf

...添加以下配置....

smtpd_sasl_auth_enable = yes

smtpd_sasl_security_options = noanonymous

broken_sasl_auth_clients = yes


smtpd_recipient_restrictions =

 permit_sasl_authenticated, <--提供正确的用户名和密码都可以发外部域的邮件

 permit_mynetworks, <--处于mynetwork定义的网络的用户都可以免验证发外部域的邮件

 permit_auth_destination, <--只要收件人的域??@域名实在mydestination列表中定义的域名,都可以处理,才能保证邮件服务器可以接受其他邮件服务器发给本地域名的用户的邮件

 reject_unauth_destination,

 reject





# yum install cyrus-sasl* -y <--- 验证手段需要用到依赖包



# vim /etc/sasl2/smtpd.conf <---默认就这样,一般不用修改

pwcheck_method: saslauthd

mech_list: plain login <---- 支持明文帐号密码验证


# service saslauthd start <--- postfix接受到客户传输过来的用户名和密码都会交给saslautdh服务协助验证。

# chkconfig saslauthd on


# service postfix restart



查看postfix是否已经支持smtp验证功能

# telnet 127.0.0.1 25

Trying 127.0.0.1...

Connected to 127.0.0.1.

Escape character is '^]'.

220 node5.sex.com ESMTP Postfix

ehlo node5.sex.com <---输出邮件服务器的一些功能

250-node5.sex.com

250-PIPELINING

250-SIZE 10240000

250-VRFY

250-ETRN

250-AUTH LOGIN PLAIN  <---

250-AUTH=LOGIN PLAIN  <--- 看到AUTH关键字,说明支持验证

250-ENHANCEDSTATUSCODES

250-8BITMIME

250 DSN



以下的邮件发送测试,邮件服务器根本没有要求用户提供用户名和密码就能发送,原因:

连接邮件服务器的用户实在本机,本机的IP在mynetworks列表里

# telnet 127.0.0.1 25

Trying 127.0.0.1...

Connected to 127.0.0.1.

Escape character is '^]'.

220 node5.sex.com ESMTP Postfix

mail from: root@upl.com

250 2.1.0 Ok

rcpt to: l.t.b@126.com

250 2.1.5 Ok

data

354 End data with <CR><LF>.<CR><LF>

can you see me?

.

250 2.0.0 Ok: queued as B3AE24E27





为了看到强制验证的功能,修改postfix的配置:

# vim /etc/postfix/main.cf

mynetworks = 127.0.0.0/8, 10.1.1.0/24 <---取消172.16.0.0/15

# service postfix restart


# passwd tom <---准备一个帐号



测试: 使用局域网中另外一个机器作为客户端去连接postfix

# telnet 172.16.2.7 25

Trying 172.16.2.7...

Connected to 172.16.2.7.

Escape character is '^]'.

220 node5.sex.com ESMTP Postfix

mail from: root@upl.com

250 2.1.0 Ok

rcpt to: l.t.b@126.com

554 5.7.1 <l.t.b@126.com>: Relay access denied <---客户端的IP不在受信任的网络中,而且又没有提供帐号验证,收件地址也是外部域名(不在mydestinaiton中),所以被拒绝



提供用户和密码:

# telnet 172.16.2.7 25

Trying 172.16.2.7...

Connected to 172.16.2.7.

Escape character is '^]'.

220 node5.sex.com ESMTP Postfix

auth login <---

334 VXNlcm5hbWU6

dG9t <--- 用户名tom经过base64编码之后

334 UGFzc3dvcmQ6

MTIz <--- 密码123经过base64编码之后

235 2.7.0 Authentication successful

ail from: root@upl.com

250 2.1.0 Ok

rcpt to: l.t.b@126.com

250 2.1.5 Ok  <---可以了

data

354 End data with <CR><LF>.<CR><LF>

=========================hhhhhhhhhhhhh

.

250 2.0.0 Ok: queued as 4213B4E27

quit