您的位置:首页 > 大数据 > 人工智能

RHEL5系统 sendmail+qpopper 架设简易邮件服务器

2011-03-22 12:43 549 查看
目标:在RHEL5系统架设简易邮件服务器,包括SMTP服务、POP3服务,发信支持SMTP验证。然后使用客户端(比如Foxmail,Outlook)连接,进行邮件收发。

【注意】此文档的配置在我的RHEL5系统上能正确运行

【注意】此文档的内容不一定说得正确,欢迎大家指正!小蜗牛十分感谢!

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

Sendmail 入门配置

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

在这里不讲sendmail如何安装,只讲述简单的sendmail配置使用。大多数Linux系统在安装的时候,一般都默认安装了senmdail。我使用的RHEL5系统,已经安装的sendmail包如下:

[root@pps ~]# rpm -qa | grep sendmail

sendmail-8.13.8-2.el5

1、启动、停止sendmail服务
大多数系统默认开机就启动sendmail服务了,我们可以查看sendmail服务状态,停止、启动sendmail:

[root@pps ~]# service sendmail status

sendmail (pid 3944 3935) 正在运行...

[root@pps ~]# service sendmail stop

关闭 sm-client: [确定]

关闭 sendmail: [确定]

[root@pps ~]# service sendmail start

启动 sendmail: [确定]

启动 sm-client: [确定]

【小贴士】--------------------------------------------------------------【小贴士】

可以telnet检查一下sendmail服务是否真的启动了:

[root@pps ~]# telnet localhost 25

Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1).

Escape character is '^]'.

220 pps.hoho.com ESMTP Sendmail 8.13.8/8.13.8; Sat, 14 Mar 2009 00:22:53 +0800

quit

221 2.0.0 pps.hoho.com closing connection

Connection closed by foreign host.

嘿嘿,说明senmail服务启动正常啦!可以看到sendmail的版本号是 8.13.8,我连接上后啥也没做,输入quit命令退出来了!

【小贴士】--------------------------------------------------------------【小贴士】

其实用telnet命令可以测试连接其它端口,检测端口是否打开(即提供服务),比如检测80或者8080等,如果端口打开了就会有信息返回提示,即使是连接被blocked的信息,否则就会出现连接被拒的情况(Connection refused)。

2、简单配置sendmail

当sendmail服务启动的时候,就可以使用mail工具给系统内别的用户发邮件(信息),或者给外界发邮件了,如果目标email系统不做什么反垃圾检查、IP过滤的话,一般能收到的。

(1)sendmail的主配置文件 /etc/mail/sendmail.cf

这个配置文件差不多有2000行,有点恐怖,不过我们需要做的修改并不多,先入门嘛。我修改的几个地方如下:

1)SMTP监听地址参数

# SMTP daemon options

# O DaemonPortOptions=Addr=127.0.0.1,Port=smtp,Name=MTA

O DaemonPortOptions=Port=smtp,Name=HoHo'MTA

这里我把Addr=127.0.0.1去掉,sendmail就监听系统的所有IP的smtp(25)端口,否则只监听127.0.0.1的25端口,系统外的客户端是无法连接到我的sendmail的,要么就再写上我们对外服务的局域网IP地址,如下:

O DaemonPortOptions=Addr=127.0.0.1,Addr=192.168.32.50,Port=smtp,Name=MTA

(有本事你就写上一个公网IP,哈哈)

2)设置本服务器主机名信息

Cwlocalhost

# file containing names of hosts for which we receive email

Fw/etc/mail/local-host-names

Cw之后写明所有要收信的主机名,但是接下来Fw这一行说明可以从local-host-names文件读取所要收信的主机名,我可以这样:

Cwlocalhost hoho.com pps.hoho.com

或者在 local-host-names 文件里:

[root@pps mail]# cat /etc/mail/local-host-names

# local-host-names - include all aliases for your machine here.

hoho.com

pps.hoho.com

(经测试,可以同时在Cw里和Fw里有相同的主机名,不过我认为这是无聊的做法)
现在我想发信给本机的hoho用户,发给 hoho@hoho.com 或者 hoho@pps.hoho.com 都可以。

【注意】如果本机还有其它别名,比如 bbs.hoho.com:

[root@pps mail]# nslookup bbs.hoho.com

Server: 127.0.0.1

Address: 127.0.0.1#53
bbs.hoho.com canonical name = pps.hoho.com.

Name: pps.hoho.com

Address: 192.168.32.50

那么如果在Cw或Fw里写上 pps.hoho.com 但是没有写上 bbs.hoho.com ,给 hoho@bbs.hoho.com发信也是可以的。

但是,如果 bbs.hoho.com 是独立的A记录,如下:

[root@pps mail]# nslookup bbs.hoho.com

Server: 127.0.0.1

