邮件服务器源码 搭建自己的邮件服务器

linux系统下邮件服务器sendmail的配置

安装所需软件

sendmail.8.12.10.tar.gz  

cyrus-sasl-2.1.18.tar.gz 

安装步骤

1、       先安装cyrus-sasl-2.1.18.tar.gz,sendmail安装时要用到sasl(简单认证和安全层协议)的库文档的头文档。

解压缩:

# tar-zxvf cyrus-sasl-2.1.18.tar.gz

编译:

进入刚解压的源码目录,运行以下命令完成安装。

#./configure--prefix=/usr/local/sasl2--enable-login

一定要加--enable-login,因为SASL2默认不支持login这种验证方式,而OUTLOOK是通过

login来进行SMTP验证的。

#make          #编译

#make install       #安装

完成以上linux程式安装三步曲之后,就能够开始配置和测试了。

2、配置SASL

为了把SASL应用于sendmail认证,还需进行一些配置工作。sendmail会到/usr/lib目录下去

找SASL2库,而我们是把程式安装在/usr/local/sasl2中,为什么不把软件安装在/usr/lib目录

呢?这主要是为了好管理自已安装的软件啦。所以我们要在/usr/lib目录下做一个链接:

# cd/usr/lib

# ln-s/usr/local/sasl2/lib/*.

ok,接着要在/var/目录下建一个目录给saslauthd进程存在临时数据。

# cd/var

# mkdir state

# cd state

# mkdir saslauthd

注:假如没有这些目录,运行saslauthd时,会提示出错。

ok,接着为确保CYRUS-SASL2函数库知道怎样验证所收来的SASL认证请求,必须创建一

个SASL的配置文档来把MTA程式定义成一个SASL应用。配置文档名为Sendmail.conf(注

意是大写的S),位于/usr/lib/sasl2目录中,也就是/usr/local/sasl2/lib/sasl2这个目录,记得上

面新建的链接了吗?在该文档中您定义您希望使用的认证数据库方法,以下这个例子使用

saslauthd来验证认证请求。

# cd/usr/lib/sasl2

# echo'pwcheck_method: saslauthd'; Sendmail.conf

3、测试

ok,现在能够运行saslauthd了,并进行测试。

# cd/usr/local/sasl2/sbin

#./saslauthd-a shadow              

用shadow的用户和密码进行验证

#./testsaslauthd-u userid-p password

0: OK"Success."

假如出现以上信息,就说明saslauthd正常运行了。testsaslauthd程式默认是没有编译的,您

需要在源码目录树的saslauthd子目录中运行    # make testsaslauthd命令生成。

4、sasl2安装完成后,就要开始安装sendmail了。

先解压sendmail源码。

# tar-zxvf sendmail.8.12.10.tar.gz

假如要sendmail支持SASL,需要修改源码的位置配置文档site.config.m4。site.config.m4位

于源码目录树的devtools/Site。文档中应包含以下行:

PREPENDDEF(`confMAPDEF', `-DMAP_REGEX')

APPENDDEF(`confENVDEF', `-DTCPWRAPPERS-DSASL=2')

APPENDDEF(`conf_sendmail_LIBS', `-lwrap-lsasl2')

APPENDDEF(`confLIBDIRS', `-L/usr/local/sasl2/lib')

APPENDDEF(`confINCDIRS', `-I/usr/local/sasl2/include')

第一行配置正则表达式相关内容

第二、三行配置表示在sendmail程式中支持sasl2和tcp_wrapper(可通过hosts.allow和

hosts.deny控制访问)

第四、五行配置指出sasl2的库文档和头文档的位置。

ok,接着在编译前要建立一些用户和目录,并确保有正确的权限。

sendmail必须有一个set-group-id(默认是smmsp组)的程式来在一个组可写的目录中查询

排队邮件。所以我们要建立一个smmsp用户和组。并建立如下目录并配置相应的权限,具

体配置需要可查询源码目录树下sendmail/SECURITY文档。

# groupadd smmsp

# useradd smmsp-d/var/spool/clientmqueue-s/dev/null

# mkdir/var/spool/clientmqueue

# chown-R smmsp:smmsp/var/spool/clientmqueue 

# chmod-R 770/var/spool/clientmqueue 

# mkdir/etc/mail

# mkdir/var/spool/mqueue

# chmod go-w//etc/etc/mail/usr/var/var/spool/var/spool/mqueue

# chown root//etc/etc/mail/usr/var/var/spool/var/spool/mqueue

ok,接下来就能够进入源码目录树开始编译了。

#./Build-c

-c选项能删除上次编译产生的文档。

#./Build install

编译完成后就能够进行安装。

5、sendmail配置

要sendmail正常运行,还需配置几个文档,首先最重要的就是sendmail.cf文档了。他在源

码目录树下的cf/cf目录下有很多例子可参考。您能够拷贝使用。由于sendmail.cf中的语法

很复杂,所以不建议手工修改。我们能够以sendmail.mc文档配合sendmail-cf目录下的宏通

过m4预处理器自动生成。m4预处理器用来从一组宏文档中创建sendmail配置文档。宏文

件作为输入被读进来。宏被展开,然后写到一个输出文档。sendmail-cf目录一般放在/usr/share

目录下。其实sendmail-cf目录的内容和源码目录树下的cf目录的内容是相同的,所以,为

了确保sendmail-cf目录的内容和安装版本同步,要把源码目录树下的cf目录的内容拷贝到

/usr/share/sendmail-cf目录。

sendmail.mc配置文档内容如下:

divert(-1)

include(`/usr/share/sendmail-cf/m4/cf.m4')

VERSIONID(`linux setup for Red Hat Linux')dnl

OSTYPE(`linux')

dnl Uncomment and edit the following line if your mail needs to be sent out

dnl through an external mail server:

dnl define(`SMART_HOST',`smtp.your.provider')

define(`confDEF_USER_ID',``8:12'')dnl

undefine(`UUCP_RELAY')dnl

undefine(`BITNET_RELAY')dnl

dnl define(`confAUTO_REBUILD')dnl

define(`confTO_CONNECT', `1m')dnl

define(`confTRY_NULL_MX_LIST',true)dnl

define(`confDONT_PROBE_INTERFACES',true)dnl

define(`PROCMAIL_MAILER_PATH',`/usr/bin/procmail')dnl

define(`ALIAS_FILE', `/etc/mail/aliases')dnl

define(`STATUS_FILE', `/etc/mail/statistics')dnl

define(`UUCP_MAILER_MAX', `2000000')dnl

define(`confUSERDB_SPEC', `/etc/mail/userdb.db')dnl

define(`confPRIVACY_FLAGS', `authwarnings,novrfy,noexpn,restrictqrun')dnl

define(`confAUTH_OPTIONS', `A')dnl

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

define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5

LOGIN PLAIN')dnl

dnl define(`confCACERT_PATH',`/usr/share/ssl/certs')

dnl define(`confCACERT',`/usr/share/ssl/certs/ca-bundle.crt')

dnl define(`confSERVER_CERT',`/usr/share/ssl/certs/sendmail.pem')

dnl define(`confSERVER_KEY',`/usr/share/ssl/certs/sendmail.pem')

dnl define(`confTO_QUEUEWARN', `4h')dnl

dnl define(`confTO_QUEUERETURN', `5d')dnl

dnl define(`confQUEUE_LA', `12')dnl

dnl define(`confREFUSE_LA', `18')dnl

define(`confTO_IDENT', `0')dnl

dnl FEATURE(delay_checks)dnl

FEATURE(`no_default_msa',`dnl')dnl

FEATURE(`smrsh',`/usr/sbin/smrsh')dnl

FEATURE(`mailertable',`hash-o/etc/mail/mailertable.db')dnl

FEATURE(`virtusertable',`hash-o/etc/mail/virtusertable.db')dnl

FEATURE(redirect)dnl

FEATURE(always_add_domain)dnl

FEATURE(use_cw_file)dnl

FEATURE(use_ct_file)dnl

dnl The'-t' option will retry delivery if e.g. the user runs over his quota.

FEATURE(local_procmail,`',`procmail-t-Y-a$h-d$u')dnl

FEATURE(`access_db',`hash-T;-o/etc/mail/access.db')dnl

FEATURE(`blacklist_recipients')dnl

EXPOSED_USER(`root')dnl

dnl This changes sendmail to only listen on the loopback device 127.0.0.1

dnl and not on any other network devices. Comment this out if you want

dnl to accept email over the network.

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

dnl NOTE: binding both IPv4 and IPv6 daemon to the same port requires

dnl      a kernel patch

dnl DAEMON_OPTIONS(`port=smtp,Addr=::1, Name=MTA-v6, Family=inet6')

dnl We strongly recommend to comment this one out if you want to protect

dnl yourself from spam. However, the laptop and users on computers that do

dnl not have 24x7 DNS do need this.

FEATURE(`accept_unresolvable_domains')dnl

dnl FEATURE(`relay_based_on_MX')dnl

MAILER(smtp)dnl

MAILER(procmail)dnl

记得要使以下两个条语句有效,他的意思是假如access.db访问控制没有配置,则启用以下

验证方式进行smtp验证。

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

define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5

LOGIN PLAIN')dnl

sendmail宏定义说明

divert(n)               为m4定义一个缓冲动作,当n=-1时缓冲被删除,n=0时开始一个新缓冲

OSTYPE定义宏所使用的操作系统,该宏允许m4程式增加同相关操作系统相关的

文档

Domain定义MTA将使用哪些域来传输邮件

Feature定义配置文档中使用的一个特定的功能集

Define定义配置文档中的一个特定的选项值

MASQUERADE_AS               定义sendmail来应答邮件的其他主机名

MAILER定义sendmail使用的邮件传输方法

dnl注释

完成sendmail.mc文档的编写后就能够用m4程式生成正式的sendmail.cf配置文档。语法如

下:

# m4 sendmail.mc; sendmail.cf

也能够用源码目录树下的cf/cf/Build命令生成。前提是您要在该目录下有一个sendmail.mc

文档。语法如下:

#./Build sendmail.cf

ok,接着就能够把sendmail.cf and submit.cf文档安装到/etc/mail目录中的,语法如下:

#./Build install-cf

其实也能够自已用cp命令拷贝的啦。记得把sendmail.mc文档也拷贝一份到/etc/mail目录,

以便以后修改配置时可重新生成sendmail.cf文档。

ok,接着到/etc/mail目录下配置一些文档。

# cd/etc/mail

# echo'examply.com';; local-host-names        接收邮件的主机名

# echo'localhost   RELAY' ;; access                用来拒绝或允许来自某个域的邮件,本例允许

本地转发。

# makemap hash access生成access.db数据库

# touch domaintable        用来把旧域名映射互新域名

# makemap hash domaintable来覆盖向指定域的路由

# makemap hash mailertable用来把用户和域名映射到其他地址

# makemap hash virtusertable别名数据库,文本形式。可参照源码目录树下

sendmail/aliases文档。

# newaliases                 从文本文档中创建一个新的别名数据库文档。

# sendmail-v-bi       调试启动。

/etc/mail/aliases: 42 aliases, longest 10 bytes, 432 bytes total

假如出现以上提示信息,则启动成功。可用以下命令正式启动:

# sendmail-bd-q30m

该命令以后台进程方式(-bd)运行,并使其每隔30分钟(-q30m)轮询一次未发送邮件队

列,检查是否有新邮件。

服务器启动后,能够用telnet连接服务器。

# telnet localhost 25

Trying 127.0.0.1...

Connected to localhost.

Escape character is'^]'.

220 test.tigerhead ESMTP Sendmail 8.12.10/8.12.10; Tue, 30 Mar 2004 14:50:14+0800

ehlo test               您输入的命令,按回车结束。

250-test.tigerhead Hello LOCALHOST.localdomain [127.0.0.1], pleased to meet you

250-ENHANCEDSTATUSCODES

250-PIPELINING

250-8BITMIME

250-SIZE

250-DSN

250-ETRN

250-AUTH DIGEST-MD5 CRAM-MD5 LOGIN PLAIN

250-DELIVERBY

250 HELP

以250-开头的为服务器的响应信息。注意倒数第三行,这就是成功配置smtp验证的显示。

输入quit离开。

安装完成后为确保系统安全,还需调整一些目录的权限。可参考sendmail源码目录下

sendmail/SECURITY文档。

# chmod 0640/etc/mail/aliases/etc/mail/aliases.{db,pag,dir}

# chmod 0640/etc/mail/*.{db,pag,dir}

# chmod 0640/etc/mail/statistics/var/log/sendmail.st

# chmod 0600/var/run/sendmail.pid/etc/mail/sendmail.pid

-r-xr-sr-x       root  smmsp       .../PATH/TO/sendmail

drwxrwx---       smmsp smmsp       .../var/spool/clientmqueue

drwx------       root  wheel       .../var/spool/mqueue

-r--r--r--       root  wheel       .../etc/mail/sendmail.cf

-r--r--r--       root  wheel       .../etc/mail/submit.cf

6、sendmail功能介绍

aliases别名数据库配置

test:       test1,test2,test3       配置test群组别名,test不是个实际的用户,只是个别名。发给

test的信,test1,2,3都可收到。

test:       test,testbak               在testbak邮箱中备份test的邮件。

test:       test,test@163.com       远程邮件备份,原理同上。

test:  :include:/etc/mail/userlist       使用用户列表配置群组。

userlist格式如下:

test1,/

test2,/

test3,/

test4

关于系统预设aliases,由于sendmail预设用mailer-daemon and postmaster作为资料传送者,

或邮件退回的帐号,但系统实际没有这两个帐号,所以要如下配置别名。

mailer-daemon: postmaster

postmaster:    root

配置完成后不要忘了用newaliases命令生成数据库。

~/.forward文档配置

其实该文档的作用和aliases数据库的作差不多啦,都是配置别名,做邮件转发的。因为alises

只能由管理员控制,个人用户不能修改,所以就能够在个人的目录下建立一个转寄文档。以

配置个人的邮件转寄列表。文档格式如下:

test

test1

test2

test3

and os on

但由于个人用户安全意识差,假如配置不当会有安全漏洞,不建议使用。

access访问控制列表配置

92.168 RELAY

test.NET       OK

test.COM REJECT

test.COM       550 SORRY,WE DON'T ALLOW SPAMMERS HERE

test.ORG       DISCARD

Ok--远程主机能够向您的邮件服务器发送邮件;

RELAY--允许中转;

REJECT--不能向您的邮件服务器发邮件和不能中转;

DISCARD--发来的邮件将被丢弃,同时并不向发送者返回错误信息。

nnn text--发来的邮件将被丢弃,但sendmail将会向发送者返回nnn确定的smtp代码和text

变量确定的文本描述。

配置完成后要用makemap hash access.db命令生成数据库。

mailq邮件队列查询命令。

Q-ID邮件id号。

Size邮件容量。

Q-Time邮件进入队列(也就是/var/spool/mqueue目录)的时间和不能邮寄的原因。

Sender/Recipient       发信和收信人的邮箱地址。

mailstats邮寄状态查询命令,可查询sendmail运行作至今邮件收发总计资料。

M    :

msgsfr:发送的邮件数量。

bytes_from:邮件容量

megsto:收到邮件的数量。

bytes_to:同上

msgsrej:邮件deny的次数。

msgsdis:邮件discard的次数。

Mailer:esmtp对外邮件,local本地邮件。

mail邮件命令

mail       查看/var/spool/mail/目录下自已邮箱内容。以q退出把看过的邮件保存在

~/mbox中。

mail test@example.com               直接发邮件给人。

mail-s'title text' test@example.com把文档中内容邮寄出去。

mail-f~/mbox查看home目录下邮箱内容。

用mail发附件也是可行,要用到uuencode and uudecode命令进行编码。

编码:uuencode [file] name         example:uuencode hello hello;hello.uue  default input

is stdin;default output is stdout.

解码:uudecode [-o outfile] name   example:uudecode hello.uue能够用-o选项输出另外一个

文档名。

# uuencode~/.bashrc bashrc| mail-s'test uuencode'

test@example.com

五、其他配置。

要想更好的使用sendmail,常用到的一些配置:

1、限制最大邮件。

vi/etc/sendmail.cf

# maximum message size

O MaxMessageSize=5000000   (注:5M)

2、最大的群发数目。

vi/etc/sendmail.cf

# maximum number of recipients per SMTP envelope

O MaxRecipientsPerMessage=20 (注:20个)

3、域名文档----local-host-name

能够用他来实现虚拟域名或多域名支持。

/etc/mail/local-host-name

v1mail.com

v2mail.com

.......

4、mail别名文档--aliases。

vi/etc/aliases

系统内部别名:peng:zpeng,hero,mmmn,yt  peng是我的用户名,其他的是别名,用逗号隔开。

转发到其他的邮箱:peng:zpeng@sina.com,yt.sohu.com

#newaliases  --写到库中

5、邮件控制文档--access

relay、ok、reject和discard。relay能够实现转发。ok是用来允许用户的任意访问,他会覆盖任何其他已建立的检查(实际配置中,最好别设这项,除非您对该用户是绝对信任的);reject能够实现对来访地址的拒绝,他根本就不容许该地址和您的邮件服务器进行连接通信;discard的作用是在接收到传输的邮件消息后,偷偷地把他丢弃掉(在发送者看来,他的邮件的确是接收了,但他并不知道,发送的目的地址根本不可能接收到他的邮件,服务器巧妙地欺骗了他。

vi/etc/mail/access.

localhost.localdomain   RELAY     ---允许

localhostRELAY

127.0.0.1                      RELAY

peng@sina.com             ok

@sexgirl.net                  reject

211.77.22.45                 discard

#makemap hash access.db写入库中

6、虚拟用户文档---virtusertable.

这个文档能够mail重名问题。

例如:您有两个域名,virt1.com and virt2.com,但是都有peng这个用户:

peng@virt1.com and peng@virt2.com,这是两个用户。但对于系统用户来说,他只认系统用户peng,只能通过一下改:

vi/etc/mail/virtusertable

peng@virt2.com  r010

这样就能够了。在新开一个用户r010,但是peng@virt2.com在客户端的pop3 and smtp server的用户名和口令要用r010的。

#makemap hask virtusertable.db

#/usr/sbin/sendmail-d0.1-bv root|grep SASL

NAMED_BIND NETINET NETINET6 NETUNIX NEWDB NIS QUEUE SASL SCANF

我的问题已找到了是/usr/lib/sasl/Sendmail.conf的文档名中的S没有大写,问题已解决

Linux系统下安装配置postfix邮件服务器教程

一,安装postfix,cyrus-sasl,cyrus-imapd

如果yum提示找不到软件包,请换一下源,请参考centos 6推荐使用epel源

代码如下:

[root@localhost~]# yum install postfix

[root@localhost~]# yum install cyrus*

二,删除了sendmail

代码如下:

[root@localhost~]# rpm-e sendmail

或者

代码如下:

[root@localhost~]# yum remove sendmail

三,更改默认邮件传输代理(MTA)

代码如下:

[root@localhost sasl2]# alternatives--config mta

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

选择命令

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

*+ 1/usr/sbin/sendmail.postfix

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

上面的只有一个postfix,sendmail已经被我删了。可以通过下面命令来查看。

代码如下:

[root@localhost~]# alternatives--display mta

四,postfix,cyrus-sasl,cyrus-imapd相关配置

1,postfix主配置文件main.cf

代码如下:

[root@localhost postfix]# vim/etc/postfix/main.cf

myhostname= localhost//76行,将等号后面的部分改写为本机主机名

mydomain= 51yip.com//82行,设置域名

myorigin=$mydomain//97行,把$myhostname改为$mydomain

inet_interfaces= all//112行,把后面的localhost改成all

mydestination=$myhostname, localhost.$mydomain, localhost,$mydomain//163行,把前面的注释拿掉,并加一下$mydomain

mynetworks= 192.168.0.0/24, 127.0.0.0/8//263行,设置内网和本地IP

local_recipient_maps=//209行,把前面的注释拿掉。

smtpd_banner=$myhostname ESMTP unknow//568行,把前面的注释拿掉,然后把$mail_name($mail_version)改成unknow

p//在main.cf文件的底部加上以下内容

smtpd_sasl_auth_enable= yes//使用SMTP认证

broken_sasl_auth_clients= yes//让不支持RFC2554的smtpclient也可以跟postfix做交互。

smtpd_sasl_local_domain=$myhostname//指定SMTP认证的本地域名

smtpd_sasl_security_options= noanonymous//取消匿名登陆方式

smtpd_recipient_restrictions= permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination//设定邮件中有关收件人部分的限制

smtpd_sasl_security_restrictions= permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination//设置允许范围

message_size_limit= 15728640//邮件大小

mailbox_transport=lmtp:unix:/var/lib/imap/socket/lmtp//设置连接cyrus-imapd的路径

如果不加local_recipient_maps这个配置,收邮件收不到,下面是qq的退信。

收件人邮件地址(tank@51yip.com)不存在,邮件无法送达。host mail.51yip.com[122.225.***.***] said: 550 5.1.1: Recipient address rejected: User unknown in local recipient table(in reply to RCPT TO command)

2,cyrus-sasl配置

代码如下:

[root@localhost postfix]# vim/etc/sasl2/smtpd.conf//在文件尾部加上以下内容

log_level: 3//记录log的模式

saslauthd_path:/var/run/saslauthd/mux//设置一下smtp寻找cyrus-sasl的路径,在这里要提一下的32位的机器和64位的机器smtpd.conf的路径是不一样的。

p//这是centos 5.5 32位机器上smtpd的配置文件

[root@linux sasl2]# ls|grep conf

Sendmail.conf

smtpd.conf

[root@linux sasl2]# pwd

/usr/lib/sasl2

//这是centos 6.0 64位机器上smtpd的配置文件,其他地方没有smtpd的配置文件

[root@localhost postfix]# ls/etc/sasl2/|grep smtpd

smtpd.conf

网上有不少关于postfix安装文章,配置的时候并没有明确提出是32位机器,还是64位机器。所以在这里标明一下。

3,配置cyrus-imapd

cyrus-imapd的主要配置文件有下面三个

代码如下:

/etc/sysconfig/cyrus-imapd

p/etc/cyrus.conf

p/etc/imapd.conf

这里是默认的配置,也就是说上面三个文件我是没有动过的。在这里提醒一下imapd.conf在这个文件里面,你可以设置管理账号

,设置邮件存放目录,设置密码连接方式等。

五,启动postfix,cyrus-sasl,cyrus-imapd

启动cyrus-imapd服务,就可以同时提供pop和imap服务,如果你已安装了dovecot服务就可以删除掉,cyrus-imapd和dovecot二者选其一就行了,二都可以提供pop和imap服务,不过cyrus-imapd可以为每个用户创建一个信息,而且信箱具有层次结构,比较好管理。建议用cyrus-imapd。

代码如下:

[root@linux sasl2]#/etc/init.d/postfix start

[root@linux sasl2]#/etc/init.d/saslauthd start

[root@linux sasl2]#/etc/init.d/cyrus-imapd start

查看一下进程,

代码如下:

//smtp监听是25端口

[root@linux u]# netstat-tpnl|grep smtpd

tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 6319/smtpd

代码如下:

//110(POP3)和143(IMAP)端口,下面都已经有了

[root@linux u]# netstat-tpnl|grep cyrus

tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN 23593/cyrus-master

tcp 0 0 0.0.0.0:995 0.0.0.0:* LISTEN 23593/cyrus-master

tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 23593/cyrus-master

tcp 0 0 0.0.0.0:2000 0.0.0.0:* LISTEN 23593/cyrus-master

tcp 0 0:::993:::* LISTEN 23593/cyrus-master

tcp 0 0:::995:::* LISTEN 23593/cyrus-master

tcp 0 0:::110:::* LISTEN 23593/cyrus-master

tcp 0 0:::143:::* LISTEN 23593/cyrus-master

tcp 0 0:::2000:::* LISTEN 23593/cyrus-master

启动是没有问题的。

六,测试cyrus-sasl

代码如下:

[root@linux t]# passwd cyrus//设置cyrus的密码

[root@linux sasl2]# testsaslauthd-u cyrus-p'******'//系统用户和密码

0: OK"Success."

如果显示是上面的内容说是smtp是没有什么问题

七,cyrus-imapd生产邮件管理员账号,并添加测试账号

安装完cyrus-imapd后会产生一个管理账号是cyrus,所属用户组是mail

代码如下:

[root@linux sasl2]# id cyrus//imapd.conf里面默认的管理员账号就是cyrus

uid=76(cyrus) gid=12(mail) groups=12(mail),76(saslauth)

在认证admin账号时,我发现32位系统和64位系统有一点不同,二种系统我都配置过,配置都是一样的,

但是出现的结果不一样,看下图

   32位机器cyrus管理员用户认证

   64位机器cyrus管理员用户认证

从上图可以看出,32位的系统是不用加上--auth plain,64位的要,如果不加的话,根本进不去。

进去后,我们来添加一下测试账号

代码如下:

[root@linux sasl2]# cyradm-u cyrus localhost

IMAP Password:

localhost cm tank

localhost lm

tank(HasNoChildren)

localhost quit

这样我们可以在/var/spool/imap中看到,生成的目录,32位机器和64位机器生成的目录是不一样的

代码如下:

//这是64位系统生成的目录

[root@localhost u]# ls

user^tank

[root@localhost u]# pwd

/var/spool/imap/u

//这是32位系统生成的目录

[root@linux t]# ls

tank

[root@linux t]# pwd

/var/spool/imap/t

八,测试收发邮件

测试前添加一下DNS,

1,mail.51yip.com A默认 122.225.***.***

2,mail.51yip.com A联通 60.12.***.***

3,@ MX默认 mail.51yip.com

第1和第2,是添加二条A记录,第三行,设置了一下MX记录,这个千万不要忘了,不然你的域名是不通的。

方法有很多,我们可以利用telnet来测试,不过用telnet来测试收发邮件比较麻烦,用linux自带的

mail命令就方便多了

代码如下:

[root@localhost u]# mail-s'看一下' 95219454@qq.com/etc/imapd.conf

到底谁牛 Linux邮件服务器软件比较

几年以前,Linux环境下可以选择的可以免费邮件服务器软件只有Sendmail,但是由于Sendmail的缺陷,一些开发者先后开发了若干种其他的邮件服务器软件。当前,运行在Linux环境下免费的邮件服务器,或者称为MTA(Mail Transfer Agent)有若干种选择,比较常见的有Sendmail、Qmail、Postfix、 exim及Zmailer等等。本文希望通过对几种影响相对来说比较大的主流Linux环境下的MTA的特点进行阐述,并对其优缺点一一分析比较,使用户在选择Linux环境下的免费MTA时有一个选择的依据。

一、Postfix

Postfix是一个由IBM资助下由Wietse Venema负责开发的自由软件工程的一个产物,其目的是为用户提供除sendmail之外的邮件服务器选择。Postfix力图做到快速、易于管理、提供尽可能的安全性,同时尽量做到和sendmail邮件服务器保持兼容性以满足用户的使用习惯。起初,Postfix是以VMailer这个名字发布的,后来由于商标上的原因改名为Postfix。

1.主要设计目标

Postfix工程的目标是实现一个邮件服务器,提供给用户除sendmail以外的选择。其设计目标包括:

性能: Postfix要比同类的服务器产品速度快三倍以上,一个安装 Postfix的台式机一天可以收发百万封信件。Postfix设计中采用了web服务器的的设计技巧以减少进程创建开销,并且采用了其他的一些文件访问优化技术以提高效率,但同时保证了软件的可靠性。

兼容性:Postfix设计时考虑了保持Sendmail的兼容性问题,以使移植变的更加容易。Postfix支持/var[/spool]/mail,/etc/aliases, NIS,及~/.forward等文件。然而 Postfix为保证管理的简单性,所以没有支持配置文件 sendmail.cf。

安全和健壮性:Postfix设计上实现了程序在过量负载情况下仍然保证程序的可靠性。当出现本地文件系统没有可用空间或没有可用内存的情况时, Postfix就会自动放弃,而不是重试使情况变的更糟。

灵活性:Postfix结构上由十多个小的子模块组成,每个子模块完成特定的任务,如通过SMTP协议接收一个消息,发送一个消息,本地传递一个消息,重写一个地址等等。当出现特定的需求时,可以用新版本的模块来替代老的模块,而不需要更新整个程序。而且它也很容易实现关闭某个功能。

安全性:Postfix使用多层防护措施防范攻击者来保护本地系统,几乎每一个Postfix守护进程都能运行在固定低权限的chroot之下,在网络和安全敏感的本地投递程序之间没有直接的路径—一个攻击者必须首先突破若干个其他的程序,才有可能访问本地系统。Postfix甚至不绝对信任自己的队列文件或IPC消息中的内容以防止被欺骗。Postfix在输出发送者提供的消息之前会首先过滤消息。而且Postfix程序没有set-uid。

2.Postfix的一些特点

支持多传输域:Sendmai支持在Internet, DECnet, X.400及UUCP之间转发消息。 Postfix则灵活的设计为无须虚拟域(vistual domai)或别名来实现这种转发。但是在早期的发布里仅仅支持STMP和有限度地支持UUCP,但对于我国用户来说,多传输域的支持没有什么意义。

虚拟域:在大多数通用情况下,增加对一个虚拟域的支持仅仅需要改变一个 Postfix查找信息表。其他的邮件服务器则通常需要多个级别的别名或重定向来获得这样的效果。

UCE控制(UCE,unsolicited commercial email): Postfix能限制哪个主机允许通过自身转发邮件,并且支持限定什么邮件允许接进。Postfix实现通常的控制功能:黑名单列表、RBL查找、HELO/发送者DNS核实。基于内容过滤当前没有实现。

表查看: Postfix没有实现地址重写语言,而是使用了一种扩展的表查看来实现地址重写功能。表可以是本地 dbm或 db文件等格式。

3.Postfix体系结构及与Sendmail的比较

Postfix是基于半驻留,互操作的进程的体系结构,每个进程完成特定的任务,没有任何特定的进程衍生关系(父子关系)。而且,独立的进程来完成不同的功能相对于“单块”程序具有更好的隔离性。此外,这种实现方式具有这样的优点:每个服务如地址重写等都能被任何一个Postfix部件所使用,无须进程创建等开销,而仅仅需要重写一个地址,当然并不是只有postfix采用这种方式。

Postfix是按照这种方式实现的:一个驻留主服务器根据命令运行Postfix守护进程,守护进程完成发送或接收网络邮件消息,在本地递交邮件等等功能。守护进程的数目由配置参数来决定的,并且根据配置决定守护进程运行的次数(re-used times),当空闲时间到达配置参数指定的限度时,自动消亡。这种方法明显地降低了进程创建开销,但是单个进程之间仍然保持了良好的隔离性。

Postfix的设计目标就是成为 Sendmail的替代者。由于这个原因,Postfix系统的很多部分,如本地投递程序等,可以很容易地通过编辑修改类似inetd的配置文件来替代。

Postfix的核心是由十多个半驻留程序实现的。为了保证机密性的原因,这些Postfix进程之间通过Unix的socket或受保护的目录之下的FIFO进行通信。即使使用这种方法来保证机密性, Postfix进程并不盲目信任其通过这种方式接收到的数据。

Postfix进程之间传递的数据量是有限制的。在很多情况下,Postfix进程之间交换的数据信息只有队列文件名和接收者列表,或某些状态信息。一旦一个邮件消息被保存进入文件,其将在其中保存到被一个邮件投递程序读出。

Postfix采用一些通常的措施来避免丢失信息:在收到确认以前通过调用flush和fsync()保存所有的数据到磁盘中。检查所有的系统调用的返回结果来避免错误状况。

大多数构建邮件服务器者都会选择 sendmail,公平的来讲sendmail是一个不错的MTA(Mail Transfer Agent),最初开发时Eric Allman的设计考虑主要放在了邮件传递的成功性。不幸的是,Sendmai开发时没有太多的考虑Internet环境下可能遇到的安全性问题。Sendmail在大多数系统上只能以根用户身份运行,这就意味着任何漏洞都可能导致非常严重的后果,除了这些问题之外,在高负载的情况Sendmail运行情况不是很好。

4.安全

Postfix则并一定要以root的身份运行,而只需要一个主(master)程序以root身份运行,其生成进程来处理接入、发出及本地邮件投递工作。通过使用一系列模块部件,每个任务由一个单独的程序来运行(这样使审计变的容易一些)。例如发出邮件被卸载到一个队列目录,在这里“pcikup”程序取到该邮件然后将邮件传递给“cleanup”程序,其再将邮件传递给“trivial-rewrite”,其负责处理邮件头,最后若邮件目的是别的系统则将邮件传递给“smtp”程序。而且相对于Sendmail来说Postfix也更容易设置chrooted环境。只要简单地通过编辑master.cf(一般位于/etc/postfix内)文件即可实现,并且Postfix将运行chrooted,以限定在其定义的队列目录之下(通常位于/var/spool/postfix),同样可以在master.cf中对Postfix的单一模块设置进程限制。用户可以限制Postfix以哪个用户的身份运行,一般来说是以“postfix”用户(概念上该用户和Apache的nobody类似)运行,该用户可以访问特定的队列目录。Postfix其他的主要优点是起配置文件的清晰易懂性。

5.与Sendmail的比较

如sendmail之类的邮件系统是按照一个"单块"的结构设计实现的,该“单块”程序实现所有的功能。当然这种结构有利于在系统的不同部分之间共享数据。但是这种结构容易出现一些致命的错误。而如qmail的邮件系统上使用一种分层次的结构,按照固定得顺序运行不同功能的子模块进程,执行完毕之后就将其释放。这种方法有良好的“绝缘”性,但是增加了进程创建开销和进程间通信开销。但是通过合理的规划子模块进程的运行顺序可以将开销保持在可以接受的范围内。

使用其他的MTA替代Sendmail是一件非常麻烦的事情,用户往往又要花大量的时间去熟悉新的MTA的配置和使用。而使用Postfix,你可以利用很多以有的配置文件。如(access, aliases, virtusertable等等),只需要简单的在master.cf中定义一下即可。此外,Postfix在行为上也很象Sendmail,用户可以使用"sendmail"命令来启动Postfix。

当然,使用一个软件来替代另外一个软件需要解决特定的问题。部分原因是因为 Postfix的安全特性,在配置Postfix时可能会遇到一些问题。最典型的问题是向 root用户发送邮件。Postfix一般不提高自身的权限(向root用户发送邮件所必须的)来投递邮件。用户需要在别名文件中为root定义别名,如:"root: someuser"。这同样会对若干个邮件列表模块发生影响,特别是SmartList。一般来说实现邮件列表最好使用Majordomo,它易于配置。

Sendmail一个很突出的问题就是可扩展性和性能问题。例如用户若希望每天重新启动Sendmail来实现自动更新配置文件(如为虚拟主机重定向邮件)就会出现问题。Sendmail生成新的进程来处理发送和接收邮件,这些进程会一直存在直到传输结束,之后Sendmail才能退出,这样你的脚本程序将不能正确的重起Sendmail。而对于Postfix,用户则只需要发出命令"postfix reload"即可,Postfix将会重新加载其配置文件。

另外,对于有数以万计的用户的邮件服务器来说,使用文件来存储如匹配用户发出邮件地址(例如bob发出的信的发信人修改为)。对于大量用户来讲,该文件就会变的很巨大,从而影响系统的运行效率。而Postfix则可以和一个数据库后台集成起来(当前只支持MySQL)来存放其配置信息,数据库方式要比文件方式在可扩展性方面强大很多。

遵从IBM的开放源代码版权许可证,用户可以自由地分发该软件,进行二次开发。其唯一的限制就是必须将对 Postfix做的修改返回给IBM公司。因为IBM资助了Wietse的开发。

6.与Qmail的比较

Qmail的缺点就是配置方式和 Sendmail不一致,不容易维护。而且Qmail的版权许可证含义非常模糊,甚至没有和软件一起发布。应用作者的话:若你希望分发自己修改版本的Qmail,你必须得到我的许可。

二、Qmail

Qmail是有Dan Bernstein开发的可以自由下载的MTA,其第一个beta版本0.70.7发布于1996年1月24日,1997年2月发布了 1.0版,当前版本是1.03。

1.Qmail的特点

安全性:为了验证Qmail的安全性,Qmail的支持者甚至出资$1000悬赏寻找 Qmail的安全漏洞,一年以后,该奖金没有被领取,而被捐献给自由软件基金会。目前,Qmail的作者也出资$500来寻求Qmail的安全漏洞。

速度:Qmail在一个中等规模的系统可以投递大约百万封邮件,甚至在一台486一天上能处理超过10万封邮件,起支持并行投递。Qmail支持邮件的并行投递,同时可以投递大约20封邮件。目前邮件投递的瓶颈在于SMTP协议,通过STMP向另外一台互联网主机投递一封电子邮件大约需要花费10多秒钟。Qmail的作者提出了QMTP(Quick Mail Transfer Protocol)来加速邮件的投递,并且在Qmail中得到支持。 Qmail的设计目标是在一台16M的机器上最终达到每天可以投递大约百万级数目的邮件。

可靠性:为了保证可靠性,Qmail只有在邮件被正确地写入到磁盘才返回处理成功的结果,这样即使在磁盘写入中发生系统崩溃或断电等情况,也可以保证邮件不被丢失,而是重新投递。

特别简单的虚拟域管理:甚至有一个第三方开发的称为vchkpw的add-on来支持虚拟POP域。使用这个软件包,POP3用户不需要具有系统的正式帐户。使用ezmlm支持用户自控制的邮件列表功能。

邮件用户和系统帐户隔离,为用户提供邮件帐户不需要为其设置系统帐户,从而增加了安全性。

2.Sendmail VS Qmail

首先:sendmail是发展历史悠久的MTA,当前的版本是8.10.2。当然,Sendmail在可移植性、稳定性及确保没有bug方面有一定的保证。但是Internet上有很多帖子都是关于如果攻击Sendmail,这对于管理员来说是一个噩梦。Sendmail在发展过程中产生了一批经验丰富的Sendmail管理员,并且 Sendmail有大量完整的文档资料,除了 Sendmail的宝典: OReillys sendmail book written by Bryan Costales with Eric Allman以外,网络上有大量的tutorial、FAQ和其他的资源。这些大量的文档对于很好的利用 Sendmail的各种特色功能是非常重要的。但是Sendmai当前来说是一个成熟的MTA。

当然,Sendmail具有一些缺点,其特色功能过多而导致配置文件的复杂性。当然,通过使用m4宏使配置文件的生成变的容易很多。但是,要掌握所有的配置选项是一个很不容易的事情。Sendmail在过去的版本中出现过很多安全漏洞,所以使管理员不得不赶快升级版本。而且 Sendmail的流行性也使其成为攻击的目标,这有好处也有坏处:这意味着安全漏洞可以很快地被发现,但是同样使Sendmail更加稳定和安全。另外一个问题是 Sendmail一般缺省配置都是具有最小的安全特性,从而使Sendmail往往容易被攻击。如果使用Sendmail,应该确保明白每个打开的选项的含义和影响。一旦你理解了Sendmail的工作原理,就Sendmail的安装和维护就变的非常容易了。通过 Sendmail的配置文件,用户实现完成一切可以想象得到的需求。

Qmail是一个选择,其在设计实现中特别考虑了安全问题。如果你需要一个快速的解决方案如,一个安全的邮件网关,则Qmail是一个很好的选择。Qmail和Sendmail的配置文件完全不同。而对于Qmail,其有自己的配置文件,配置目录中包含了5-30个不同的文件,各个文件实现对不同部分的配置(如虚拟域或虚拟主机等)。这些配置说明都在man中有很好的文档,但是Qmail的代码结构不是很好。

Qmail要比Sendmail小很多,其缺乏一些现今邮件服务器所具有的特色功能。如不象Sendmail,qmail不对邮件信封的发送者的域名进行验证,以确保域名的正确性。自身不提供对RBL的支持,而需要add-on来实现。,而Sendmail支持RBL。同样Qmail不能拒绝接收目的接收人不存在信件,而是先将邮件接收下来,然后返回查无此用户的的邮件。Qmail最大的问题就出在发送邮件给多个接收者的处理上。若发送一个很大的邮件给同一个域中的多个用户,Sendmail将只向目的邮件服务器发送一个邮件拷贝。而 Qmail将并行地连接多次,每次都发送一个拷贝给一个用户。若用户日常要发送大邮件给多个用户,使用Qmail将浪费很多带宽。可以这么认为:Sendmail优化节省带宽资源,Qmail优化节省时间。若用户系统有很好的带宽,Qmail将具有更好的性能,而如果用户系统的带宽资源有限,并且要发送很多邮件列表信息,则 Sendmail效率更高一些。Qmail不支持.forward(.forward在很多情况下对用户很有用处);不使用/var/spool/mail,而是将邮件存放在用户home目录。下面是一些使用Qmail不容易完成的工作,要使用Qmail完成这些工作,可能需要用户自己动手实现或者使用第三方提供的不够可靠的模块。

Qmail的源代码相对于Sendmail来说要更加容易理解,这对于希望深入到内部了解MTA机制的人员来说是一个优点。Qmail在安全性方面也要稳定一些。 Qmail有很好的技术支持,但是没有象Sendmail那样被广泛地应用和大量的管理员用户群。Qmail的安装不象Sendmail那样自动化,需要手工步骤。而且 Qmail的文档不如Sendmail那样完整和丰富。

Qmail的add-ons比 Sendmail要少一些。一般来说对于经验稍微少一些的管理员,选择Qmail相对要好一些。 Qmail要简单一些,而且其特色功能能满足一般用户的需求。Sendmail类似于office套件,80%的功能往往都不被使用。这就使Qmail在一些场合可能被更受欢迎一些,其具有一些Sendmail所没有的更流行和实用的特色功能,如:Qmail具有内置的 pop3支持。Qmail同样支持如主机或用户的伪装、虚拟域等等。Qmail的简单性也使配置相对容易一些。

Qmail被认为相对于Sendmail更加安全和高效,运行 Qmail的一台pentium机器一天可以处理大约 200,0000条消息。

Qmail相对于其他的MTA要简单很多,主要体现在:

(1)其他的MTA的邮件转发、邮件别名和邮件列表都是采用相互独立的机制,而qmail采用一种简单的转发(forwarding)机制来允许用户处理自己的邮件列表

(2)其他的MTA都提供快速而不安全的方式及慢的队列方式的邮件投递机制;而qmail发送是由新邮件的出现而触发的,所以其投递只有一种模式:快速的队列方式

(3)其他的MTA实际上包括一个特定版本的inetd来监控MTA的平均负载,而qmail设计了内部机制来限制系统负载,所以qmail-smtpd能安全地从系统的inet来运行sendmail有很多的商业支持,而且由于大量的用户群,在互联网上有大量的潜在技术支持。而 Qmail只有很有限的技术支持。有家公司提供对Qmail的支持,该公司同样提供了免费的add-ons,包括一个基于web的管理工具-QmailAdmin及一个通过vpopmail的对虚拟域的支持,甚至具有一个基于web的客户借接口— SqWebMail。

Qmail还具有一些其他的缺憾。如它不是完全遵从标准,它不支持DSN,作者认为DSN是一个即将消亡的技术,而 Qmail的VERP可以完成同样的工作,而又不象DSN依赖于其他主机的支持。Qmail另外一个问题是其不遵从支持7bit系统标准,而每次都发送8bit。若邮件接收一方不能处理这种情况,就会出现邮件乱码的情况。

从安全性来讲,Sendmail要比 Qmail差一些,Sendmail在发展中出现过很多很著名的安全漏洞;而Qmail相对要短小精悍,但是仍然提供了基本的STMP功能。而Qmail的代码注释要少一些。 Qmail的一个很好的特色是其支持一种可选的基于目录的邮件存储格式,而不是使用一个很大的文件来存储用户所有的邮件。若用户的邮件服务器进行很多的 POP3服务,则这种邮件存储格式可以提高效率。但是遗憾的是Pine自身并不支持这种存储格式,如果需要可以使用一些补丁来达到这个目的。

Qmail的优点是:每个用户都可以创建邮件列表而无须具有根用户的权限,如用户"foo"可以创建名为 foo-slashdot, foo-linux,foo-chickens的邮件列表,为了提供更好的功能,有一个叫 ezmlm(EZ Mailing List Maker)的工具可以支持自动注册和注销、索引等Majordomo所具有的各种功能,但是都是CLI驱动的,只需要编辑很少的文件。Qmail非常适合在小型系统下工作,一般只支持较少的用户或用来管理邮件列表。Qmail速度快并且简单:Qmail是当你希望安全切容易配置的最佳的选择;Qmail可以在2个小时内搞定配置,而Sendmail可能在两天内都搞不定。rocketmail internic等都使用qmail来构建。

三、ZMailer

ZMailer是一个高性能、多进程的Unix系统邮件程序。 [ a.k.a. MTA per X.400 parlance ],其可以从下面的服务器 b/unix/mail/zmailer/自由下载。其也是按照单块模式设计的。如Hotmail等邮件系统就是用Zmailer构建的。

四、Exim

Exim是由Cambridge大学开发的遵从GPL的MTA,其风格上类似与Smail 3,但是比Smail 3更加完善。当前最新版本是3.15。其主站点为。其最大的特点就是配置简单性,但是其安全性不如Qmail及Postfix。

下面是对几种MTA的特点的比较,综合的来讲,Qmail和 Postfix都是很不错的MTA,选择的标准往往是个人的喜好问题,Postfix发展历史要比Qmail迟一些。

MTA成熟性安全性特色性能 Sendmail兼容性模块化设计 qmail medium high high high addons yes Sendmail high low high low x no Postfix low high high high yes yes exim medium low high medium yes no

当然除了这里介绍的几种MTA以外,还有 Smail, Post.Office, the Sun Internet Mail Server(SIMS), MMDF, CommuniGate, PMDF, Netscape Messaging Server,Obtuse smtpd/smtpfwdd,Intermail,MD Switch等其他商业或者免费的MTA可以选择。

阅读剩余
THE END