如何安装配置Postfix邮件服务器,实现outlook的smtp服务器使用SMTP发送邮件,不用数据库那种(只发不收)

你的位置: &&
RHEL 5服务篇—部署Postfix邮件系统(四)设置SMTP发信认证及别名机制
RHEL 5服务篇—部署Postfix邮件系统(四)设置SMTP发信认证及别名机制
SMTP发信认证的常见形式如下:当用户通过SMTP协议向外部邮件域发送邮件时,服务器会要求用户提供用户账号和口令进行身份验证,只有成功通过身份验证的用户才被允许向外部发送邮件,否则将拒绝发信请求。 & & &在Postfix邮件系统中,可以使用Cyrus SASL软件来实现基本的SMTP认证机制。Postfix通过调用CyrusSASL的函数库,使用Cyrus SASL提供的认证服务saslauthd来核对系统账号和密码。1、设置Cyrus SASL函数库,并启动saslauthd服务[root@localhost /]#vim /usr/lib/sasl2/smtpd.confpwcheck_method:saslauthd & & & & //设置使用saslauthd服务作为认证方式[root@localhost /]#/etc/init.d/saslauthd start & & //开启saslauthd服务[root@localhost /]#chkconfig --level 35 saslauthd on & &//设置35级别开机自启动2、修改main.cf配置文件,添加SMTP认证配置,并重载服务上述配置参数中,SMTP认证的几行设置含义如下:mynetworks:用来控制可以通过本服务器外发邮件的网络地址或IP地址。smtpd_recipient_restrictions:设置收件人地址过滤规则,其匹配策略是“从上至下”的顺序,如有满足策略,及立即停止。常见的几个值如下所述:permit_mynetworks:允许IP地址为mynetworks的客户使用本邮件系统发送邮件。permit_sasl_authenticated:允许通过SMTP认证的用户向外发送邮件。reject_unauth_destination:当收件人地址不包括在postfix的授权网络内时,将拒绝发送该邮件。(授权网络包括由inet_interfaces、mydestination、relay_domain等配置参数指定的域及其子域)3、验证SMTP发信认证使用telnet命令做发信测试,测试不是SMTP认证的情况。若要使用SMTP发信认证,在telnet命令中应改为“ehlo”(而不是helo)来宣告本机地址,并通过“auth login”进行登录认证,然后才能够正常发送邮件。用户名,密码字串默认使用base64编码格式,使用openssl工具可以生成。再次使用telnet命令测试SMTP发信认证,则会成功的将邮件提交给Postfix服务器。使用Outlook 2007客户端时,需要在邮箱属性中启用“我的发送服务器需要SMTP认证”选项。通过别名机制设置邮件组 & & &在Postfix服务器中,邮件组功能主要通过aliase别名来实现,使用别名需要用到Postfix系统的一个重要机制——查询表。Postfix服务器在操作过程中经常需要做各式各样的转换与查询,如判断客户机是否来自授权网络,设置群发邮件的用户成员等,这种包含了某种对应关系的数据集合就称为查询表。1、设置邮件组——别名查询表别名查询表文件一般位于/etc/aliases,在该文件中,每一行对应一条邮件组记录,格式为“别名:地址1,地址2,地址3...”。列如:为邮箱用户test1和test2创建一个邮件组,邮件组为groupmail。[root@localhost /]#vim /etc/aliases......//省略部分内容groupmail:test1,test2[root@localhost /]#newaliases & //更新aliases文件数据库注意:上述别名记录中,邮件组成员(如test1和test2)要求是服务器中实际存在的系统用户,而邮件组本身(如groupmail)只作为一个映射的别名,并不需要建立同名的系统用户。在修改完aliases查询表之后,需要使用newaliases命令更新数据库。2、在Postfix主配置文件中,添加“alias_maps”配置参数来指导别名查询表存放的位置。如:/etc/aliases的hash数据文件。[root@lcoalhost /]#vim /etc/postfix/main.cf......//省略部分内容alias_maps=hash:/etc/aliases & & & &//使用hash格式的查询表[root@localhost /]#postfix reload & //重新加载配置文件3、测试群发邮件新建一个用户user,使用user用户给groupmail发一封邮件,看test1和test2是否都能收到这封邮件。查看test1是否收到这封邮件,邮件默认存储在“/home/test1/Maildir/new/”目录下。查看test2是否也收到这封邮件设置邮件大小及邮箱空间限制1、限制用户可发送的邮件大小Postfix系统默认支持的邮件大小为10MB,若要更改此限制,应在main.cf主配置文件添加配置参数“message_size_limit”。列如:将邮件大小有默认的10M,该为50M。[root@localhost /]#vim /etc/posrfix/main.cf......//省略部分内容message_size_limit=5120000 & //注意系统默认使用KB为单位[root@localhost /]#postfix reload2、限制用户的邮箱空间大小在Postfix邮件系统中,根据邮件用户的类型,邮件存储的方式不同,可以分别采取不同的方法限制用户的邮箱空间大小。方法一:使用quota磁盘配置,适用于Mailbox和Maildir两种存储方式。针对Linux系统用户作为邮件账户的情况,建议采用这种方式。方法二:配置参数“mailbos_size_limit”,仅使用于Mailbox存储方式,默认的限制为50M。方法三:配置参数virtual_mailbox_limit,适用于Mailbox和Maildir两种存储方式,但是只针对虚拟用户。熬夜写的这篇文章啊!大家多多支持啊!本文出自 “初始化” 博客,请务必保留此出处http://cshbk./9790
最新热门tag3分钟安装配置Postfix邮件服务器 - 廖雪峰的官方网站
3分钟安装配置Postfix邮件服务器
/ Reads: 5
Linux邮件服务器通常使用Sendmail,在网上Google了Sendmail的教程后,我决定知难而退,改用Postfix。
Postfix是用来替代Sendmail的,它的配置文件比Sendmail简单得多,配置相当容易。
在配置邮件服务器之前,先解释几个概念。
我们通常使用Email都很容易,但是Internet的邮件系统是通过几个复杂的部分连接而成的,对于最终用户而言,我们熟悉的Outlook,Foxmail等都是用来收信和发信的,称之为MUA:Mail User Agent,邮件用户代理。
MUA并非直接将邮件发送至收件人手中,而是通过MTA:Mail Transfer Agent,邮件传输代理代为传递,Sendmail和Postfix就是扮演MTA的角色。
一封邮件从MUA发出后,可能通过一个或多个MTA传递,最终到达MDA:Mail Delivery Agent,邮件投递代理,邮件到达MDA后,就存放在某个文件或特殊的数据库里,我们将这个长期保存邮件的地方称之为邮箱。
一旦邮件到达邮箱,就原地不动了,等用户再通过MUA将其取走,就是用Outlook,Foxmail等软件收信的过程。
所以一封邮件的流程是:
发件人:MUA --发送--& MTA -& 若干个MTA... -& MTA -& MDA &--收取-- MUA:收件人
MUA到MTA,以及MTA到MTA之间使用的协议就是SMTP协议,而收邮件时,MUA到MDA之间使用的协议最常用的是POP3或IMAP。
需要注意的是,专业邮件服务商都有大量的机器来为用户服务,所以通常MTA和MDA并不是同一台服务器,因此,在Outlook等软件里,我们需要分别填写SMTP发送服务器的地址和POP3接收服务器的地址。
下面开始用Postfix搭建Linux下的邮件服务器。目标服务器是RedHat Enterprise Linux 4,首先需要停止Sendmail:
# /etc/init.d/sendmail stop
并从启动组里移除:
# chkconfig sendmail off
然后,通过rpm包安装Postfix:
# rpm -Uvh postfix-2.x.x.xxx.rpm
Postfix只有一个/etc/postfix/main.cf需要修改,其他配置文件可以直接使用默认设置。
第一个需要修改的参数是myhostname,指向真正的域名,例如:
myhostname =
mydomain参数指向根域:
mydomain =
myorigin和mydestination都可以指向mydomain:
myorigin = $mydomain
mydestination = $mydomain
Postfix默认只监听本地地址,如果要与外界通信,就需要监听网卡的所有IP:
inet_interfaces = all
Postfix默认将子网内的机器设置为可信任机器,如果只信任本机,就设置为host:
mynetworks_style = host
配置哪些地址的邮件能够被Postfix转发,当然是mydomain的才能转发,否则其他人都可以用这台邮件服务器转发垃圾邮件了:
relay_domains = $mydomain
现在,Postfix已经基本配置完成,我们需要对邮件的发送进行控制:
对于外域到本域的邮件,必须接收,否则,收不到任何来自外部的邮件;
对于本域到外域的邮件,只允许从本机发出,否则,其他人通过伪造本域地址就可以向外域发信;
对于外域到外域的邮件,直接拒绝,否则我们的邮件服务器就是Open Relay,将被视为垃圾邮件服务器。
先设置发件人的规则:
smtpd_sender_restrictions = permit_mynetworks, check_sender_access hash:/etc/postfix/sender_access, permit
以上规则先判断是否是本域地址,如果是,允许,然后再从sender_access文件里检查发件人是否存在,拒绝存在的发件人,最后允许其他发件人。
然后设置收件人规则:
smtpd_recipient_restrictions = permit_mynetworks, check_recipient_access hash:/etc/postfix/recipient_access, reject
以上规则先判断是否是本域地址,如果是,允许,然后再从recipient_access文件里检查收件人是否存在,允许存在的收件人,最后拒绝其他收件人。
/etc/postfix/sender_access的内容:
目的是防止其他用户从外部以身份发送邮件,但登录到本机再发送则不受影响,因为第一条规则permit_mynetworks允许本机登录用户发送邮件。
/etc/postfix/recipient_access的内容:
因此,外域只能发送给以上两个Email地址,其他任何地址都将被拒绝。但本机到本机发送不受影响。
最后用postmap生成hash格式的文件:
# postmap sender_access
# postmap recipient_access
启动Postfix:
# /etc/init.d/postfix start
设置到启动组里:
# chkconfig postfix on
现在就可以通过telnet来测试了:(红色是输入的命令)
ESMTP Postfix
helo localhost
mail from:
354 End data with&CR&&LF&.&CR&&LF&
hello!!!!!!
250 Ok: queued as D68E41407D0
mail from:
554&&: Recipient address rejected: Access denied
如果配置了SMTP认证,就可以让用户远程发送时能通过认证后再发送邮件,目前还没有配置,准备继续研究后再配置。需要注意的是,配置SMTP认证后,设置规则应该是:
外域-&本域:不需认证,允许,否则将接受不到任何外部邮件;
本域-&外域:需要认证,否则拒绝。
因为我们作为发送服务器的MTA和转发的MTA实际上是由一个MTA完成的,所以需要以上规则。对于大型邮件服务商,发送服务器的MTA和转发的MTA是分别部署的,例如,sina的发送服务器是,需要经过用户认证,而转发服务器是mx???.,不需要认证,否则无法转发邮件。
最后不要忘了在DNS的MX记录中将域名添上。
Make a Comment
Sign In to Make a Comment
You can sign in directly without register:
You need authorize to allow connect to your social passport for the first time.
WARNING: You are using an old browser that does not support HTML5.
Please choose a modern browser ( /
/ ) to get a good experience.& 基于Debian简单配置Postfix+Courier+MySQL+SquirrelMail邮件服务器
基于Debian简单配置Postfix+Courier+MySQL+SquirrelMail邮件服务器
,在此基础上参考文章(1),前些天把exim4换成了postfix,以通过虚拟域和mysql数据库来管理邮箱用户,另外还通过SquirrelMail的change_sqlpass插件实现了Webmail用户自行修改密码的功能,在此做个记录。
主要配置如下:
MTA: Postfix
SMTP: Saslauthd SSL
POP/IMAP: Courier SSL
Database: MySQL
WebMail: SquirrelMail
还是因vps空间和内存有限,所以反垃圾、杀毒、内容过滤等仍不考虑。
1. 用putty登录VPS后,安装相应的软件包
apt-get update
apt-get install postfix postfix-mysql postfix-doc courier-authdaemon courier-authlib-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl libsasl2-modules-sql libpam-mysql libpam-smbpass
我的VPS预装了Openvz的debian 5.0模板,之后升级至6.0(Squeeze),然后安装了
,所以这里就没有如参考文章(1)那样安装某些已有的软件包如mysql-client、php5-mysql等,或者不需要的软件包如apache2,请根据自己系统的实际情况选择需要安装的软件包。
软件包安装的过程中会提问一些配置方面的问题,一般默认即可
General type of mail configuration: Internet Site
System mail name:
SSL certificate required? Ok
Workgroup/Domain Name: WORKGROUP
Modify smb.conf to use WINS settings from DHCP? No
2. 对Postfix做Quota patch(配额补丁)
apt-get build-dep postfix
cd /usr/src
apt-get source postfix
postconf -d | grep mail_version
#检查一下当前的postfix版本,我的是2.7.1
http://vda.sourceforge.net/VDA/postfix-vda-2.7.1.patch
#下载对应版本的补丁
cd postfix-2.7.1
patch -p1 & ../postfix-vda-2.7.1.patch
dpkg-buildpackage
这时应显示如下文件清单
openvz:/usr/src# ls -l
total 6328
drwxr-xr-x 19 root root
5 01:36 postfix-2.7.1
-rw-r–r–
1 root src
5 01:37 postfix-cdb_2.7.1-1_i386.deb
-rw-r–r–
1 root src
144992 May
5 01:37 postfix-dev_2.7.1-1_all.deb
-rw-r–r–
1 root src
1001226 May
5 01:37 postfix-doc_2.7.1-1_all.deb
-rw-r–r–
1 root src
5 01:37 postfix-ldap_2.7.1-1_i386.deb
-rw-r–r–
1 root src
5 01:37 postfix-mysql_2.7.1-1_i386.deb
-rw-r–r–
1 root src
5 01:37 postfix-pcre_2.7.1-1_i386.deb
-rw-r–r–
1 root src
5 01:37 postfix-pgsql_2.7.1-1_i386.deb
-rw-r–r–
1 root src
5 22:05 postfix-vda-2.7.1.patch
-rw-r–r–
1 root src
234277 May
5 01:33 postfix_2.7.1-1.diff.gz
-rw-r–r–
1 root src
5 01:33 postfix_2.7.1-1.dsc
-rw-r–r–
1 root src
5 01:37 postfix_2.7.1-1_i386.changes
-rw-r–r–
1 root src
1332980 May
5 01:37 postfix_2.7.1-1_i386.deb
-rw-r–r–
1 root src
3418747 Jun 22
2010 postfix_2.7.1.orig.tar.gz
完成补丁作业
dpkg -i postfix_2.7.1-1_i386.deb postfix-mysql_2.7.1-1_i386.deb
3. 给Postfix/Courier创建MySQL数据库
mysqladmin -u root -p create mail
#创建数据库,库名mail
mysql -u root –p
#以root身份登录MySQL,输入密码
#在 mysql& 提示符下输入如下几段内容
#MySQL中创建访问数据库mail的用户 mail_admin 及其密码(请自行替换mail_admin_password字段)
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';
FLUSH PRIVILEGES;
#创建mail数据库的表
CREATE TABLE domains (
domain varchar(50) NOT NULL,
PRIMARY KEY (domain) )
TYPE=MyISAM;
CREATE TABLE forwardings (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source) )
TYPE=MyISAM;
CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
quota bigint(20) DEFAULT '',
PRIMARY KEY (email)
) TYPE=MyISAM;
CREATE TABLE transport (
domain varchar(128) NOT NULL default '',
transport varchar(128) NOT NULL default '',
UNIQUE KEY domain (domain)
) TYPE=MyISAM;
#退出MySQL Shell界面
然后用vi或在Winscp中修改MySQL的配置文件 /f ,确认其中必须有一行
bind-address = 127.0.0.1
注意不是参考文章(1)中提及的/etc/f而是/f,后者是LNMP一键包安装后MySQL的配置文件的路径,但由于步骤1完成后MySQL配置文件的路径被自动改成了/etc/f,为避免MySQL运行出错,需做如下处理
cd /etc/mysql
#原配置文件改名备份一下
ln -s ../my.f
#制作一个软链接,引用上一级目录的配置文件
/etc/init.d/mysql restart
#重启MySQL
netstat -tap | grep mysql
#检查MySQL的监听端口
#应类似如下显示
19671/mysqld
在 /etc/postfix 目录下创建如下六个文件,注意其中的mail_admin_password字段需自行替换。
/etc/postfix/mysql-virtual_domains.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT domain AS virtual FROM domains WHERE domain='%s'
hosts = 127.0.0.1
/etc/postfix/mysql-virtual_forwardings.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT destination FROM forwardings WHERE source='%s'
hosts = 127.0.0.1
/etc/postfix/mysql-virtual_mailboxes.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s'
hosts = 127.0.0.1
/etc/postfix/mysql-virtual_email2email.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT email FROM users WHERE email='%s'
hosts = 127.0.0.1
/etc/postfix/mysql-virtual_transports.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT transport FROM transport WHERE domain='%s'
hosts = 127.0.0.1
/etc/postfix/mysql-virtual_mailbox_limit_maps.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT quota FROM users WHERE email='%s'
hosts = 127.0.0.1
接下来修改这六个文件的权限和所属组等
chmod o= /etc/postfix/mysql-virtual_*.cf
chgrp postfix /etc/postfix/mysql-virtual_*.cf
groupadd -g 5000 vmail
#创建拥有邮箱目录的组
useradd -g vmail -u 5000 vmail -d /home/vmail -m
#创建拥有邮箱目录的用户
依次执行如下postconf命令以修改Postfix的配置,注意字段需替换成实际的邮箱域名
postconf -e 'myhostname = '
postconf -e 'mydestination = , localhost, localhost.localdomain'
postconf -e 'mynetworks = 127.0.0.0/8'
postconf -e 'message_size_limit = '
postconf -e 'virtual_alias_domains ='
postconf -e 'virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'
postconf -e 'virtual_mailbox_base = /home/vmail'
postconf -e 'virtual_uid_maps = static:5000'
postconf -e 'virtual_gid_maps = static:5000'
postconf -e 'smtpd_sasl_auth_enable = yes'
postconf -e 'broken_sasl_auth_clients = yes'
postconf -e 'smtpd_sasl_authenticated_header = yes'
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'
postconf -e 'smtpd_use_tls = yes'
postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert'
postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key'
postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf'
postconf -e 'virtual_create_maildirsize = yes'
postconf -e 'virtual_maildir_extended = yes'
postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf'
postconf -e 'virtual_mailbox_limit_override = yes'
postconf -e 'virtual_maildir_limit_message = &The user you are trying to reach is over quota.&'
postconf -e 'virtual_overquota_bounce = yes'
postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps$virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps$relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps$transport_maps $mynetworks $virtual_mailbox_limit_maps'注:完成后检查一下 /etc/postfix/main.cf 这个配置文件,确认内容如上所示。
创建SSL证书
cd /etc/postfix
#创建证书,回答提问用默认的即可
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509
chmod o= /etc/postfix/smtpd.key
#修改证书访问权限
4. 配置Saslauthd
先创建一个目录
mkdir -p /var/spool/postfix/var/run/saslauthd
然后修改 /etc/default/saslauthd 文件为如下内容,以实现开机时启动
# Should saslauthd run automatically on startup? (default: no)
#OPTIONS="-c -m /var/run/saslauthd"
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"
备份 /etc/pam.d/smtp 文件
cp /etc/pam.d/smtp /etc/pam.d/smtp.org
然后修改 /etc/pam.d/smtp 内容如下(注意只能是如下二行,且注意mail_admin_password字段的替换)
auth required pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1
创建 /etc/postfix/sasl/smtpd.conf 文件,内容如下,同样mail_admin_password字段需替换
pwcheck_method: saslauthd
mech_list: plain login
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: mail_admin
sql_passwd: mail_admin_password
sql_database: mail
sql_select: select password from users where email = '%u'
adduser postfix sasl
#添加sasl组的用户postfix
/etc/init.d/postfix restart
#重启postfix
/etc/init.d/saslauthd restart
#重启saslauthd
5. 配置Courier
修改 /etc/courier/authdaemonrc 文件为如下内容
#authmodulelist="authpam"
authmodulelist="authmysql"
然后备份并清空 /etc/courier/authmysqlrc 文件
cp /etc/courier/authmysqlrc /etc/courier/authmysqlrc_orig
#复制作备份
cat /dev/null & /etc/courier/authmysqlrc
在 /etc/courier/authmysqlrc 文件中填写如下内容,注意mail_admin_password字段的替换
MYSQL_SERVER localhost
MYSQL_USERNAME mail_admin
MYSQL_PASSWORD mail_admin_password
MYSQL_PORT 0
MYSQL_DATABASE mail
MYSQL_USER_TABLE users
MYSQL_CRYPT_PWFIELD password
#MYSQL_CLEAR_PWFIELD password
MYSQL_UID_FIELD 5000
MYSQL_GID_FIELD 5000
MYSQL_LOGIN_FIELD email
MYSQL_HOME_FIELD "/home/vmail"
MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
#MYSQL_NAME_FIELD
MYSQL_QUOTA_FIELD quota
然后删除原证书
cd /etc/courier
rm -f /etc/courier/imapd.pem
#删除原证书
rm -f /etc/courier/pop3d.pem
修改 /etc/f 和 /etc/f 这两个文件,把字段替换成实际的邮箱域名
创建新证书
mkimapdcert
mkpop3dcert
/etc/init.d/courier-authdaemon restart
#重启各软件
/etc/init.d/courier-imap restart
/etc/init.d/courier-imap-ssl restart
/etc/init.d/courier-pop restart
/etc/init.d/courier-pop-ssl restart
测试一下pop3是否正常,键入quit退出
telnet localhost pop3
Trying ::1...
Connected to localhost.localdomain.
Escape character is '^]'.
+OK Hello there.
+OK Better luck next time.
Connection closed by foreign host.
6. 修改 /etc/aliases 文件,把字段替换成实际的邮件管理者邮箱(待步骤9时需创建该邮箱用户)
postmaster: root
# root: postmaster@yourdomain.tld
然后重启aliases和postfix
newaliases
/etc/init.d/postfix restart
7. 设置邮箱超配额提示功能
按如下内容创建 /usr/local/sbin/quota_notify 脚本文件,并把其中三行的字段如步骤6那样替换为实际的邮件管理者邮箱
#!/usr/bin/perl -w
# This script assumes that virtual_mailbox_base in defined
# in postfix's main.cf file. This directory is assumed to contain
# directories which themselves contain your virtual user's maildirs.
# For example:
# -----------/
home/vmail/domains/
-----------------
maildirsize
my $POSTFIX_CF = "/etc/postfix/main.cf";
my $MAILPROG = "/usr/sbin/sendmail -t";
my $WARNPERCENT = 80;
# my @POSTMASTERS = ('postmaster@domain.tld');
my @POSTMASTERS = ('');
my $CONAME = 'My Company';
# my $COADDR = 'postmaster@domain.tld';
my $COADDR = '';
# my $SUADDR = 'postmaster@domain.tld';
my $SUADDR = '';
my $MAIL_REPORT = 1;
my $MAIL_WARNING = 1;
#get virtual mailbox base from postfix config
open(PCF, "& $POSTFIX_CF") or die $!;
while () {
next unless /virtual_mailbox_base\s*=\s*(.*)\s*/;
$mboxBase = $1;
close(PCF);
#assume one level of subdirectories for domain names
opendir(DIR, $mboxBase) or die $!;
while (defined(my $name = readdir(DIR))) {
next if $name =~ /^\.\.?$/;
#skip '.' and '..'
next unless (-d "$mboxBase/$name");
push(@domains, $name);
closedir(DIR);
#iterate through domains for username/maildirsize files
chdir($mboxBase);
foreach my $domain (@domains) {
opendir(DIR, $domain) or die $!;
while (defined(my $name = readdir(DIR))) {
next if $name =~ /^\.\.?$/;
#skip '.' and '..'
next unless (-d "$domain/$name");
push(@users, {"$name\@$domain" =& "$mboxBase/$domain/$name"});
closedir(DIR);
#get user quotas and percent used
my (%lusers, $report);
foreach my $href (@users) {
foreach my $user (keys %$href) {
my $quotafile = "$href-&{$user}/maildirsize";
next unless (-f $quotafile);
open(QF, "& $quotafile") or die $!;
my ($firstln, $quota, $used);
while () {
my $line = $_;
if (! $firstln) {
$firstln = 1;
die "Error: corrupt quotafile $quotafile"
unless ($line =~ /^(\d+)S/);
$quota = $1;
last if (! $quota);
die "Error: corrupt quotafile $quotafile"
unless ($line =~ /\s*(-?\d+)/);
$used += $1;
close(QF);
next if (! $used);
my $percent = int($used / $quota * 100);
$lusers{$user} = $percent unless not $
#send a report to the postmasters
if ($MAIL_REPORT) {
open(MAIL, "| $MAILPROG");
select(MAIL);
map {print "To: $_\n"} @POSTMASTERS;
print "From: $COADDR\n";
print "Subject: Daily Quota Report.\n";
print "DAILY QUOTA REPORT:\n\n";
print "----------------------------------------------\n";
print "| % USAGE |
ACCOUNT NAME
print "----------------------------------------------\n";
foreach my $luser ( sort { $lusers{$b} &=& $lusers{$a} } keys %lusers ) {
| %32s |\n", $lusers{$luser}, $luser);
print "---------------------------------------------\n";
print "\n--\n";
print "$CONAME\n";
close(MAIL);
#email a warning to people over quota
if ($MAIL_WARNING) {
foreach my $luser (keys (%lusers)) {
next unless $lusers{$luser} &= $WARNPERCENT;
# skip those under quota
open(MAIL, "| $MAILPROG");
select(MAIL);
print "To: $luser\n";
map {print "BCC: $_\n"} @POSTMASTERS;
print "From: $SUADDR\n";
print "Subject: WARNING: Your mailbox is $lusers{$luser}% full.\n";
print "Reply-to: $SUADDR\n";
print "Your mailbox: $luser is $lusers{$luser}% full.\n\n";
print "Once your e-mail box has exceeded your monthly storage quota\n";
print "your monthly billing will be automatically adjusted.\n";
print "Please consider deleting e-mail and emptying your trash folder to clear some space.\n\n";
print "Contact &$SUADDR& for further assistance.\n\n";
print "Thank You.\n\n";
print "--\n";
print "$CONAME\n";
close(MAIL);
修改 /usr/local/sbin/quota_notify 脚本文件的可执行权限
cd /usr/local/sbin/
chmod 755 quota_notify
crontab -e
#进入定时功能脚本编辑状态
在定时功能脚本最后添加如下一行,然后保存退出
0 0 * * * /usr/local/sbin/quota_notify && /dev/null
8. 测试Postfix
telnet localhost 25
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
ESMTP Postfix (Debian/GNU)
ehlo localhost
250-PIPELINING
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
221 2.0.0 Bye
Connection closed by foreign host.
9. 给数据库mail添加数据
mysql -u root -p
#以root身份登录MySQL,输入密码
#在 mysql& 提示符下输入如下几段内容
#创建两个邮箱用户和,注意三个字段需替换为实际的邮箱域名,密码字段secret也请自行替换
INSERT INTO `domains` (`domain`) VALUES ('');
INSERT INTO `users` (`email`, `password`, `quota`) VALUES ('', ENCRYPT('secret'), );
INSERT INTO `users` (`email`, `password`, `quota`) VALUES ('', ENCRYPT('secret'), );
其实LNMP一键包内有phpMyAdmin软件包,利用该软件可以方便地进行MySQL数据库的操作,比如本步骤内的邮箱用户添加步骤如下图所示,注意password项需使用ENCRYPT功能以实现密码数据的加密保存
10. 创建邮箱用户对应的邮箱目录,注意字段的替换
apt-get install mailx
#没有mailx命令的话需要安装,可能会提示三个选项
apt-get install bsd-mailx
#那么就随便选一个比如bsd-mailx来安装mailx
#创建对应的邮箱目录
Subject: Welcome
#标题随便填写,比如Welcome,然后回车
Welcome! Have fun with your new mail account.
#内容随便填写,然后回车
#同时按一下CTRL+D
#直接回车退出
这时就会自动生成邮箱用户对应的 /home//info 邮箱目录了,至于邮件管理者是否需要生成对应的邮箱目录请自行安排。
也可以用另一种方式手工创建邮箱目录,注意字段的替换
maildirmake /etc/skel/Maildir
maildirmake /home//info
#创建邮箱目录
chown –hR vmail:vmail /home//info
#修改目录的所有者
11. 安装SquirrelMail及改密码插件change_sqlpass
apt-get install squirrelmail php-pear
apt-get install squirrelmail-locales squirrelmail-decode
#中文界面用的
pear install DB
#SquirrelMail的插件change_sqlpass用的
cd /usr/share/squirrelmail/plugins
wget http://www.squirrelmail.org/countdl.php?fileurl=http%3A%2F%2Fwww.squirrelmail.org%2Fplugins%2Fchange_sqlpass-3.3-1.2.tar.gz
mv *ns%2Fchange_sqlpass-3.3-1.2.tar.gz change_sqlpass-3.3-1.2.tar.gz
tar xvfz change_sqlpass-3.3-1.2.tar.gz
cd change_sqlpass
cp config.php.sample config.php
修改 /usr/share/squirrelmail/plugins/change_sqlpass/config.php 文件中的数行内容为如下所示,注意字段mail_admin_password的替换
// $csp_dsn = 'mysql://mail_admin:mail_admin_password@localhost/email_users';
$csp_dsn = 'mysql://mail_admin:mail_admin_password@localhost/mail';
// $lookup_password_query = 'SELECT count(*) FROM users WHERE username = "%1" AND crypt_password = %4';
$lookup_password_query = 'SELECT count(*) FROM users WHERE email = "%1" AND password = %4';
$password_update_queries = array(
'UPDATE users SET password = %4 WHERE email = "%1"',
'UPDATE users SET crypt_password = %4 WHERE username = "%1"',
// $password_encryption = 'MYSQLPWD';
$password_encryption = 'MYSQLENCRYPT';
// $csp_salt_static = '';
$csp_salt_static = 'LEFT(password, 2)';
// $csp_salt_query = 'SELECT salt FROM users WHERE username = "%1"';
// $csp_delimiter = '|';
$csp_delimiter = '@';
安装兼容插件Compatibility
cd /usr/share/squirrelmail/plugins
wget http://www.squirrelmail.org/countdl.php?fileurl=http%3A%2F%2Fwww.squirrelmail.org%2Fplugins%2Fcompatibility-2.0.16-1.0.tar.gz
mv *ns%2Fcompatibility-2.0.16-1.0.tar.gz compatibility-2.0.16-1.0.tar.gz
tar xvfz compatibility-2.0.16-1.0.tar.gz
/usr/sbin/squirrelmail-configure
#进入SquirrelMail配置界面
#亦可执行如下命令进入配置界面
/etc/squirrelmail/conf.pl
设置中文化和添加插件
键入 10 进入Languages菜单
Default Language
Default Charset
按r键返回上一级目录
键入 8 进入Plugins菜单
分别键入compatibility和change_sqlpass对应的数字以添加插件
按s键、然后任意键保存
按q键退出配置界面
如无法显示中文则需要添加字库
dpkg-reconfigure locales
按空格键选中如下四个字库
zh_CN GB2312
zh_CN.GB18030
zh_CN.UTF-8
在提示用什么locale为默认时,选默认的None或zh_CN.UTF-8,然后执行 reboot 命令重启系统。
12. 可访问 “已有域名/squirrelmail/src/configtest.php” 地址检查一下SquirrelMail的配置是否正常
如有类似 “/var/lib/squirrelmail/data/ should be writable by user www” 的出错提示,就修改相应目录的访问权限。
chmod 777 /var/lib/squirrelmail/data
chmod 777 /var/spool/squirrelmail/attach
LNMP一键包安装的是nginx解译引擎,建议将 /usr/share/squirrelmail/ 目录软链接至某个已有的虚拟空间的根目录下,或在VPS上新建的虚拟空间配置文件中指向它以便通过邮箱域名访问,在SquirrelMail登录页面中输入和密码
如登录SquirrelMail出错,请跟踪日志以确认问题所在
tail -f /var/log/mail.log &
登录正常后,如在 选项 & change password 界面中修改密码后提示出错 “Could not find Pear DB library”,则修改 /usr/local/php/etc/php.ini 文件(这是LNMP一键包安装的PHP配置文件路径,请按实际的路径去修改),添加PEAR的路径
; UNIX: "/path1:/path2"
;include_path = ".:/php/includes"
include_path = ".:/usr/share/php:/usr/share/php/PEAR:/usr/local/php"
再次登陆SquirrelMail修改密码,这时修改密码成功后可能会提示 “This page request could not be verified and appears to have expired”, 按参考文章(2)修改一下
/usr/share/squirrelmail/plugins/change_sqlpass/functions.php 文件就解决了。
--- change_sqlpass/functions_orig.php
22:34:25. +0200
+++ change_sqlpass/functions.php
22:37:29. +0200
@@ -474,7 +474,7 @@
sqgetGlobalVar('csp_was_already_encrypted_port', $csp_was_already_encrypted_port, SQ_SESSION);
sqgetGlobalVar('HTTP_HOST', $HTTP_HOST, SQ_SERVER);
if (empty($base_uri)) $base_uri = sqm_baseuri();
$loc = $base_uri . 'src/options.php?optpage=xx&optmode=submit&csp_change_success=no';
$loc = $base_uri . 'src/options.php?optpage=xx&optmode=submit&csp_change_success=no&smtoken=' . sm_generate_security_token();
if ($csp_was_already_encrypted_port == 443)
$cancel_location = 'https://' . $HTTP_HOST . $
else if ($csp_was_already_encrypted_port)
@@ -538,6 +538,7 @@
&td align=&right& colspan=&2&&
&input type=&hidden& name=&csp_submit_change& value=&1&&
&input type=&hidden& name=&smtoken& value=&&?php echo sm_generate_security_token(); ?&&&
&input type=&submit& value=&&?php echo _(&Submit&); ?&&&
@@ -927,7 +928,7 @@
if (!empty($csp_was_force_mode))
$loc = $base_uri . 'src/right_main.php';
$loc = $base_uri . 'src/options.php?optpage=xx&optmode=submit&csp_change_success=yes';
$loc = $base_uri . 'src/options.php?optpage=xx&optmode=submit&csp_change_success=yes&smtoken=' . sm_generate_security_token();
if ($csp_was_already_encrypted_port == 443)
$redirect_location = 'https://' . $HTTP_HOST . $
else if ($csp_was_already_encrypted_port)
最后到邮件客户端程序(比如outlook express、foxmail等)设置一下,POP(995)/IMAP(993)和SMTP(25)都需要SSL认证,帐户名(请替换为实际的邮箱域名),SMTP还需要发信身份认证,现在就可以在客户端进行邮件收发了。
如收不到邮件,请跟踪一下日志,如有提示 “postfix/trivial-rewrite[3092]: warning: do not list
in BOTH mydestination and virtual_mailbox_domains”,则按如下内容修改一下 /etc/postfix/main.cf 文件就解决了
# mydestination = , localhost, localhost.localdomain
mydestination =
安装可显示当前用户邮箱地址、ip和上次登录时间等信息的插件
cd /usr/share/squirrelmail/plugins
wget http://www.squirrelmail.org/countdl.php?fileurl=http%3A%2F%2Fwww.squirrelmail.org%2Fplugins%2Fshow_user_and_ip-3.3-re-1.2.2.tar.gz
mv *ns%2Fshow_user_and_ip-3.3-re-1.2.2.tar.gz show_user_and_ip-3.3-re-1.2.2.tar.gz
tar show_user_and_ip-3.3-re-1.2.2.tar.gz
cd show_user_and_ip
cp config.php.sample config.php
/etc/squirrelmail/conf.pl
#进入SquirrelMail配置界面
登录后到选项里面勾选在左边栏显示用户邮箱地址等信息,另外还可以修改配置文件 /usr/share/squirrelmail/plugins/show_user_and_ip/config.php 以改变字体大小等参数
* Font size for username, IP and hostname displayed
* on the left pane.
* Default: -2
$sui_font_size = 2;
登录后显示如下
更多插件请访问
, , , , , , ,
本文目前尚无任何 trackbacks 和 pingbacks.
Recent Posts

我要回帖

更多关于 postfix 备用服务器 的文章

 

随机推荐