Address: 127.0.0.1#53
Name: bbs.hoho.com

Address: 192.168.32.50

那么此时给 hoho@bbs.com.cn 发信将会有退信,说是“system config error, mail loops back to me (MX problem?)"。

【注意】如果此时 bbs.hoho.com 实际为局域网内另外一台主机(带有邮件服务),那么给 hoho@bbs.hoho.com 发信,本机就将信件relay到 bbs.hoho.com 主机,不会产生上述错误。

(2)sendmail的访问限制配置文件 /etc/mail/access

[root@pps mail]# cat access

# Check the /usr/share/doc/sendmail/README.cf file for a de.ion

# of the format of this file. (search for access_db in that file)

# The /usr/share/doc/sendmail/README.cf is part of the sendmail-doc

# package.

#

# by default we allow relaying from localhost...

Connect:localhost.localdomain RELAY

Connect:localhost RELAY

Connect:127.0.0.1 RELAY

# 这一行是我添加的

Connect:192.168.32 RELAY

编辑保存后,执行以下命令更新访问数据库:

[root@pps mail]# makemap hash access.db < access

这里配置允许本机和 192.168.32.0/24 网段的所有机器的访问,因此可以在本网段内的机器(假设是Windows XP)上使用Foxmail或者Outlook来设置smtp服务器为 192.168.32.50 来发送邮件。当然,防火墙需要允许外界对25端口的访问(防火墙的配置就不扯远了)。

【小贴士】--------------------------------------------------------------【小贴士】
access文件定义举例:

hoho.com RELAY //允许hoho.com域内用户发送

192.168.32 RELAY //允许192.168.32.0/24网段发送

hoho@163.com RELAY //允许特定邮件地址

snailwarrior@ RELAY //允许特定用户发送

参数说明:

OK 无条件接受或发送

RELAY 允许SMTP代理投递

REJECT 拒绝接受并发送错误消息

DISCARD 丢弃邮件,不发送错误消息

(3)sendmail设置SMTP验证

【注意】如果做了SMTP验证,上述/etc/mail/access的限制还是起作用的,即使SMTP验证通过,但是在access里限制客户端不能访问,则客户端还是无法发信。

sendmail设置smtp验证需要cyrus-sasl包,我的RHEL5系统已安装的包如下:

[root@pps mail]# rpm -qa | grep sasl

cyrus-sasl-lib-2.1.22-4

cyrus-sasl-plain-2.1.22-4

cyrus-sasl-2.1.22-4

【注意】如果是用源码包方式编译安装sendmail,如果需要支持SMTP验证,则需要先安装sasl(简单认证和安全层协议)。

sasl 认证方式有多种,我在这里介绍使用 /etc/shadow 来做用户密码验证,下面谈到的Qpopper做POP3服务器时也配置为用 /etc/shadow 来验证。

1)关注一下 /usr/lib/sasl2/Sendmail.conf

[root@pps ~]# cat /usr/lib/sasl2/Sendmail.conf

pwcheck_method:saslauthd
有资料说需要将 Sendmail.conf 复制一份,名为 smtpd.conf,但在我的RHEL5系统不需要这么做,也不需要修改其默认内容。

2)修改 /etc/mail/sendmail.mc,重新生成sendmail.cf

把以下两行前面的 dnl 去掉:

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

dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
把这一行注释掉:

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

添加以下一行:

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

其实也有配置使用SMTP验证的一行(我们不动它,保持注释状态):

dnl DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea')dnl
但这里的Port=submission,也即是在 587 端口上才使用SMTP验证,这不是我想要的,我需要在SMTP默认的25端口上使用SMTP验证,于是将 Port=submission 修改为 Port=smtp。

修改保存好sendmail.mc后,执行以下命令来生成新的 sendmail.cf 配置文件:

[root@pps mail]# m4 sendmail.mc > sendmail.cf

