debian下如何搭建postfix和extmail

来源:百度文库 编辑:神马文学网 时间:2024/05/15 19:55:28
 在刚开始搭建时,遇到了很多的困难,这远比我想象的要难,尤其还要满足公司的需要,我看了一些资料,包括Postfix权威指南,看了sery的博文,看了些官方的文档,只不过是在centos上搭建的,和debian的环境有很多不同之处,这在开始给我带来了很多的麻烦,望以后想搭建的朋友,应该选择一个自己较熟悉的系统平台进行测试,我是没法子,还有在这里还有提醒一下朋友,在上手之前一定要把邮件系统的知识掌握到一定的程度。 以下是用到的一些软件: 名称 用途 下载地址 Apache (httpd-2.2.0) Web方式管理邮件 [url]www.apache.org[/url] Php (php-5.2.3) Php 解释器,与apache一起使用 [url]www.php.org[/url] Mysql (mysql-5.0.41) 用数据库存储用户信息 [url]www.mysql.com[/url] extman(postfix-2.1.0) 邮件帐号后台web管理工具 [url]http://sourceforge.net/projects/postfixadmin/[/url] SASL(cyrus-sasl-2.1.21.tar.gz) 验证方法 [url]http://ftp.andrew.cmu.edu/pub/cyrus-mail/[/url] Authlib(courier-authlib-0.59.3.tar.bz2) 与SASL一起做验证 [url]http://www.courier-mta.org/download.php[/url] Postfix 邮件系统主程序 [url]http://www.postfix.org[/url] Courier-imap (courier-imap-4.1.3.tar.bz2) Pop3及IMAP服务 [url]http://www.courier-mta.org/[/url]   Perl (perl-5.8.8) 解释器 [url]http://www.cpan.org[/url] Maildrop (maildrop-2.0.4.tar.bz2) 邮件投递代理,直观的讲就是把收到的邮件转发到用户的邮箱目录 [url]http://www.courier-mta.org/[/url] Pcre (pcre-7.2.tar.bz2) 安装Imap需要-- Perl兼容正则表达式 [url]http://www.pcre.or[/url]g Extmail (extmail-1.0.1.tar.gz) webmail [url]http://www.extmail.org[/url]  源文档 <[url]http://sery.blog.51cto.com/10037/45500[/url]> 下面我用表格的方式列出postfix系统所需要创建的用户及组的情况: 用户名 组名 作用 备注 mysql Mysql,extmail,extman 数据库mysql运行用户,界面与后台默认用户   vmail Vmail Postfix虚拟邮件帐号所使用的用户及组 uid,gid:2000,2000 postfix Postfix Postfix主程序使用的帐号和组     Postdrop Postfix  setgid_group setgid_group=postdrop  源文档 <[url]http://sery.blog.51cto.com/10037/45500[/url]>   上面用到的用户必须要有 在这里用到的一些基本包就不罗列了,像postfix ,apache,等,就用apt-get 进行安装,途中报错,注意提示信息,细心就可以了,这里再次强调版本的一致性。下面就直接进入正题了,注:有些地方我摘要的是官方文档的内容,如有笔误敬请谅解#####################################################################################一。在/etc/postfix/main.cf中增加的内容下面是SSL认证的部分smtpd_sasl_auth_enable = yessmtpd_sasl_security_options = noanonymous broken_sasl_auth_clients= yessmtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destinationsmtpd_client_restrictions = permit_sasl_authenticated#smtpd_sasl_local_domain = $mydomain 下面是结合mysql,extmail,extman 的要求进行配置,细节后面会说 # bannermail_name = Postfix - by XXXX.comsmtpd_banner = $myhostname ESMTP $mail_name # response immediatelysmtpd_error_sleep_time = 0sunknown_local_recipient_reject_code = 450 # extmail config herevirtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cfvirtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cfvirtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cfvirtual_transport = maildrop                          //这里没有冒号,指定邮件的relay方式virtual_mailbox_base = /home/domains/virtual_gid_maps=static:2000                   //注意对应virtual_uid_maps=static:2000readme_directory = /usr/share/doc/postfixhtml_directory = /usr/share/doc/postfix/html #====================QUOTA========================  //磁盘配额的设置message_size_limit = 14336000virtual_mailbox_limit = 1000000000       //默认的大小virtual_create_maildirsize = yesvirtual_mailbox_extended = yes       //是否允许超越默认的大小virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cfvirtual_mailbox_limit_override = yesvirtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.virtual_overquota_bounce = yes##########################################################################################下面是手动加的,和上面的对应编辑mysql_virtual_alias_maps.cfvi /etc/postfix/mysql_virtual_alias_maps.cf 内容如下: user = extmailpassword = extmailhosts = mail.xxxx.comdbname = extmailtable = aliasselect_field = gotowhere_field = address 编辑mysql_virtual_domains_maps.cfvi /etc/postfix/mysql_virtual_domains_maps.cf 内容如下: user = extmailpassword = extmailhosts = mail.xxxx.comdbname = extmailtable = domainselect_field = de.ionwhere_field = domain#additional_conditions = and backupmx ='0' and active ='1' 编辑mysql_virtual_mailbox_maps.cfvi /etc/postfix/mysql_virtual_mailbox_maps.cf内容如下: user = extmailpassword = extmailhosts = mail.xxxx.comdbname = extmailtable = mailboxselect_field = maildirwhere_field = username#additional_conditions = and active = '1' 编辑/etc/postfix/mysql_virtual_limit_maps.cf user = extmailpassword = extmail hosts = 127.0.0.1  //这里最好指ip dbname = extmailtable = mailboxselect_field = quotawhere_field = usernameadditional_conditions = AND active = '1' ################################################################################################3 二。安装cyrus-sasl2 apt-get install libsasl2 libsasl2-modules libsasl2-modules-sql  >创建/etc/postfix/sasl/smtpd.conf 加入下面的内容 pwcheck_method: authdaemond  //认证的方式log_level: 3mech_list: PLAIN LOGINauthdaemond_path:/var/run/courier/authdaemon/socket  //注意路径   ##################################################################################################################### 三。安装Courier-Authlib 运行如下命令安装相关软件包 apt-get install libtool       apt-get install courier-authlibapt-get install courier-authlib-devapt-get install courier-authlib-mysql mail:/etc/courier# pwd/etc/couriermail:/etc/courier# less authdaemonrc DEBUG_LOGIN=2     //会生成详细的错误报告,之后置零 修改etc/courier/authdaemon  //里面进行指定mysql的指定 主要关系到认证authmodulelist="authmysql"authmodulelistorig="authmysql" 编辑/etc/courier/authmysqlrc文件,并将其内容清空,然后增加如下内容: MYSQL_SERVER            mail.xxxx.comMYSQL_USERNAME          extmailMYSQL_PASSWORD          extmail MYSQL_SOCKET            /var/run/mysql/mysql.sock                        //注意这里和centos不一样 MYSQL_PORT              3306MYSQL_OPT               0MYSQL_DATABASE          extmailMYSQL_USER_TABLE        mailboxMYSQL_CRYPT_PWFIELD     passwordMYSQL_UID_FIELD         uidnumberMYSQL_GID_FIELD         gidnumberMYSQL_LOGIN_FIELD       usernameMYSQL_HOME_FIELD        homedirMYSQL_NAME_FIELD        nameMYSQL_MAILDIR_FIELD     maildirMYSQL_QUOTA_FIELD       quotaMYSQL_SELECT_CLAUSE     SELECT username,password,"",uidnumber,gidnumber,\                        CONCAT('/home/domains/',homedir),               \//查询的内容                        CONCAT('/home/domains/',maildir),               \                        quota,                                          \                        name                                            \                        FROM mailbox                                    \                        WHERE username = '$(local_part)@$(domain)' 存盘退出后启动courier-authlib: /etc/init.d/courier-authlib start                 如一切正常,命令行将返回如下信息: Starting Courier authentication services: authdaemond   修改authdaemon socket目录权限 如果该目录权限不正确修改,maildrop及postfix等将无法正确获取用户的信息及密码认证: chmod 755 /var/spool/authdaemon ############################################################################## 四。安装maildropapt-get install maildropapt-get install mailman   配置master.cf为了使Postfix支持Maildrop,必须修改/etc/postfix/master.cf文件,注释掉原来的maildrop的配置内容,并改为: maildrop   unix        -       n        n        -        -        pipe   flags=DRhu user=vmail argv=/usr/bin/maildrop -V3 -w 90  -d ${recipient}  //V3为生成详细的日志,之后记得关掉 配置main.cf由于maildrop不支持一次接收多个收件人,因此必须在main.cf里增加如下参数: #mailbox_command = procmail -a "$EXTENSION"  //这里必须注释掉maildrop_destination_recipient_limit = 1  //在里面新加的内容最后重新启动postfix即可   注意事项:1.如需重新编译Maildrop软件包,必须先获得其源码rpm包,并且必须先行安装courier-authlib及其devel软件包,否则编译后的maildrop将无法打开authlib支持。 2.maildrop RPM包安装时,会自动创建vuser用户及vgroup用户组,专门用于邮件的存储,vuser:vgroup的uid/gid都是1000,这与一般的邮件文档中提及用postfix用户存邮件不一样。因为postfix用户的uid一般都低于500,而Suexec模块编译时对UID/GID的要求是要大于500,因此使用postfix用户不能满足要求。其次,如果用Maildrop作为投递代理(MDA),以postfix身份投递的话,会导致postfix MTA错误 ###################################################################################################################################### 五。配置appache编辑/etc/httpd/conf/vhost_extmail.conf,里面定义虚拟主机的相关内容,包括主目录,以及ExtMail和ExtMan的相关配置,Suexec的设置等。 # VirtualHost for ExtMail Solution

