搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

更新时间:2024-04-04 00:05:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

一、系统逻辑结构:xvxc

整个系统主要包括,用来发信的SMTP, 用来收信的POP3和IMAP, 其中Postfix在

整个系统中充当MTA的作用,而Dovecot则充当MDA的功能,它提供对外取信的接口,其中用户可以使用如下三种协议来取信:

? POP3 -- 110/993 ? IMAP -- 143/995 ? WEB-MAIL – 80/443

MySQL在系统中主要起的作用是存储邮件的虚拟域及磁盘配额等信息,而Extman则为管理员提供一个管理邮件的web界面,而Extmail则为普通用户提供相应的邮件操作功能。 Cyrus-SASL函数库主要是为SMTP发信进行验证,而它要操作数据库,则需要依赖于Courier-authlib来操作数据库,进而实现相应的验证操作。 接下来我们来看几种常见的操作的过程:

(1) 外部邮箱发邮件到本域。当外地邮件服务器发送邮件到本域时,如果满足要求则被本系统的postfix 软件接收处理,如果本系统加了邮件过滤什么的,它会阻止不满足要求的邮件,如果满足则postfix会自己去查询mysql,进而得到用户的收件箱,再将邮件存放到相应用户的邮件箱中[postfix会通过tcp/ip方式去查询mysql数据库]。

(2) 通过本域发送邮件。当用户想要通过本域来发送邮件时,需要先提供用户名和密码 到postfix, 接下来postfix会将用户名和密码通过Cyrus-SASL函数库来进行验证,由于 我们的验证信息存放在mysql中,所以Cyrus-SASL需要借助于Courier-authlib连接到 数据库,进而取得相应信息,如果验证失败,则拒绝发信,如果成功,则通过Postfix 的SMTP将信件发送到本域或其它邮件服务器中。

1

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

(3) 读取本域邮件。当用户想要从本域中读取自己的邮件时,它会通过网络(其前端操作 界面可以是Extmail等,也可自己开发) 发出请求到Dovecot, 接下来Dovecot会通过 查询mysql来验证用户的身份,如果验证通过,将会使用查询得到的用户邮箱地址, 进而进行收信操作。

二、具体安装过程。

1. (1)安装操作系统(我选的是CentOS-6)。安装时选择“Web Server”、“Dns Name Server”、“MySQL Database Server”、“Development Tools”和“Kernel Development”等 软件包组(“Core”和“Base”组是默认必选的软件包)。安装完成后一般需要装上如下 rpm包 (自己从操作系统光盘的Packages目录下查找): ? [root@Mail ~]# rpm -qa | grep postgresql ? postgresql-libs-8.1.22-1.el5_5.1 ? postgresql-devel-8.1.22-1.el5_5.1 ? postgresql-8.1.22-1.el5_5.1

? pexpect-2.3-3.el5 ? expect-5.43.0-5.1

? rpm -ivh libtool-ltdl-devel-1.5.22-6.1.i386.rpm

? rpm -ivh mysql-devel-5.0.45-7.el5.i386.rpm ? rpm -ivh openldap-servers-2.3.43-3.el5.i386.rpm ? rpm -ivh openldap-servers-sql-2.3.43-3.el5.i386.rpm

? rpm -ivh pcre-6.6-2.el5_1.7.i386.rpm

? rpm -ivh pcre-devel-6.6-2.el5_1.7.i386.rpm

(2) 关闭SEliux。

修改/etc/selinux/config文件中的SELINUX=\为 disabled ,然后重启,如果不想重 启系统,使用命令setenforce 0。注:setenforce 1 设置SELinux 成为enforcing模式 setenforce 0 设置SELinux 成为permissive模式。

在lilo或者grub的启动参数中增加:selinux=0,也可以关闭selinux 查看selinux状态:

[root@Mail postfix]# /usr/sbin/sestatus -v SELinux status: disabled 或者

setsebool httpd_disable_trans=1 setsebool mysqld_disable_trans=1

最好全关闭Selinux 并且重启机器

================================================== 2. 安装MySQL数据库。 (可以通过在安装系统时选择安装MySQL组件,或者用源码编译,也可以用rpm方式来进行安装)。

2

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

同时需要安装的组件还有:

[root@mail ~]# rpm -qa | grep mysql

? dovecot-mysql-2.0-0.10.beta6.20100630.el6.i686 ? mysql-server-5.1.47-4.el6.i686 ? mysql-devel-5.1.47-4.el6.i686 ? mysql-libs-5.1.47-4.el6.i686 ? mysql-5.1.47-4.el6.i686

? mysql-connector-odbc-5.1.5r1144-7.el6.i686 ? php-mysql-5.3.2-6.el6.i686

其中dovecot-mysql- 是我们稍候要安装的dovecot软件连接mysql数据库的必备 库,而mysql-server、mysql-devel、mysql-libs则是进行mysql相关开发的类库,而php-mysql则是php来连接mysql的必备库。 安装完成后必须搞清楚两个问题:

◆数据库库文件路径, 及众多的so文件, 一般在/usr/lib/mysql, 众多的头文件在/usr/include/mysql 中。

◆数据库运行时的数据目录,及众多的数据文件所在的目录。 /var/lib/mysql 安装完成后,要尝试着测试一下数据是否成功运行。

================================================== 3. 安装或配置postfix所需要的DNS服务器.

Postfix 寄信和收信必须依赖于DNS的正解和反解功能,postfix的smtp MDA必须要能够取得MX与A记录(由DNS解析服务器的正解操作得到),才决定收信主机的名称与ip地址,也就是说postfix至少要进行两次dns查询,第一次是为了取得MX主机名称,另一次是取得该主机名称对应的IP地址。由于postfix使用操作系统的resolver来访问DNS 服务器,因此运行postfix系统至少要能够访问一台DNS server, 且这台server能够解析你所在的域。

一般而言,我们可以通过修改/etc/hosts来修改主机名称,改后可用hostname来查本邮件服务器的主机名,其格式如下:

127.0.0.1 mail.yt.cmm localhost 192.168.137.30 mail.yt.cmm mail

然后我们可以通过修改/etc/resolver文件来修改dns服务器,可以修改为如下 nameserver 192.168.137.30 nameserver 61.139.2.69

我们可以使用三个命令行工具来查看我们的DNS配置是否有问题,分别是nslookup、dig以及host , 个人认为nslookup最好用,因为我们只需要在其中输入主机名,就可得到ip地址,输入IP地址就可得到对应的主机名。如: #nslookup

3

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

>mail.yt.cmm 192.168.137.30 >192.168.137.30 www.yt.cmm mail.yt.cmm >exit

如果我们的网络结构中已经有DNS服务器了,我们可以在上面注册我们的邮件主机,如果我们的域中还没有DNS服务器,我们就可以按下面的方式来创建DNS服务器 : (1) 安装dns服务器rpm包,可从系统光盘中获取. ? bind-chroot-9.7.0-5.P2.el6.i686 ? bind-9.7.0-5.P2.el6.i686 ? rpcbind-0.2.0-8.el6.i686 ? bind-utils-9.7.0-5.P2.el6.i686 ? bind-libs-9.7.0-5.P2.el6.i68

(2) 修改bind的配置文件,加入对我们邮件主机的支持(正解和反解)。

[root@mail ~]# cat /etc/named.conf // // named.conf // // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a localhost DNS resolver only). // // See /usr/share/doc/bind*/sample/ for example named configuration files. // options { listen-on port 53 { any; }; listen-on-v6 port 53 { ::1; }; directory \ dump-file \ statistics-file \ memstatistics-file \ allow-query { any; }; recursion yes; dnssec-enable yes; dnssec-validation yes; dnssec-lookaside auto; /* Path to ISC DLV key */ bindkeys-file \}; 4

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

logging { channel default_debug { file \ severity dynamic; }; }; zone \ type hint; file \}; #zone \# type master; # file \#}; zone \ type master; file \}; zone \yt.cmm\ type master; file \\}; zone \137.168.192.in-addr.arpa\ type master; file \named.192.168.137\}; include \[root@mail ~]# cat /var/named/named.yt.cmm $TTL 86400 @ IN SOA dns.yt.cmm. root.yt( 20020 ; 1H 10M 7D 1D) @ IN NS dns.yt.cmm. @ IN NS mail.yt.cmm. dns IN A 192.168.137.30 mail IN A 192.168.137.30 @ IN MX 10 mail 注: ns表示是别名, @表示的是要解析的域名,此处是 yt.cmm,此处的含义是yt.cmm有两个别5

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

名:mail.yt.cmm和dns.yt.cmm(注意后面给个.), 而这两个别名对应的主机地址都是192.168.137.30, 最后一句指定邮件处理的服务器 MX表示mail exchange. [root@mail named]# cat named.192.168.137 $TTL 86400 @ IN SOA dns.yt.cmm. root.yt( 20020 1H 10M 7D 1D) @ IN NS dns.yt.cmm. @ IN NS mail.yt.cmm. 30 IN PTR dns.yt.cmm. 30 IN PTR mail.yt.cmm. 此处的@代表在named.ca中配置的反身IP,即137.168.192, 后面的30实际表示的是ip地址: 30.137.168.192, 反向解析出来的域名是dns.yt.cmm或mail.yt.cmm。 (3) 启动dns服务器. /etc/init.d/named start (4) 使用nslookup命令进行测试,测试方法见最前面。

================================================== 4. 安装postfix.

如果系统中默认安装了sendmail,需要在安装postfix前将其停止,然后再进行安装,安装完成后再把sendmail卸载掉。[如果使用源文件的方式进行安装,参考我的另一篇文章]。

(1) 使用rpm方式安装postfix. rpm –ivh postfix-2.6.6-2.el6.i686

(2) 安装完成后,修改配置文件。 /etc/postfix/main.cf 主要修改如下参数:

? #邮件主机名称

myhostname = mail.yt.com

? #邮件队列存放位置(使用默认值即可)

queue_directory = /var/spool/postfix

? #邮件主机所属域, 发信时显示的发信源

mydomain = yt.com ? #邮件主机所在的网络

6

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

mynetworks = 192.168.137.0/24, 127.0.0.0/8 ? # 设定网域名称

myorign = $mydomain, $myhostname, 192.168.137.0/24 ? #设定能够收信的主机名称

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

mail.$mydomain, www.$mydomain, ftp.$mydomain

? #监听的网络地址,这里监听所有的网络介质

inet_interfaces = all ? #别名数据库(默认值)

alias_database = hash:/etc/aliases ? #别名列表

alias_maps = hash:/etc/aliases ? #邮件存放形式

home_mailbox = Maildir/ ? #虚拟邮件存放基目录

mail_spool_directory = /var/spool/mail

(3). 添加邮件用户的帐号 [后面加上sasl2安全验证后可以将此二用户删除] [root@mail ~]# groupadd yt

[root@mail ~]# useradd -g yt -s /sbin/nologin yt001 [root@mail ~]# useradd -g yt -s /sbin/nologin yt002 [root@mail ~]# passwd yt001

Changing password for user yt001. New UNIX password:

BAD PASSWORD: it is WAY too short Retype new UNIX password:

passwd: all authentication tokens updated successfully. [root@mail ~]# passwd yt002

Changing password for user yt002. New UNIX password:

BAD PASSWORD: it is WAY too short Retype new UNIX password:

passwd: all authentication tokens updated successfully. (4)启动相关服务,准备测试.

主要是启动域名解析(DNS)服务器和Postfix的服务。 /etc/init.d/postfix start 可以用 #netstat -napt 查看25端口是否打开 (5). 测试SMTP发送邮件

[root@mail ~]# telnet localhost 25 Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1).

7

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

Escape character is '^]'.

220 mail.zpp.com ESMTP Postfix helo localhost //宣告客户端地址 250 mail.zpp.com

mail from:yt001@yt.com //告知服务器发件人地址 250 2.1.0 Ok

rcpt to:yt002@yt.com //告知服务器收件人地址 250 2.1.5 Ok

Data //告知服务器要传送数据了 354 End data with . subject:I Love You! //主题 hello!

You are my super star! he he he ! //邮件内容以点结束 .

250 2.0.0 Ok: queued as 27ECCE01ED Quit //退出 221 2.0.0 Bye

Connection closed by foreign host.

现在我们到邮件用户yt002的宿主目录下进行查看,可以看到刚刚接收到的邮件保存在Maildir子目录中。

[root@mail ~]# cat /home/yt002/Maildir/new/1611777596.Vfd00I378920M248704.mail.yt.cmm Return-Path: //退信地址 X-Original-To: zpp002@zpp.com //来源地址 Delivered-To: zpp002@zpp.com //目标地址

Received: from localhost (localhost.localdomain [127.0.0.1])

by mail.zpp.com (Postfix) with SMTP id 27ECCE01ED //经过的MTA for ; Thu, 28 Jan 2021 03:57:40 +0800 (CST) subject:I Love You!

Message-Id: <20100127195752.27ECCE01ED@mail.zpp.com> Date: Thu, 02 Tuesday 2010 03:57:40 +0800 (CST) //时间 From: zpp001@zpp.com //发件人地址 To: undisclosed-recipients:; hello!

You are my super star! he he he !

如果看到此信息,那么恭喜你,你成功了!如果没有,我们也不要着急,我们可以通过如下方式来查看到底出了什么问题?

8

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

A. 使用postqueue 查看队列中邮件的情况,正常情况下,此队列中不应该存在邮件,因为这里面只是邮件的暂存地,所以这里面如果一直有邮件,则表示邮件发送过程中肯定出了问题,这时可以进行下面这步.

B. 通过查看/var/log/maillog和messages 日志,我们可以详细了解邮件发送的过程, 进而查找为什么邮件不能发送成功。

本阶段常见的问题:

(1) [root@yt yt001]# postqueue -p

-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient------- 186A7C24B1 347 Sat Dec 10 12:02:29 yt002@yt.com

(Host or domain name not found. Name service error for name=yt.com type=MX: Host not found, try again) yt001@yt.com

析:这是因为我们的dns服务器中mx设置出了问题,我们寄送邮件使用的是“账号@主机名称”的方式,

所以你的邮件服务器就必须有一个合法注册过的主机名称才可以。为什么呢?因为邮件服务器就是一部计算机主机,这部主机仍是利用TCP/IP来进行网络数据传输,当然需要IP。不过因为网络使用泛滥的种种因素,导致我们不允许直接利用主机的IP来寄信了,所以你就必须要有合法的主机名称。

那么我们的邮件服务器系统到底是如何使用 DNS 的信息来进行邮件的传递的? 在 DNS 中我们可以看到 MX 这个标志, 这个 MX 代表的是 Mail EXchanger, 当一封邮件要传送出去时,邮件主机会先分析那封信的『目标主机的 DNS 』,先取得 MX 标志, 注意,MX 标志可能会有多部主机喔!然后以最优先 MX 主机为准将信发送出去。 看不懂吗?没关系,我们以底下这个 DNS 范例来说: xyz.com.vbird IN MX 10 mail.xyz.com.vbird xyz.com.vbird IN MX 20 mail2.xyz.com.vbird xyz.com.vbird IN A aaa.bbb.ccc.ddd 假如上述的 DNS 设定是正常的,那么:

* 当有一封信要传给 user@xyz.com.vbird 时,由于 MX 标志最低者优先,所以该封信会先传送到 mail.xyz.com.vbird 那部主机。

* 如果 mail.xyz.com.vbird 由于种种原因,导致无法收下该封信时,该封信将以次要 MX 主机来传送,那就是传送到 mail2.xyz.com.vbird 那部主机上头;

* 如果两部 MX 主机都无法负责的话,那么该封信会直接以 A 的标志,亦即直接传送到 aaa.bbb.ccc.ddd 那个 IP 上头去, 也就是 xyz.com.vbird 本身啦!

在这个过程当中,你必需要注意到:mail.xyz.com.vbird 及 mail2.xyz.com.vbird 必需要是可以帮 xyz.com.vbird 转信的主机才行,也就是说,那两部主机通常是你公司的最上游的邮件主机, 并不是你随意填写的!那两部主机还需要针对你xyz.com.vbird 来设定『邮件转递』才行! 否则你的信会被踢掉的。

由于现在的很多邮件主机会去搜寻 MX 这个标志来判断目标邮件主机是否为合法,所以你要架设 Mail server 虽然不必自行设定 DNS 服务器,不过你最好要申请一个 MX 的标志才行。此外,MX 标志一定要设定正确,否则你的信件将可能会直接被 MX 主机踢掉。为了要设定 MX 但是我们没有上层邮件服务器时,所以你可以指定 MX 为自己,利用自己当 MX 主机即可。MX的优点很多,最大的优点就是类似路由器的功能,我们可以称之为邮件路由

9

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

(2) postfix发邮件时出现 loops back to myself错误解决

现象: (relay=none; status=bounced (mail for thehealthclub.com loops

back to myself)

分析: You must list myhostname under mydestination: mydestination = $myhostname localhost.$mydomain ? Otherwise you will have a mail loop.

mydestination参数设置可接收的邮件地址中的域名, 当出现上述问题时,多半是我们的邮件地址未在可接收的域内,所以需要在此处加上我们的域。来看下面的例子:

root@mail doc]$ telnet localhost 25 Trying 127.0.0.1?

Connected to localhost.localdomain (127.0.0.1). Escape character is ‘^]’. 220 mail.domain.com ESMTP Postfix ~~~~~~~~~~~~~~~~

postfix的远程投递代理smtp在联接到smtp端口后,检查上面波浪线的部分和myhostname是 否相同, 相同则认为是loop了.

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

5. 安装Dovecot .

MDA软件的主要功能是实现从用户信箱读取信件的工作,我们可以使用pop3或IMAP协议让MDA软件为我们读取信件 。如果用outlook或foxmail 不能正常收信,往往就是由于MDA软件安装不正确造成的。

(1).译安装Dovecot软件包 [最好使用原版光盘中的dovecot来安装]

Dovecot其实Red Hat5自带的有,但我这还是源码编译安装一个吧。从下面这个链接可以下载到我接下来要用到的源码包:

http://www.dovecot.org/releases/1.1/dovecot-1.1.4.tar.gz 安装的步骤很简单如下:

[root@mail ~]# useradd -M -s /sbin/nologin dovecot [root@mail ~]# tar zxf dovecot-1.1.4.tar.gz [root@mail ~]# cd dovecot-1.1.4

[root@mail dovecot-1.1.4]# ./configure --sysconfdir=/etc --with-mysql [root@mail dovecot-1.1.4]# make ; make install

说明:如果dovecot用户无法创建,说明系统中默认就有了直接用就可以了

(2). 配置Dovecot的运行参数

建立dovecot.conf配置文件并进行简单设置

[root@mail dovecot-1.1.4]# cp /etc/dovecot-example.conf /etc/dovecot.conf [root@mail dovecot-1.1.4]# cat /etc/dovecot.conf ? ?(此处省略)

10

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

ssl_disable = yes //禁用SSL机制

protocols = pop3 imap //制定支持的邮局协议 disable_plaintext_auth = no //允许明文密码认证

mail_location = maildir:~/Maildir //设置邮件存储格式及位置,此处必须与postfix中一致

? ?(此处省略)

(3).启动Dovecot服务,并查看其监听的TCP端口(110、143)

[root@mail ~]# /usr/local/sbin/dovecot -c /etc/dovecot.conf [root@mail ~]# netstat -nutpl | grep dovecot

tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 23251/dovecot

tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 23251/dovecot

说明:dorecot服务的启动程序位于“/usr/local/sbin”目录中,使用-c选项可以指定所使用的配置文件的位置,如果使用默认配置文件,则直接执行“dovecot”命令即可。

(4).测试POP3接收邮件

[root@mail ~]# telnet localhost 110 Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1). Escape character is '^]'. +OK Dovecot ready.

user yt002 //使用邮件用户“yt002”登录 +OK

pass 123.com //键入密码123.com +OK Logged in. List //查看邮件列表 +OK 1 messages: 1 485 .