sendmail.mc:10: m4: cannot open `/usr/share/sendmail-cf/m4/cf.m4': No such file or directory
这是因为没有安装sendmai-cf这个包,安装了就OK了。

3)启动saslauthd服务

[root@pps ~]# service saslauthd start
【注意】想要saslauthd开机时启动,RHEL5可以通过ntsysv配置来实现,或者通过在 /etc/rc.local 里添加 /etc/init.d/saslauthd start 一行。

4)重启sendmail

[root@pps ~]# service sendmail restart

美丽的时刻,SMTP客户端连接就需要SMTP验证了!

【小贴士】--------------------------------------------------------------【小贴士】

使用Telnet检查SMTP验证是否生效了:

[root@pps mail]# telnet localhost 25

Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1).

Escape character is '^]'.

220 pps.hoho.com ESMTP Sendmail 8.13.8/8.13.8; Sun, 15 Mar 2009 14:47:10 +0800

ehlo localhost

250-pps.hoho.com Hello localhost.localdomain [127.0.0.1], pleased to meet you

250-ENHANCEDSTATUSCODES

250-PIPELINING

250-8BITMIME

250-SIZE

250-DSN

250-AUTH LOGIN PLAIN

250-DELIVERBY

250 HELP

quit

221 2.0.0 pps.hoho.com closing connection

Connection closed by foreign host.

可以看到 250-AUTH LOGIN PLAIN 说明SMTP验证生效了。

OutlookExpress、Foxmail使用LOGIN认证方式。

也可以通过以下命令检查sasl是否生效:

[root@pps mail]# sendmail -d0.1 -bv root | grep SASL

NETUNIX NEWDB NIS PIPELINING SASLv2 SCANF SOCKETMAP STARTTLS

嘿嘿,可以看到我的 SASLv2 已经启用了。

(4)sendmail相关配置文件以及作用

/etc/mail/sendmail.cf Sendmail主配置文件

/etc/aliases Sendmail使用的别名文件(raw data)

/etc/mail/aliases.db 别名数据库(加快别名查找)

/etc/mail/helpfile 帮助文件

/var/log/mail/statistics 统计文件

/var/spool/mqueue/* 邮件队列临时文件

【举例1】/etc/aliases 我可以通过这个文件实现“群发”

# 我在文件末尾添加自己想要群发的“用户群” allpeople

allpeople: mail_user_1,mail_user_2,mail_user_3,mail_user_4,mail_user_5
更新别名:

[root@pps etc]# newaliases 或者 sendmail -bi
下面给 allpeople@hoho.com 发信,就相当于给上述5个邮件用户发信了!

allpeople就是一个邮件列表(maillist)!

【补充2】/var/log/maillog 这是sendmail的日志文件(其实也是下面说的POP3服务的日志文件)

root可以查看此文件检查邮件的投递情况。在这里也可以看到sendmail和下面讲述的POP3服务器Qpopper的启动相关信息。
[root@pps mail]# service sendmail restart

/var/log/maillog日志记录如下:

Mar 14 23:27:38 pps sendmail[20861]: alias database /etc/aliases rebuilt by root

Mar 14 23:27:38 pps sendmail[20861]: /etc/aliases: 76 aliases, longest 10 bytes, 765 bytes total

Mar 14 23:27:39 pps sendmail[20866]: starting daemon (8.13.8): SMTP+queueing@01:00:00

Mar 14 23:27:40 pps sm-msp-queue[20877]: starting daemon (8.13.8): queueing@01:00:00
所有的邮件收发都在这里有记录,这里就不细说了。

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

Qpopper 安装配置

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

Qpopper是一个POP3服务器,它不支持SMTP等功能,只是和标准的UNIX邮件传输代理(MTA)比如sendmail、smail 等一起工作。一般Linux安装的时候不自带qpopper,需要自己下载安装。(我没注意我使用的RHEL5光盘里是否有qpopper的rpm包)
下载当前最新的版本:qpopper4.0.16

ftp://ftp.qualcomm.com/eudora/servers/unix/popper/qpopper4.0.16.tar.gz
下面的操作步骤参考Qpopper的手册GUIDE.pdf,但手册有很多地方“跟不上”时代了,下面根据自己RHEL5系统的实际情况说说我的安装配置。
【注意】/var/mail --> /var/spool/mail
【注意】需要防火墙开放110端口

1、安装步骤

[root@pps software]# tar zxf qpopper4.0.16.tar.gz

[root@pps software]# cd qppoper

[root@pps qpopper4.0.16]# ./configure --enable-standalone

[root@pps qpopper4.0.16]# make

[root@pps qpopper4.0.16]# make install

popper安装在 /usr/local/sbin/popper
【注意】这里可执行程序名叫"popper",而不是"qpopper"

手册里介绍可以用inetd来启动qpopper,但目前比较新的系统都采用了xinetd了。我本人也不喜欢使用它们,就喜欢 standalone模式。下面介绍如何使用standalone模式运行apopper,因此我在 configure 的时候加上 --enable-standalone 开关。
我实际使用的配置如下:

[root@pps qpopper4.0.16]# ./configure --enable-standalone --enable-specialauth --enable-log-login

--enable-standalone 使用standalone模式

--enable-specialauth 使得支持RHEL5的用户密码shadow

--enable-log-login Qpopper记录成功登陆的认证。

2、Qpopper的运行、停止

运行Qpopper,我实际使用的运行参数如下:

[root@pps qpopper4.0.16]# popper -c -C -R -s -T180

-c 将用户名大写变为小写,因此用户名可以大小写混合使用,结果都为小写

-C 如果用户名带有域名,-C选项将“@域名”去掉,hoho@hoho.com变为hoho

-R 禁用对客户端IP反向DNS查询

-s 在日志中记录统计数据

-T 设置客户端的读取超时时间,默认120秒

下面这个选项也比较有用,就是从文件读取运行选项,使用时请查看手册看看注意事项。

-f config-file 从config-file读取额外的run-time选项

停止Qpopper:

[root@pps mail]# killall popper

/var/log/maillog日记里的停止、启动记录:

Mar 14 23:21:52 pps popper[14759]: popper: Server: cleaning up and exiting normally

Mar 14 23:25:02 pps popper[20740]: popper: Server: listening . 0.0.0.0:110

【提示】我在 /etc/rc.local 里添加一行 /usr/local/sbin/popper -c -C -R -s -T180 来设置开机自动启动POP3服务。

3、添加POP3用户(其实就是添加邮件用户)

参考了一下资料,发现可以只添加邮件用户而实际上没有增加系统用户,以下命令不用理会警告信息:

[root@pps mail]# useradd mail_user_1 -g mail -d /dev/null -s /bin/false

useradd:警告:此主目录已经存在。

不从 skel 目录里向其中复制任何文件。

因此,可以用shell脚本批量生成邮件用户,同时使用 chpasswd 命令来批量初始化用户的密码。示例如下:

(1)批量生成用户

先来看看mail用户的组别:

[root@pps ~]# cat /etc/passwd | grep mail

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

可见mail用户的GID为12

新建mail_users.txt内容如下:

[root@pps ~]# cat mail_users.txt

mail_user_1:x::12::/dev/null:/sbin/nologin

mail_user_2:x::12::/dev/null:/sbin/nologin

mail_user_3:x::12::/dev/null:/sbin/nologin

mail_user_4:x::12::/dev/null:/sbin/nologin

mail_user_5:x::12::/dev/null:/sbin/nologin

【注意】必须严格按照/etc/passwd 的格式来书写

使用newusers命令来批量生成用户:

[root@pps ~]# newusers mail_users.txt

查看一下/etc/passwd用户添加情况:

[root@pps ~]# cat /etc/passwd

...

mail_user_1:x:65535:12::/dev/null:/sbin/nologin

mail_user_2:x:65536:12::/dev/null:/sbin/nologin

mail_user_3:x:65537:12::/dev/null:/sbin/nologin

mail_user_4:x:65538:12::/dev/null:/sbin/nologin

mail_user_5:x:65539:12::/dev/null:/sbin/nologin
这里UID是系统自动分配的。

(2)批量修改用户密码

新建mail_users_passwd.txt内容如下:

[root@pps ~]# cat mail_users_passwd.txt

mail_user_1:135790

mail_user_2:135790

mail_user_3:135790

mail_user_4:135790

mail_user_5:135790

【注意】这里的格式也是固定的

使用chpasswd命令批量修改用户密码:

[root@pps ~]# chpasswd < mail_users_passwd.txt
这里,相当于我初始化所有邮件用户的密码为135790。

如果使用加密的方式修改密码,则需要使用 -e 参数,可以参考/etc/shadow文件创建密码。(我个人认为实在没有必要用加密方式批量修改用户密码,日后用户自己修改密码还得管理员来完成,我以后得想个办法来实现让用户自己修改POP3/SMTP密码。可以用数据库或者其它的验证方式)

又一个美丽的时刻,新建好的邮件用户可以POP3收信了!

【注意】-【注意】-【注意】-【注意】-【注意】-【注意】-【注意】-【注意】-【注意】
如果想从Internet上收取别的系统发来的邮件,你需要有自己的域名和管理域名DNS解释的权限,主要是做好MX记录解释。比如我的域名是 hoho.com(其实这已经是被国外注册了的域名,可是我的英文名就叫HoHo[SnailWarrior是我的笔名],呜呜呜……好想要回来),我在自己的系统上做了MX记录解释,如下:
[root@pps mail]# nslookup -q=mx hoho.com

Server: 127.0.0.1

Address: 127.0.0.1#53
hoho.com mail exchanger = 10 mx1.hoho.com.

hoho.com mail exchanger = 10 mx2.hoho.com.

hoho.com mail exchanger = 10 mx3.hoho.com.

hoho.com mail exchanger = 10 mail.hoho.com.

我自己无聊就做了4个MX记录,其实都指向本机的192.168.32.50 IP地址。
因此如果想收取外界的邮件,需要把你的域名的MX记录指向邮件服务器IP地址即可。或者像我这样,先做一个邮件服务器主机的A记录,然后设置MX记录指向邮件服务器主机。

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

客户端SMTP/POP3设置

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

以我的机器为例,Foxmail、Outlook里,SMTP/POP3服务器都填写192.168.32.50

用户可以用 mail_user_1 或者用 mail_user_1@hoho.com 或者 mail_user_1@pps.hoho.com 都可以,密码当然就是135790了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: