前提:架设好dns服务 (linux.markcao.com /192.168.2.101)
chkconfig –level 2345 named on
chkconfig –list named
iptables –L
service iptables stop
需注意/etc/resolv.conf里要有search  markcao.com对应。
如无法启动postfix,可在文件/etc/hosts里加
127.0.0.1    localhost.localdomain localhost
 
需安装:yum  install  postfix
        yum  install  dovecot
        yum  install  mysql*
        yum  install  perl*
 
postfix最基本的配置文件,它们的区别在于:
mail.cfpostfix主要的配置文件。
Install.cf包含安装过程中安装程序产生的postfix初始化设置。
master.cfpostfixmaster进程的配置文件,该文件中的每一行都是用来配置postfix的组件进程的运行方式。
postfix-script包装了一些postfix命令,以便我们在linux环境中安全地执行这些postfix命令。
 
需更改:
vim /etc/postfix/main.cf
69   myhostname=linux.markcao.com     指向真正的域名
79   mydomain=markcao.com      地机邮件主机所在的域
95         myorigin=$myhostname     设置由本机寄出的邮件所使用的域名或主机名称
96         myorigin=$mydomain
113  inet_interfaces=all      主机监听的网络接口
164  mydestination=$myhostnamelocalhost.$mydomainlocalhost$mydomain
                mail.$mydominwww.$mydomainftp.$mydomain
                          设置能够收信的主机名称”, 你的 postfix 只有在发现 mydestination 这个项目中有写入 的主机名称做为收信主机时,才会将该封信件收下来
248  mynetworks_style=subnet   # class =>与伺服器位于同一级IP网路的主机都可以使用代转服务
# subnet =>
所在网域的任一个IP都可以使用代转服务
# host =>
仅开放localhost为信任可代转的主机
262  mynetworks=192.168.2.0/24127.0.0.0/8     本地邮件服务器信赖的网络
296  realy_domains=$mydestination        参数决定了Postfix 可以帮忙传递哪些域的邮件
314  relayhost=$mydomain
388  alias_maps=hash:/etc/aliases
399  alias_database=hash:/etc/aliases
421  home_mailbox=maildir/     指定postfix在进行邮件投递时使用与Qmail类似的Maildir方式,此方式每封邮件是一个独立的文件,比较易于管理,另外IMAP默认也是在用户目录的Maildir中访问邮箱的。在选Maildir方式时,mailbox_command选项应该置空。
429  mail_spool_directory=/var/spool/mail
 notify_classes = resource, software  缺省值
postfix系统中,必须指定一个postfix系统管理员的别名指向一个用户,
只有这样,在用户遇到问题时才有报告的对象,postfix也才能将系统的问题报告给管理员。notify_classes参数就是用来指定向postfix管理员报告错误时的信息级别。共有以下几种级别:
bounce:将不可以投递的邮件的拷贝发送给postfix管理员。出于个人隐私的缘故,该邮件的拷贝不包含信头。
2bounce:将两次不可投递的邮件拷贝发送给postfix管理员。
delay:将邮件的投递延迟信息发送给管理员,仅仅包含信头。
policy:将由于UCE规则限制而被拒绝的用户请求发送给postfix管理员,包含整个SMTP会话的内容。
protocol:将协议的错误信息或用户企图执行不支持的命令的记录发送给postfix管理员。同样包含整个SMTP会话的内容。
resource:将由于资源错误而不可投递的错误信息发送给postfix管理员,比如:队列文件写错误等等。
software:将由于软件错误而导致不可投递的错误信息发送给postfix管理员。
 
cat  /etc/postfix/main.cf |grep –v “#” |more   (等同于postconf -n
netstat –natp |grep 25
ps aux |grep postfix
 
 
vim /etc/dovecot.conf
17        protocols=imap pop3
38  protocol imap {
        listen=*:143
       }
protocol pop3 {
    listen=*:110
   }
129 login_dir=/var/run/dovecot/login
142 login_user=dovecot
208 mail_location=maildir:/maildir
 
service dovecot start
ps aux |grep dovecot
netstat –natp |grep 110/143
service postfix restart
service dovecot restart
如没注册到外网,客户端要将网关设为主机ip
 
postfixUCEunsolicited commercial email)控制
所谓UCE控制就是指控制postfix接收或转发来自于什么地方的邮件。
  缺省地,postfix转发符合以下条件的邮件:
* 来自客户端ip地址符合$mynetworks的邮件。
* 来自客户端主机名符合$relay_domains及其子域的邮件。
* 目的地为$relay_domains及其子域的邮件。
  缺省地,postfix接受符合以下条件的邮件:
* 目的地为$inet_interfaces的邮件。
* 目的地为$mydestination的邮件。
* 目的地为$virtual_maps的邮件。
  但是我们也可以通过下面的规则来实现更强大的控制功能。