ServerName mail.xxxx.com
DocumentRoot /var/www/extsuite/extmail/html/

.Alias /extmail/cgi/ /var/www/extsuite/extmail/cgi/
Alias /extmail/ /var/www/extsuite/extmail/html/

.Alias /extman/cgi/ /var/www/extsuite/extman/cgi/
Alias /extman/ /var/www/extsuite/extman/html/

# Suexec config
#SuexecUserGroup vmail vmail

重新启动apache:  /etc/init.d/apache2 restart   ##################################################################################################################六。安装ExtMail 建立/var/www/extsuite并复制源码到该目录,相关命令: mkdir /var/www/extsuitetar -zxvf src/extmail-1[1][1].0.4.tar.gz -C srccp -r src/extmail-1.0.4 /var/www/extsuite/extmailcd /var/www/extsuite/extmailcp webmail.cf.default webmail.cfcd $OLDPWD 注意:上面命令行中最后一个cd $OLDPWD是返回原始路径(即ExtMail Solution软件包根目录) 安装perl-Unix-Syslog包 apt-get install Unix-Syslog-perl 编辑webmail.cf修改/var/www/extsuite/extmail/webmail.cf里的其他参数,主要变动的内容见下:  SYS_USER_LANG = zh_CNSYS_USER_CHARSET = gb2312 SYS_MFILTER_ON = 1SYS_NETDISK_ON = 1SYS_SHOW_SIGNUP = 0 SYS_MYSQL_USER = extmailSYS_MYSQL_PASS = extmailSYS_MYSQL_DB = extmailSYS_MYSQL_HOST = mail.XXXX.comSYS_MYSQL_SOCKET = /var/run/mysql/mysql.sock //注意路径  SYS_G_ABOOK_TYPE = fileSYS_G_ABOOK_FILE_CHARSET = gb2312   其中SYS_MFILTER_ON及SYS_NETDISK_ON 设置为1是为了打开网络磁盘和过滤器;SYS_SHOW_SIGNUP控制首页是否显示免费注册邮箱按钮;全局地址本默认为ldap格式,现在也改为文本格式,并将地址本的转换编码改为GB2312  更新cgi目录权限由于SuEXEC的需要,必须将extmail的cgi目录修改成vuser:vgroup权限://前面建立了需帐户和组为:vmail fid=uid=2000 chown -R vmail:vmail /var/www/extsuite/extmail/cgi/  ############################################################################################################################33 七。安装ExtMan - web后台 在ExtMail-Solution软件包根目录下执行:                    //注意man管理界面登陆后要正规退出 tar -zxvf src/extman-0[1][1].2.4.tar.gz -C srccp -r src/extman-0.2.4 /var/www/extsuite/extman/   配置webman.cf修改/var/www/extsuite/extman/webman.cf内SYS_CHARSET及SYS_LANG参数为:  SYS_CAPTCHA_ON = 1# SYS_CAPTCHA_ON参数控制首页是否采用校验码登陆SYS_CHARSET = gb2312           //这个是手动加上的  修改了SYS_GROUPMAIL_SENDER = postmaster@extmail.orgSYS_LANG = zh_CNSYS_MYSQL_USER = webmanSYS_MYSQL_PASS = webman#SYS_MYSQL_USER = extmail#SYS_MYSQL_PASS = extmailSYS_MYSQL_DB = extmailSYS_MYSQL_HOST = mail.XXXX.comSYS_MYSQL_SOCKET = /var/run/mysql/mysql.sock   //注意要在mysql中建立webman这个用户,否则会不让登陆后台 其他参数基本上可以使用默认值。  安装perl-GD包 apt-get install perl-GD 更新cgi目录权限由于SuEXEC的需要,必须将extman的cgi目录修改成vmail:vmail权限:  ###################################################################################################################333八。确认MySQL状态 在执行mysql操作前,必须确认它已被正确安装并启动,可以用rpm命令查询mysql server的安装情况,用ps ax的办法查看进程列表是否有mysqld进程: rpm -aq|grep -i mysql-server 正常情况下应该可以看到mysql-server被安装: mysql-server-4.1.20-2.RHEL4.1.0.1 如果没有,则表示没有安装好mysql-server,可以从本软件包RPMS目录里安装,也可以找安装光盘安装: rpm -ivh RPMS/mysql-server-4.1.20-2.RHEL4.1.0.1.i386.rpm 安装完毕后必须初始化mysql,然后重新启动 /usr/bin/mysql_install_dbservice mysqld start 正常情况下将启动成功: Starting MySQL:                                            [  OK  ] 然后用ps命令来检查mysqld是否正确运行: ps ax|grep mysqld 正常情况下应出现如下的结果: 433 pts/0 S 0:00 /bin/sh /usr/bin/mysqld_safe --defaults-file=/etc/my.cnf --pid-file=/var/run/mysqld/mysqld.pid466 pts/0 Sl 0:00 /usr/libexec/mysqld --defaults-file=/etc/my.cnf --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-locking --socket=/var/lib/mysql/mysql.sock 如果mysql没正确启动,请检查/var/log/mysqld.log里面的出错提示,进行处理: tail /var/log/mysqld.log   数据库初始化执行以下命令导入mysql数据库结构及初始化数据,注意必须逐行输入以下命令,root密码默认为空,不可直接用鼠标复制两行命令直接输入,否则会报错! mysql -u root -p < /var/www/extsuite/extman/docs/extmail.sql  //这里是要导入的数据mysql -u root -p < /var/www/extsuite/extman/docs/init.sql  //注意更改里面的用户,主机域名,地址,默认的uid与gid改为2000         链接基本库到Extmail 建立临时文件夹: mkdir /tmp/extmanchown -R vmail:vmail /tmp/extman //注意他的存在问题 建立刚才导入mysql的postmaster@XXXX.com帐户的Maildir,请输入如下命令: cd /var/www/extsuite/extman/tools./maildirmake.pl /home/domains/XXXX.com/postmaster/Maildir   //手动建立用户chown -R vuser:vgroup /home/domains/XXXX.comcd $OLDPWD 注意事项:  上面命令行中最后一个cd $OLDPWD是返回原始路径(即ExtMail Solution软件包根目录) 由于RedHat发行版中包含了一个叫tmpwatch的工具,该工具会定期扫描/tmp/下的文件,如果这些文件很久都没被使用,将被删除,因此如果后台长期不使用,/tmp/extman目录有可能被tmpwatch删除,所以要么定期登陆后台,要么修改 webman.cf将临时目录修改到另一个地方。此处暂以/tmp/extman默认值为例。  上述导入初始化SQL时,默认的uidnumber/gidnumber都是2000,这和vuser:vgroup 的uid/gid一致,是因为maildrop投递时会从数据库里取uidnumber/gidnumber,而在master.cf里已经定义好了投递时的运行身份(vmail:vmail),所以这两个字段的内容必须为2000,否则将出现投递错误,例如报0x06等错误  chown -R vmail:vmail /var/www/extsuite/extman/cgi ############################################################## 测试authlib在命令行下执行: /usr/sbin/authtest -s login postmaster@XXXX.com extmail   //注意@后面的域名是否重复了,看一下mysql的日志结果如下: Authentication succeeded.      Authenticated: postmaster@extmail.org  (uid 2000, gid 2000)    Home Directory: /home/domains/XXXX.com/postmaster           Maildir: /home/domains/XXXX.com/postmaster/Maildir/             Quota: 104857600SEncrypted Password: $1$phz1mRrj$3ok6BjeaoJYWDBsEPZb5C0Cleartext Password: extmail           Options: (none) 这样表明ExtMan的正确安装,数据库也正确导入,courier-authlib能正确连接到mysql数据库 最后访问[url]http://mail.[/url]xxxx.com/extmail/,如无意外,将看到webmail的登陆页,不过此时还没有加正式的用户,所以不能登陆,包括postmaster@XXXX.com也不行。必须要登陆到[url]http://mail.[/url]XXXX.com/extman/ 里增加一个新帐户才能登陆。 ExtMan的默认超级管理员帐户:root@XXXX.com,初始密码:extmail*123*,登陆成功后,建议将密码修改,以确保安全。############################################################################################################################ 九。安装courier-imapdebian @ mail/tmp# apt-get  install courier-authdaemon courier-authmysql courier-base courier-imap courier-pop courier-pop-ssl courier-imap-ssl  启动:/etc/init.d/courier-authdaemon   start/etc/init.d/courier-pop3  start######################################################################################################################## 下面是一些测试的方法,我总结如下:  debian @ mail/tmp# perl -MMIME::Base64 -e 'print encode_base64("test\@xxxx.com");' //测试的用户和域名dGVzdEBleHRtYWlsLm9yZw==   //生成的编码debian @ mail/tmp# perl -MMIME::Base64 -e 'print encode_base64("test");'dGVzdA==                 //生成的编码debian @ mail/tmp#telnet localhost 25Trying 127.0.0.1...Connected to localhost.Escape character is '^]'.220 wader.com ESMTP Mail Systemehlo test250-mai.wader.com250-PIPELINING250-SIZE 14680064250-VRFY250-ETRN250-STARTTLS250-AUTH LOGIN PLAIN 250-AUTH=LOGIN PLAIN250-ENHANCEDSTATUSCODES250-8BITMIME250 DSNauth login334 VXNlcm5hbWU6dGVzdEBleHRtYWlsLm9yZw==   //生成的编码进行校验334 UGFzc3dvcmQ6dGVzdA==                                 //是否匹配235 2.0.0 Authentication successfulmail from:<test@wader.com>           //测试收信250 2.1.0 Okrcpt to:<test@Xxx.com>250 2.1.5 Okdata354 End data with .Test                                  //信的格式.250 2.0.0 Ok: queued as 7185892Cquit221 2.0.0 ByeConnection closed by foreign host.  debian @mail/tmp#telnet  mail.xxx.com 110  //测试pop3是否正常Trying 127.0.0.1...Connected to localhost.Escape character is '^]'.+OK Hello there.user text@xxx.com+OK Password required.pass test       //密码     +OK logged in.           我的备份脚本: mail:~# less maildb_back.sh#!/bin/bashBackupPath=/data/maildata_bkMysql_bk_dir=$BackupPath/mysqlbkMail_bk_dir=$BackupPath/mailbkLogFile=$BackupPath/backuplog#MailBoxDir=/var/mailbox ##################################################################### define mysql variables                                                     #####################################################################NewFile="$Mysql_bk_dir"/extmail$(date +%Y%m%d).tgz DumpFile="$Mysql_bk_dir"/extmail$(date +%Y%m%d).sqlOldFile="$Mysql_bk_dir"/extmail$(date +%Y%m%d --date='5 days ago').tgz DbUser=extmailDbPasswd=xxxxDbName=extmail###################################################################   mysql backup proccess                                                 #####################################################################echo "-------------------------------------------" >> $LogFile echo $(date +"%y-%m-%d %H:%M:%S") >> $LogFile echo "--------------------------" >> $LogFile #Delete Old File if [ -f $OldFile ] then     rm -f $OldFile >> $LogFile 2>&1     echo "[$OldFile]Delete Old File Success!" >> $LogFile else     echo "[$OldFile]No Old Backup File!" >> $LogFile fi            if [ -f $NewFile ] then    echo "[$NewFile]The Backup File is exists,Can't Backup!" >> $LogFile else    cd $Mysql_bk_dir   /usr/bin/mysqldump -u $DbUser -p$DbPasswd --opt $DbName > $DumpFile    tar czf $NewFile postfix$(date +%Y%m%d).sql >> $LogFile 2>&1    echo "[$NewFile]Backup Success!" >> $LogFile    rm -rf $DumpFile fi                                ################################################################     backup mail's user directories and files                                     #######################################################################MailFileBk=$Mail_bk_dir/mail$(date +%Y%m%d).tgzOldMailFileBk=$Mail_bk_dir/mail$(date +%Y%m%d --date='14 days ago').tgz                                if [ -f $OldMailFileBk ]then    rm -rf $OldMailFileBkfi                                    if [  -f $MailFileBk ]then   echo "[$MailFileBk]The Backup File is exists,Can't Backup!" >> $LogFileelse    cd /etc/    tar czf $MailFileBk postfix  >> $LogFile 2>&1fi                                                    echo "-------------------------------------------" >> $LogFile################################################################################################ 异地备份脚本mail:~# less /home/ssher/ssher.sh #!/bin/bashcd /usr/bin/scp /data/maildata_bk/mailbk/mail$(date +%Y%m%d).tgz ssher@xxxxx:/home/bak/          //前提是建立SSH信任scp /data/maildata_bk/mysqlbk/postfix$(date +%Y%m%d).tgz ssher@xxxxxx:/home/bak/################################################################################################### 每天进行自动的异地备份,如下:mail:~# less /etc/crontab 52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )00 1    * * *   root    /root/maildb_back.sh 00 3    * * *   ssher    /home/ssher/ssher.sh    

本文出自 “狼行天下” 博客,请务必保留此出处http://zhangbo.blog.51cto.com/350645/123098