retr 1 //收取并查看第一封邮件内容 +OK 485 octets

Return-Path: X-Original-To: zpp002@zpp.com Delivered-To: zpp002@zpp.com

Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.zpp.com (Postfix) with SMTP id 27ECCE01ED

for ; Thu, 28 Jan 2021 03:57:40 +0800 (CST) subject:I Love You!

Message-Id: <20210127195752.27ECCE01ED@mail.zpp.com>

11

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

Date: Thu, 28 Jan 2021 03:57:40 +0800 (CST) From: yt001@yt.cmm

To: undisclosed-recipients:; hello!

You are my super star! he he he ! . quit

+OK Logging out.

Connection closed by foreign host.

注意: pop3用户的密码不能设置的太短了,设置的太短了就不起作用了,就不能登录进系统了。

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

6. 配置postfix的虚拟域

(1) 创建相应的数据库。 我们可以从postfix提供的脚本来进行创建。

CREATE DATABASE postfix;

CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'choose_a_password'; GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost';

创建完成后,用postfix用户登录,经常会出现无法登录的情况,这是因为在mysql库的user表中存在用户名为postfix,而host为空的记录,我们只需要将其删除即可。

(2) 创建相应的表.

/*创建管理员表*/ mysql> desc admin;

+----------+--------------+------+-----+---------------------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------------------+-------+ | username | varchar(255) | NO | PRI | NULL | | | password | varchar(255) | NO | | NULL | | | created | datetime | NO | | 0000-00-00 00:00:00 | | | modified | datetime | NO | | 0000-00-00 00:00:00 | | | active | tinyint(1) | NO | | 1 | | +----------+--------------+------+-----+---------------------+-------+ DROP TABLE IF EXISTS `admin`; CREATE TABLE `admin` (

`username` varchar(255) NOT NULL, `password` varchar(255) NOT NULL,

`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `active` tinyint(1) NOT NULL DEFAULT '1',

12

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

PRIMARY KEY (`username`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Admins'; /*锁定表,插入记录*/

LOCK TABLES `admin` WRITE;

INSERT INTO `admin` VALUES ('admin@163.com','$1$2709f519$wlPsSKnrAqytQE.gDKCam1','2011-12-12 10:30:12','2011-12-12 10:30:12',1),('yt@yt.com','$1$90be40db$2ma9wPrTKjDylyUz3RYMa/','2011-12-12 10:37:16','2011-12-12 12:59:59',1); UNLOCK TABLES;

注意:这里的密码保存的是经过grup-md5-crypt加密后的字串,具体的使用方式如下: [root@mail ~]# grub-md5-crypt Password: Retype password: $1$iBX5Q0$kOpgUYH0bu3lrUjs/z0RZ0 如果我们想把某个用户的密码重置掉我们都可以使用此种方式将加密后的字串存到密码表中.

/*创建别名表*/

mysql> desc alias;+----------+--------------+------+-----+---------------------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------------------+-------+ | address | varchar(255) | NO | PRI | NULL | | | goto | text | NO | | NULL | | | domain | varchar(255) | NO | MUL | NULL | | | created | datetime | NO | | 0000-00-00 00:00:00 | | | modified | datetime | NO | | 0000-00-00 00:00:00 | | | active | tinyint(1) | NO | | 1 | | +----------+--------------+------+-----+---------------------+-------+ 6 rows in set (0.03 sec)

DROP TABLE IF EXISTS `alias`; CREATE TABLE `alias` (

`address` varchar(255) NOT NULL, `goto` text NOT NULL,

`domain` varchar(255) NOT NULL,

`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `active` tinyint(1) NOT NULL DEFAULT '1', PRIMARY KEY (`address`), KEY `domain` (`domain`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Aliases'; LOCK TABLES `alias` WRITE;

/*!40000 ALTER TABLE `alias` DISABLE KEYS */;

13

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

INSERT INTO `alias` VALUES ('mm@yt.com','mm@yt.com','yt.com','2011-12-12 13:00:33','2011-12-12 13:00:33',1),('mm2@yt.com','mm2@yt.com','yt.com','2011-12-12 13:01:19','2011-12-12 13:01:19',1); UNLOCK TABLES;

/*创建别名域表*/

+---------------+--------------+------+-----+---------------------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+--------------+------+-----+---------------------+-------+ | alias_domain | varchar(255) | NO | PRI | NULL | | | target_domain | varchar(255) | NO | MUL | NULL | | | created | datetime | NO | | 0000-00-00 00:00:00 | | | modified | datetime | NO | | 0000-00-00 00:00:00 | | | active | tinyint(1) | NO | MUL | 1 | | +---------------+--------------+------+-----+---------------------+-------+ DROP TABLE IF EXISTS `alias_domain`;

/*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `alias_domain` ( `alias_domain` varchar(255) NOT NULL, `target_domain` varchar(255) NOT NULL,

`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `active` tinyint(1) NOT NULL DEFAULT '1', PRIMARY KEY (`alias_domain`), KEY `active` (`active`),

KEY `target_domain` (`target_domain`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Domain Aliases';

LOCK TABLES `alias_domain` WRITE; UNLOCK TABLES;

/*配置信息表 */

DROP TABLE IF EXISTS `config`; CREATE TABLE `config` (

`id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL DEFAULT '', `value` varchar(20) NOT NULL DEFAULT '', PRIMARY KEY (`id`),

14

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

UNIQUE KEY `name` (`name`)

) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 COMMENT='PostfixAdmin settings';

LOCK TABLES `config` WRITE;

INSERT INTO `config` VALUES (1,'version','740'); UNLOCK TABLES;

/*域名配置表*/ mysql> desc domain;

+-------------+--------------+------+-----+---------------------+-------+ | Field | Type | Null | Key | Default | Extra | +------------- +--------------+------+-----+---------------------+-------+ | domain | varchar(255) | NO | PRI | NULL | | | description | varchar(255) | NO | | NULL | | | aliases | int(10) | NO | | 0 | | | mailboxes | int(10) | NO | | 0 | | | maxquota | bigint(20) | NO | | 0 | | | quota | bigint(20) | NO | | 0 | | | transport | varchar(255) | NO | | NULL | | | backupmx | tinyint(1) | NO | | 0 | | | created | datetime | NO | | 0000-00-00 00:00:00 | | | modified | datetime | NO | | 0000-00-00 00:00:00 | | | active | tinyint(1) | NO | | 1 | | +-------------+--------------+------+-----+---------------------+-------+ DROP TABLE IF EXISTS `domain`; CREATE TABLE `domain` ( `domain` varchar(255) NOT NULL,

`description` varchar(255) CHARACTER SET utf8 NOT NULL, `aliases` int(10) NOT NULL DEFAULT '0', `mailboxes` int(10) NOT NULL DEFAULT '0', `maxquota` bigint(20) NOT NULL DEFAULT '0', `quota` bigint(20) NOT NULL DEFAULT '0', `transport` varchar(255) NOT NULL,

`backupmx` tinyint(1) NOT NULL DEFAULT '0',

`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `active` tinyint(1) NOT NULL DEFAULT '1', PRIMARY KEY (`domain`)

15

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Domains'; /*!40101 SET character_set_client = @saved_cs_client */; LOCK TABLES `domain` WRITE;

INSERT INTO `domain` VALUES ('ALL','',0,0,0,0,'',0,'0000-00-00 00:00:00','0000-00-00 00:00:00',1),('yt.cmm','鐜夊爞',10,10,0,0,'virtual',0,'2011-12-12 10:31:20','2011-12-12 10:36:26',1),('yt.com','鐪熸槸

鐨?,10,10,0,0,'virtual',0,'2011-12-12 12:59:48','2011-12-14 09:48:35',1),('myt.com','',10,10,10,0,'virtual',0,'2011-12-14 09:04:03','2011-12-14 09:04:03',1); UNLOCK TABLES; /*域管理表*/

mysql> desc domain_admins;

+----------+--------------+------+-----+---------------------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------------------+-------+ | username | varchar(255) | NO | MUL | NULL | | | domain | varchar(255) | NO | | NULL | | | created | datetime | NO | | 0000-00-00 00:00:00 | | | active | tinyint(1) | NO | | 1 | |

+----------+--------------+------+-----+---------------------+-------+ DROP TABLE IF EXISTS `domain_admins`;

/*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `domain_admins` ( `username` varchar(255) NOT NULL, `domain` varchar(255) NOT NULL,

`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `active` tinyint(1) NOT NULL DEFAULT '1', KEY `username` (`username`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Domain Admins'; LOCK TABLES `domain_admins` WRITE;

INSERT INTO `domain_admins` VALUES ('admin@163.com','ALL','2011-12-12 10:30:12',1),

('yt@yt.com','yt.cmm','2011-12-12 12:59:59',1),('yt@yt.com','yt.com','2011-12-12 12:59:59',1);

UNLOCK TABLES; /**抓取邮件表*/

DROP TABLE IF EXISTS `fetchmail`; CREATE TABLE `fetchmail` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT, `mailbox` varchar(255) NOT NULL, `src_server` varchar(255) NOT NULL,

16

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

`src_auth` enum('password','kerberos_v5','kerberos','kerberos_v4','gssapi','cram-md5','otp','ntlm','msn','ssh','any') DEFAULT NULL,

`src_user` varchar(255) NOT NULL, `src_password` varchar(255) NOT NULL, `src_folder` varchar(255) NOT NULL,

`poll_time` int(11) unsigned NOT NULL DEFAULT '10', `fetchall` tinyint(1) unsigned NOT NULL DEFAULT '0', `keep` tinyint(1) unsigned NOT NULL DEFAULT '0',

`protocol` enum('POP3','IMAP','POP2','ETRN','AUTO') DEFAULT NULL, `usessl` tinyint(1) unsigned NOT NULL DEFAULT '0', `extra_options` text, `returned_text` text,

`mda` varchar(255) NOT NULL,

`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1; LOCK TABLES `fetchmail` WRITE; UNLOCK TABLES; /*日志表*/ mysql> desc log;

+-----------+--------------+------+-----+---------------------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+--------------+------+-----+---------------------+-------+ | timestamp | datetime | NO | MUL | 0000-00-00 00:00:00 | | | username | varchar(255) | NO | | NULL | | | domain | varchar(255) | NO | | NULL | | | action | varchar(255) | NO | | NULL | | | data | text | NO | | NULL | |

+-----------+--------------+------+-----+---------------------+-------+ DROP TABLE IF EXISTS `log`; CREATE TABLE `log` (

`timestamp` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `username` varchar(255) NOT NULL, `domain` varchar(255) NOT NULL, `action` varchar(255) NOT NULL, `data` text NOT NULL, KEY `timestamp` (`timestamp`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Log';

17

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

LOCK TABLES `log` WRITE;

INSERT INTO `log` VALUES ('2011-12-12 13:00:33','admin@163.com

(192.168.137.1)','yt.com','create_mailbox','mm@yt.com'),('2011-12-12 13:01:19','admin@163.com (192.168.137.1)','yt.com','create_mailbox','mm2@yt.com'),('2011-12-12 23:43:06','mm2@yt.com (192.168.137.1)','yt.com','edit_password','mm2@yt.com'),('2011-12-13 06:09:33','admin@163.com (192.168.137.1)','yt.com','edit_mailbox','mm2@yt.com'),('2011-12-14 09:06:07','admin@163.com (192.168.137.1)','myt.com','create_alias','ftm@myt.com -> m@yt.com'); UNLOCK TABLES; /*邮件箱表*/ mysql> desc mailbox;

+------------+--------------+------+-----+---------------------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------------------+-------+ | username | varchar(255) | NO | PRI | NULL | | | password | varchar(255) | NO | | NULL | | | name | varchar(255) | NO | | NULL | | | maildir | varchar(255) | NO | | NULL | | | quota | bigint(20) | NO | | 0 | | | local_part | varchar(255) | NO | | NULL | | | domain | varchar(255) | NO | MUL | NULL | | | created | datetime | NO | | 0000-00-00 00:00:00 | | | modified | datetime | NO | | 0000-00-00 00:00:00 | | | active | tinyint(1) | NO | | 1 | |

+------------+--------------+------+-----+---------------------+-------+ DROP TABLE IF EXISTS `mailbox`;

/*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `mailbox` ( `username` varchar(255) NOT NULL, `password` varchar(255) NOT NULL,

`name` varchar(255) CHARACTER SET utf8 NOT NULL, `maildir` varchar(255) NOT NULL,

`quota` bigint(20) NOT NULL DEFAULT '0', `local_part` varchar(255) NOT NULL, `domain` varchar(255) NOT NULL,

`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `active` tinyint(1) NOT NULL DEFAULT '1',

18

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

PRIMARY KEY (`username`), KEY `domain` (`domain`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Mailboxes'; LOCK TABLES `mailbox` WRITE;

INSERT INTO `mailbox` VALUES ('mm@yt.com','$1$ba4c2966$Xamg4aeMTEyYu7My9tY2g0','灏忎簲

','yt.com/mm/',0,'mm','yt.com','2011-12-12 13:00:33','2011-12-12 13:00:33',1),('mm2@yt.com', '$1$698466ef$jE9tVGrNvD1.4wbOL1XHj1','','yt.com/mm2/',0,'mm2','yt.com','2011-12-12

13:01:19','2011-12-13 06:09:33',1),('m3@yt.com','m3','','yt.com/m3',0,'','','0000-00-00 00:00:00','0000-00-00 00:00:00',1); UNLOCK TABLES; /*用户配额表*/ mysql> desc quota;

+----------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+-------+ | username | varchar(255) | NO | PRI | NULL | | | path | varchar(100) | NO | PRI | NULL | | | current | bigint(20) | YES | | NULL | | +----------+--------------+------+-----+---------+-------+ DROP TABLE IF EXISTS `quota`; CREATE TABLE `quota` (

`username` varchar(255) NOT NULL, `path` varchar(100) NOT NULL, `current` bigint(20) DEFAULT NULL, PRIMARY KEY (`username`,`path`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1; LOCK TABLES `quota` WRITE; UNLOCK TABLES; /*邮箱配额表2*/

DROP TABLE IF EXISTS `quota2`; CREATE TABLE `quota2` (

`username` varchar(100) NOT NULL, `bytes` bigint(20) NOT NULL DEFAULT '0', `messages` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`username`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1; LOCK TABLES `quota2` WRITE; UNLOCK TABLES;

19

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

/*创建自动回复表*/ mysql> desc vacation;

+---------+--------------+------+-----+---------------------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------------------+-------+ | email | varchar(255) | NO | PRI | NULL | | | subject | varchar(255) | NO | | NULL | | | body | text | NO | | NULL | | | cache | text | NO | | NULL | | | domain | varchar(255) | NO | | NULL | | | created | datetime | NO | | 0000-00-00 00:00:00 | | | active | tinyint(1) | NO | | 1 | |

+---------+--------------+------+-----+---------------------+-------+ DROP TABLE IF EXISTS `vacation`; CREATE TABLE `vacation` ( `email` varchar(255) NOT NULL,

`subject` varchar(255) CHARACTER SET utf8 NOT NULL, `body` text CHARACTER SET utf8 NOT NULL, `cache` text NOT NULL,

`domain` varchar(255) NOT NULL,

`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `active` tinyint(1) NOT NULL DEFAULT '1', PRIMARY KEY (`email`), KEY `email` (`email`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Vacation'; LOCK TABLES `vacation` WRITE; UNLOCK TABLES;

/*创建vacation_notification表*/

DROP TABLE IF EXISTS `vacation_notification`;

/*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `vacation_notification` (

`on_vacation` varchar(255) CHARACTER SET latin1 NOT NULL, `notified` varchar(255) CHARACTER SET latin1 NOT NULL,

`notified_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`on_vacation`,`notified`),

CONSTRAINT `vacation_notification_pkey` FOREIGN KEY (`on_vacation`) REFERENCES `vacation` (`email`) ON DELETE CASCADE

20

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Postfix Admin - Virtual Vacation Notifications';

(3) 修改postfix的main.cf, 添加虚拟用户的支持.

#=====================Virtual Mailbox Setting============== #虚拟邮箱的基准目录,虚拟用户的邮件将存放在此基准目录中 virtual_mailbox_base = /var/spool/mail #虚拟邮箱配置

virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf #虚拟域配置

virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf #用户别名配置

virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf #域别名配置

virtual_alias_domains = mysql:/etc/postfix/mysql_virtual_alias_domains_maps.cf #虚拟用户的最小ID, 其默认值是500, 如果不修改则所有的用户邮件将会被忽略 virtual_minimum_uid = 80 #虚拟用户映射的本地用户id virtual_uid_maps = static:89 #虚拟用户映射的本地用户组id virtual_gid_maps = static:89

#虚拟域转发方式

virtual_transport = virtual

maildrop_destination_recipient_limit = 1 maildrop_destination_concurrency_limit = 1

#磁盘配额

virtual_mailbox_limit = 51200000 virtual_create_maildirsize = yes virtual_mailbox_extended = yes

virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf virtual_mailbox_limit_override = yes

virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.

virtual_overquota_bounce = yes

[postfix是直接连接到mysql的,我们需要确保其使用TCP/IP方式] 设置Postfix MySQL映射

在文档中你需要尽早地告知Postfix控制信息被存放到数据库的什么位置。因此你需要在 /etc/postfix 目录中创建下列4个为本文件。在下面的我们创建的文件中,我们明确使用 127.0.0.1 替代localhost作为hosts域。这是因为 Postfix 运行时改变了系统目录结构。如果你指 定localhost Postfix就会试图使用在/var/run/mysql目录中的unix socket 连接到MySQL的值守程 序,这将是不能访问的。使用127.0.0.1强制Postfix用 TCP/IP socket连接,将保证在改变系统

21

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

目录结构后仍能正常工作。

A. 虚拟邮箱映射mysql_virtual_mailbox_maps.cf [在username列和maildir查询邮箱表间建立映射]

user = postfix

password = postfixpassword hosts = 127.0.0.1 dbname = postfix table = mailbox

select_field = maildir where_field = username

#additional_conditions = and active = '1'

B. 创建虚拟别名映射 mysql_virtual_alias_maps.cf

Postfix 为虚拟别名映射使用这个文件,映射的左手边是where_field ,右手边是select_field。在这个文件中会在 address 列和 goto 列产生映射。

user = postfix

password = postfixpassword hosts = 127.0.0.1 dbname = postfix table = alias

select_field = goto where_field = address

C.虚拟域映射 mysql_virtual_domains_maps.cf

Posfix 仅仅使用这张表中的domain。对于这些域,我们不需要映射LHS 和 RHS user = postfix

password = postfixpassword hosts = 127.0.0.1 dbname = postfix table = domain

select_field = domain where_field = domain

#additional_conditions = and backupmx = '0' and active = '1'

E. 虚拟邮箱引用映射 mysql_virtual_mailbox_limit_maps.cf

Postfix利用此映射为虚拟邮箱控制引用。在 mailbox表中Username 列和 quota列建立映射。 user = postfix

password = postfixpassword hosts = 127.0.0.1 dbname = postfix table = mailbox

select_field = quota

where_field = username

#additional_conditions = and active = '1'

F. 转发域映射 mysql_relay_domains_maps.cf

如果您使用您的邮件系统仅仅为了主机对一些虚拟域备份MX,那么您需要这个映射来告知Postfix为这些域转发信件。 user = postfix

password = postfixpassword hosts = 127.0.0.1 dbname = postfix table = domain

select_field = domain where_field = domain

#additional_conditions = and backupmx = '1'

22

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

创建虚拟邮件用户 [如需要]

#groupadd -g 5000 vmail$ sudo useradd -m -g vmail -u 5000 -d /home/vmail

-s /bin/bash vmail

在main中的用户id是89, 表示使用系统的postfix作为邮件系统的用户,否则的话我们可以使用上面的方式来创建虚拟邮件的本地映射。

修改前期Postfix的值

main.cf文件控制了Postfix数百个配置参数。这些参数都被配成了默认初始值。我们需要配置下列参数。

$ sudo editor /etc/postfix/main.cf

#The host name where your MX for virtual domains will point to myhostname = mail.domain.com

mydestination = #Remains blank since we are going to host virtual domains

relayhost = #Remains blank unless you are going to use your ISP's SMTP server mail

sending out mails. In which case it would be set to the host name of the ISP's SMTP server

下列参数保持初始默认值。

alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases myorigin = /etc/mailname mynetworks = all

mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all

注意:标识为#的地方,需要将其注释掉,因为它不能和虚拟的设置一起存在. warning: do not list domain in BOTH mydestination and virtual_mailbox_domains postfix提示:warning: do not list domain in BOTH mydestination and virtual_mailbox_domains 根据提示,是说我的mydestination选项和mysql里面的virtual_mailbox_domain出现冲突,2者留其一。 分析原因:是系统域名与虚拟帐户的域名冲突了,而mydestination会自动根据机器名生成,因此如果不希望使用它的话,应将其设为空: postconf -e mydestination= 或者手动编辑一下main.cf,加入mydestination= ==============================================================================

7. 配置devecot的虚拟域 (1) 修改主配置文件 dovecot.conf.

base_dir = /var/run/dovecot protocols = imap imaps pop3 pop3s listen = *

disable_plaintext_auth = no shutdown_clients = yes log_path = /var/log/dovecot.log ssl = no

mail_location = maildir:/var/spool/mail/%d/%n #必须是postfix.conf中virtual_mailbox_base

变量/%d/%n 这样才能将信箱的位置指定正确,这样也才能收到信

auth default {

mechanisms = plain login cram-md5 passdb sql {

args = /etc/dovecot-mysql.conf }

userdb sql {

23

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

args = /usr/local/etc/dovecot-mysql.conf }

socket listen { client {

path = /var/spool/postfix/private/auth

mode = 0660

user = postfix group = postfix } } }

first_valid_uid =80

dovecot的mysql配置文件

# vim dovecot-mysql.conf driver = mysql

# host 后的sock文件需要先用locate mysql.sock 查找到其确切的位置

connect = host=/var/lib/mysql/mysql.sock dbname=postfix user=postfix password=postfix

default_pass_scheme = MD5 #必须指定,因为我们保存用户时就是用md5加密了的

password_query = SELECT password FROM mailbox WHERE username = '%u' user_query = SELECT maildir, 201 AS uid, 202 AS gid FROM mailbox

WHERE username = '%u' =============找不到 mysql.sock 的处理方法! Got an error: Connection error: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' mysql.sock 突然消失算是常见的问题,如果是第一次安装MySQL后运行时出现,那只要找出 mysql.sock 在哪里就可以了。 以上的信息表明,mysql.sock应该是在 /var/lib/mysql/ 下 ,如果你找了没找到就: #locate mysql.sock 就会出来了,接着你就可以 #mysqladmin -S /路径/mysql.sock -u root Dec 13 01:26:50 mail dovecot: pop3(mm2@yt.com): Error: user mm2@yt.com: Initialization failed: Initializing mail storage from mail_location setting failed: Ambiguous mail location setting, don't know what to do with it: Maildir/ (try prefixing it with mbox: or maildir:) 主要原因是,在使用基于mysql的虚拟用户时,dovecot的dovecot.cf中的mail_location配置错误,应该将其配置成一个具体的可到达的值,通常是以如下形式表示 : virtual_mailbox_base = /var/spool/mail 即mail_location = maildir:/var/spool/mail/%d/%n/Maildir 后面的Maildir表示虚拟用户自己的目录 。

接下来我们可以使用telnet命令来重新进行测试.

至此,我们已经让我们的postfix和 dovecot支持mysql管理的虚拟域了,但这还存在一个问题:就是用户在用smtp发信时并没有进行认证,所以邮件主机完全可能被当作垃圾中转战,这显然不是我们需要的。接下来我们就可以通过安装认证机制来解决这个问题。

7.安装验证库courier-authlib , 需要从相关风站下载安装

# tar -jxvf courier-authlib-0.63.1.20110619.tar.bz2 (建议安装courier-authlib-0.63.0.tar.bz2)

24

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

最新版为courier-authlib-0.63.1.20110619.tar.bz2 下载地址为: http://www.courier-mta.org/download.php#authlib

注意:这是最新的软件包,可能存在bug,我在编译过程中没有通过(错误现象在下面有描述),最后尝试改为courier-authlib-0.63.0.tar.bz2后,成功make,建议直接安装courier-authlib-0.63.0.tar.bz2 # cd courier-authlib-0.63.0 # ./configure \\

--prefix=/usr/local/courier-authlib \\ --without-stdheaderdir \\ --without-authuserdb \\ --without-authpam \\ --without-authldap \\ --without-authpwd \\ --without-authshadow \\ --without-authvchkpw \\ --without-authpgsql \\ --without-authcustom \\ --with-authmysql \\

--with-mysql-libs=/usr/local/mysql/lib \\ 此处路径根据自己的配置环境而定!! --with-mysql-includes=/usr/local/mysql/include \\ 此处路径根据自己的配置环境而定!! --with-redhat \\

--with-mailuser=postfix \\ 此二行也根据自己的实际情况决定(数据库用户和密码) --with-mailgroup=postfix

若编译前的配置时出错,如下示:

configure: error: Unable to find ltdl.h. Please install Libtool's ltdl library

分析得知这是缺少libtool-ltde-devel包所致 configure: error: --with-authmysql specified but no mysqlclient.so ========================== mysql-devel-5.1.47-4.el6.i686.rpm ===================================== ./../depcomp: line 611: exec: g++: not found make[3]: *** [testgdbm.o] 错误 127 make[3]: Leaving directory `/mnt/winshare/courier-authlib/gdbmobj' make[2]: *** [all] 错误 2 make[2]: Leaving directory `/mnt/winshare/courier-authlib/gdbmobj' make[1]: *** [all-recursive] 错误 1 make[1]: Leaving directory `/mnt/winshare/courier-authlib' 解决办法: yum install -y gcc-c++

◆ 如果是用 RPM 安装的话,就必须敲这条命令 chmod 755 /usr/local/courier-authlib/var/spool/authdaemon 该目录权限不正确修改,maildrop及postfix等将无法正确获取用户的信息及密码认证。)

25

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

Aug 1 16:42:02 mail postfix/master[6766]: warning: process /usr/lib/postfix/trivial-rewrite

pid 7092 exit status 1

Aug 1 16:42:02 mail postfix/master[6766]: warning: /usr/lib/postfix/trivial-rewrite:

bad command startup -- throttling

Aug 1 16:43:02 mail postfix/trivial-rewrite[7094]: warning: connect to mysql server localhost:

Cant connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' #解决、把mysql_virtual_*.cf下的hosts全部改为hosts=127.0.0.1[因为如果使用localhost则是用unix连接主机,而用ip地址则是使用tcp/ip方式连接]

cd /etc/postfix/

vim mysql_virtual_alias_maps.cf vim mysql_virtual_domains_maps.cf vim mysql_virtual_mailbox_maps.cf vim mysql_virtual_sender_maps.cf #错误7:

apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.0.234 for ServerName

... waiting apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.0.234 for ServerName do #解决:

echo \

#错误8:sql_select option missing(此错误)对服务器的影响不大,还未发现运行异常,不过可以添加以下排除错误

tail -f /var/log/auth.log #报错

Aug 4 17:50:40 mail postfix/smtpd[1932]: sql_select option missing

Aug 4 17:50:40 mail postfix/smtpd[1932]: auxpropfunc error no mechanism available Aug 4 17:50:40 mail postfix/smtpd[1932]: _sasl_plugin_load failed

on sasl_auxprop_plug_init for plugin: sql do #错误9、

# cat /usr/local/lib/sasl2/smtpd.conf auxprop_plugin: mysql sql_hostnames: 127.0.0.1 sql_user: extmail

sql_password: extmail sql_database: extmail log_level:7

sql_select: SELECT password FROM mailbox WHERE username='%u@%r' and domain='%r' #将原有的smtpd.conf配置文件添加以上内容(蓝色字体)后,此日志显示消失。 #添加后,执行telnet localhost 25,日志如下,一切正常

tail -f /var/log/auth.log

Aug 4 17:51:44 mail postfix/smtpd[2099]: sql auxprop plugin using mysql engine #错误10、fatal: no SASL authentication mechanisms

apt-get remove libsasl2-modules * #报错,无法正常连接smtp,“fatal: no SASL authentication mechanisms”,说明postfix还是依赖此模块的 smtp--->sasl---->authmysql----->authmysqllib #错误11、connect() : No such file or directory

root@mail:/home/zhangyq# testsaslauthd -u zaza@extmail.com -p 123456 -s smtp connect() : No such file or directory

#说明testsaslauthd没有找到认证的入口,出现这种错误通常是修改了/etc/default/saslauthd中OPTIONS默认的路径造成的

31

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

testsaslauthd -u zaza@extmail.org -p 123456 -s smtp -f /var/spool/postfix/var/run/saslauthd/mux #改变socket路径即可

#错误12、PAM unable to dlopen(/lib/security/pam_mysql.so)

grep -R pam_mysql /var/log/

/var/log/auth.log:Aug 4 10:29:21 mail saslauthd[2543]: PAM unable to

dlopen(/lib/security/pam_mysql.so): /lib/security/pam_mysql.so: cannot open shared object file: No such file or directory

/var/log/auth.log:Aug 4 10:29:21 mail saslauthd[2543]: PAM adding faulty module: /lib/security/pam_mysql.so #解决 apt-get install libpam-mysql

附:启动脚本 #!/bin/sh

prog=mail start(){

echo $\ #查看mysql是否正在运行 EXISTS_MYSQL=`pidof mysqld` if [[ ${EXISTS_MYSQL} > 0 ]] ; then echo \已经在运行中!...\ else

echo \ /etc/init.d/mysqld start fi

#查看courier-authlib运行状态

EXISTS_COURIER_AUTHLIB=`pidof authdaemond | awk -F ' ' '{print $1}'` if [[ ${EXISTS_COURIER_AUTHLIB} > 0 ]] ; then echo \已经在运行中!...\ else

echo \ /etc/init.d/courier-authlib start fi

#查看sasl2是否在运行状态

EXISTS_SASL2=`pidof saslauthd | awk -F ' ' '{print $1}'` if [[ ${EXISTS_SASL2} > 0 ]] ; then echo \已经在运行中!...\ else

echo \ /etc/init.d/saslauthd start fi

32

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

#查看named是否在运行状态 EXISTS_NAMED=`pidof named` if [[ ${EXISTS_NAMED} > 0 ]] ; then echo \已经在运行中!...\ else

echo \ /etc/init.d/named start fi

#查看postfix是否在运行状态 EXISTS_POSTFIX=`pidof master` if [[ ${EXISTS_POSTFIX} > 0 ]] ; then echo \已经在运行中!...\ else

echo \ /etc/init.d/postfix start fi

#查看dovecot是否在运行状态 EXISTS_DOVECOT=`pidof dovecot` if [[ ${EXISTS_DOVECOT} > 0 ]] ; then echo \已经在运行中!...\ else

echo \ /etc/init.d/dovecot start fi

echo \相关软件启动完成!..........\} stop(){

echo $\ #查看mysql是否正在运行 EXISTS_MYSQL=`pidof mysqld` if [[ ${EXISTS_MYSQL} > 0 ]] ; then echo \停止MySQL服务!...\ /etc/init.d/mysqld stop else

echo \未在运行中 ... \ fi

#查看courier-authlib运行状态

EXISTS_COURIER_AUTHLIB=`pidof authdaemond | awk -F ' ' '{print $1}'`

33

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

if [[ ${EXISTS_COURIER_AUTHLIB} > 0 ]] ; then echo \停止中!...\ /etc/init.d/courier-authlib stop else

echo \未在运行中 ...\ fi

#查看sasl2是否在运行状态

EXISTS_SASL2=`pidof saslauthd | awk -F ' ' '{print $1}'` if [[ ${EXISTS_SASL2} > 0 ]] ; then echo \停止中!...\ /etc/init.d/saslauthd stop else

echo \未在运行中!...\ fi

#查看named是否在运行状态 EXISTS_NAMED=`pidof named` if [[ ${EXISTS_NAMED} > 0 ]] ; then echo \停止中!...\ /etc/init.d/named stop else

echo \未在运行中!...\ fi

#查看postfix是否在运行状态 EXISTS_POSTFIX=`pidof master` if [[ ${EXISTS_POSTFIX} > 0 ]] ; then echo \停止Postfix!...\ /etc/init.d/postfix stop else

echo \未在运行中!...\ fi

#查看dovecot是否在运行状态 EXISTS_DOVECOT=`pidof dovecot` if [[ ${EXISTS_DOVECOT} > 0 ]] ; then echo \停止中!...\ /etc/init.d/dovecot stop else

echo \未在运行中!...\ fi

34

(精)搭建postfix+dovecot+ courier-authlib+sasl2+mysql邮件系统

echo \相关软件停止完成!..........\} restart(){

echo -n $\ echo \

echo -n $\ echo \}

#see how we were called

case \ start) start ;; stop) stop ;; restart) stop start ;; *)

echo $\esac

35

本文来源:https://www.bwwdw.com/article/lkvr.html

Top