1. 信头过滤
  通过header_checks参数限制接收邮件的信头的格式,如果符合指定的格式,则拒绝接收该邮件。可以指定一个或多个查询列表,如果新邮件的信头符合列表中的某一项则拒绝该接收邮件。如:
header_checks = regexp:/etc/postfix/header_checks
header_checks = pcre:/etc/postfix/header_checks
  缺省地,postfix不进行信头过滤。
2.客户端主机名/地址限制
  通过smtpd_client_restrictions参数限制可以向postfix发起SMTP 连接的客户端的主机名或ip地址。可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。可用的规则有:
reject_unknown_client:如果客户端的ip地址在DNS中没有PTR记录则拒绝转发该客户端的连接请求。可以用 unknown_client_reject_code参数指定返回给客户机的错误代码(缺省为450)。如果你有用户没有作DNS记录则不要启用该选项。
permit_mynetworks:如果客户端的ip地址符合$mynetworks参数定义的范围则接受该客户端的连接请求,并转发该邮件。
check_client_access maptype:mapname:根据客户端的主机名、父域名、ip地址或属于的网络搜索access数据库。如果搜索的结果为REJECT 或者 '[45]XX text' 则拒绝该客户端的连接请求;如果搜索的结果为OKRELAY 或数字则接受该客户端的连接请求,并转发该邮件。。可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为 554)。
reject_maps_rbl:如果客户端的网络地址符合$maps_rbl_domains参数的值则拒绝该客户端的连接请求。可以用maps_rbl_reject_code参数指定返回给客户机的错误代码(缺省为554)。
  示例:
smtpd_client_restrictions = hash:/etc/postfix/access, reject_maps_rbl
smtpd_client_restrictions = permit_mynetworks, reject_unknown_client
  该参数的缺省值为:
smtpd_client_restrictions =
  也即接收来自任何客户端的SMTP连接。
3. 是否请求HELO命令
  可以通过smtpd_helo_required参数指定客户端在SMTP会话的开始是否发送一个HELO命令。你可以指定该参数的值为yesno。缺省值为:
smtpd_helo_required = no
4. HELO主机名限制
  可以通过smtpd_helo_restrictions参数指定客户端在执行HELO命令时发送给postfix的主机名。缺省地, postfix 接收客户端发送的任意形式的主机名。可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。可用的规则有:
reject_invalid_hostname:如果HELO命令所带的主机名参数不符合语法规范则拒绝客户机的连接请求。可以用invalid_hostname_reject_code参数指定返回给客户机的错误代码(缺省为501)。
permit_naked_ip_addressRFC要求客户端的HELO命令包含的ip地址放在方括号内,你可以用permit_naked_ip_address参数取消该限制。因为有的mail客户端不遵守该RFC的规定。
reject_unknown_hostname:如果客户端执行HELO命令时的主机名在DNS中没有相应的A MX 记录则拒绝该客户端的连接请求。可以用invalid_hostname_reject_code参数指定返回给客户机的错误代码(缺省为450)。
reject_non_fqdn_hostname:如果客户端执行HELO命令时的主机名不是RFC规定的完整的域名则拒绝客户端的连接请求。可以用invalid_hostname_reject_code参数指定返回给客户机的错误代码(缺省为504)。
check_helo_access maptype:mapname:根据客户端HELO的主机名、父域名搜索access数据库。如果搜索的结果为REJECT 或者 '[45]XX text' 则拒绝该客户端的连接请求;如果搜索的结果为OKRELAY 或数字则接受该客户端的连接请求。可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为554)。
  示例:
smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname
5. RFC 821信头限制
  RFC 821对邮件的信头做了严格的规定,但是广泛使用的sendmail并不支
持该规定,所以对于该参数我们只能说不,即:
strict_rfc821_envelopes = no
6. 通过发件人地址进行限制
  可以用smtpd_sender_restrictions参数通过发件人在执行MAIL FROM命令时提供的地址进行限制。可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。可用的规则有:
reject_unknown_sender_domain:如果MAIL FROM命令提供的主机名在DNS中没有相应的A MX 记录则拒绝该客户端的连接请求。可以用unknown_address_reject_code参数指定返回给客户机的错误代码(缺省为450)。
check_sender_access maptype:mapname:根据MAIL FROM命令提供的主机名、父域搜索access数据库。如果搜索的结果为REJECT 或者 '[45]XX text' 则拒绝该客户端的连接请求;如果搜索的结果为OKRELAY 或数字则接受该客户端的连接请求。可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为554)。可以通过该参数过滤来自某些不受欢迎的发件人的邮件。
reject_non_fqdn_sender:如果MAIL FROM命令提供的主机名不是RFC规定的完整的域名则拒绝客户端的连接请求。可以用non_fqdn_reject_code 参数指定返回给客户机的错误代码(缺省为504)。
缺省地,postfix接受来自任何发件人的邮件。
  示例:
smtpd_sender_restrictions = hash:/etc/postfix/access, reject_unknown_sender_domain
7. 通过收件人地址进行过滤
  可以用smtpd_recipient_restrictions参数通过发件人在执行RCPT TO命令时提供的地址进行限制。缺省值为:
smtpd_recipient_restrictions = permit_mynetworks, check_relay_domains
  可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。可用的规则有:
check_relay_domains:如果符合以下的条件,则接受SMTP连接请求,否则拒绝该连接,可以用relay_domains_reject_code 参数指定返回给客户机的错误代码(缺省为504)。
* 客户端主机名符合$relay_domains及其子域
* 目的地为$inet_interfaces$mydestination$virtual_maps
permit_auth_destination:不管客户端的主机名,只要符合以下的条件,就
接受SMTP连接请求:
* 解析后的目标地址符合$relay_domains及其子域
* 解析后的目标地址符合$inet_interfaces$mydestination$virtual_maps
reject_unauth_destination:不管客户端的主机名,只要符合以下的条件,就拒绝该客户端SMTP连接请求:
* 解析后的目标地址符合$relay_domains及其子域
* 解析后的目标地址符合$inet_interfaces$mydestination$virtual_maps
check_recipient_access:根据解析后的目标地址、父域搜索access数据库。如果搜索的结果为REJECT 或者 '[45]XX text' 则拒绝该客户端的连接请求;如果搜索的结果为OKRELAY 或数字则接受该客户端的连接请求。可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为554)。
reject_unknown_recipient_domain:如果收件人的邮件地址在DNS中没有相应的A MX 记录则拒绝该客户端的连接请求。可以用unknown_address_reject_code参数指定返回给客户机的错误代码(缺省为450)。
reject_non_fqdn_recipient:如果发件人在执行RCPT TO命令时提供的地址
不是完整的域名则拒绝其SMTP连接请求。可以用The non_fqdn_reject_code参数指定返回给客户机的错误代码(缺省为504)。
posftfix的性能控制
  之所以对postfix的性能进行控制,是为了在遇到邮件风暴时保证postfix可以正常运行。通常,我们可以通过对下列postfix 参数的配置来调节postfix的性能,这些参数都是通过mail.cf配置文件进行配置的,修改以后不要忘了运行postfix reload命令来使配置生效。
1. 进程数限制
  可以通过default_process_limit 参数来控制postfix系统同时可以运行的最大进程数目。缺省值是50个。
2. 对同一目标主机的并发连接限制
  当向同一目标主机发出SMTP连接时,postfix初始化发出两个SMTP连接,如果投递成功则增加并发的SMTP连接数目,遇到拥塞时又减少并发连接的数目。postfix中通过以下的参数对同一目标主机的并发连接进行控制:
* initial_destination_concurrency:控制对同一目标主机的初始化并发连接数目。缺省值为2
* default_destination_concurrency_limit:控制初始化连接后对同一目标主机的最大并发连接数目。缺省值为10
* local_destination_concurrency_limit:控制对同一本地收件人的最大同时投递的邮件数目。缺省值为2,因为对本地同一收件人投递邮件时投递工作只能一个接一个的进行,所以设得在大也没用。
3. 对同一封邮件的收件人数目限制
  通过default_destination_recipient_limit参数来控制postfix的投递代理(如
smtp进程)可以将同一封邮件发送给多少个收件人。缺省值为50。也可以用明确指出该投递代理的参数来覆盖该缺省值。如用smtpd_recipient_limit来指定smtp投递代理可以将同一封邮件发送给多少个收件人,该参数的缺省值为1000
4. 推迟投递控制
  通过defer_transports参数,我们可以推迟投递该参数指定的邮件直到postfix明确的提出投递要求。下面我们看一个例子:
  有一个小型的局域网,用户都将邮件发送给局域网内部的一台postfix邮件服务器,然后通过在该服务器上拨号将邮件发送出去。这时我们可以这样指定该参数的值:
defer_transports = smtp
  该语句表示postfix推迟投递所有的邮件直到执行sendmail -q命令,这样我们就可以在ppp的脚本中加上sendmail -q,以便在拨号成功后让postfix开始投递邮件
 
 
虚拟用户:main.cf里加入virtual_maps = hash:/etc/postfix/virtual, 这个是虚拟域的位置,还要往这个文件里加入内容,格式为:
  markcao.net           anything
  root@markcao.com      root
  之后,用postmap命令生成虚拟域数据库:
  postmap /etc/postfix/virtual
  前面是虚拟用户,后面是系统用户,其实收邮件还是系统用户收发的,只是允许虚拟用户对其操作而已