0%

上一篇post提到已经有集成firmware的netinst iso镜像文件可以下载了,但很不幸,服务器安装的时候仍然提示找不到ql2400_fw.bin,也就是installer仍然没有找到qlogic卡的firmware。

无论使用原始的netinst还是添加firmware的netinst镜像,都不会提示需要额外的firmware。官方的wiki也提到,安装程序有时候会提示用户完成安装所需要的firmware,有时候却不会提示。所以建议在安装之前,下载non-free的firmware包,将其解压到移动存储设备的/firmware目录下,安装程序如果需要会自动的去移动存储设备的/firmware目录下寻找相应的firmware。

另一个解决办法是为原始的netinst iso镜像添加firmware,脚本如下,只支持netinst testing iso镜像:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/bin/bash

set -ex

if \[ $# != 2 \]; then
echo "Usage: addfirmware.sh <origin_iso_file> <new_iso_file>"
exit 1
fi

orign_iso_file=$1
new_iso_file=$2

#临时目录
temp=$(mktemp -d)
origin_iso=${temp}/old
new_iso=${temp}/new
firmware_file=${temp}/firmware
firmware_target=${firmware_file}/target
initrd=${temp}/initrd

#原始工作目录
origin_pwd=$(pwd)

mkdir ${origin_iso} ${firmware_file} ${initrd}

#挂载原始镜像iso文件,挂载后是只读的,拷贝全部文件到./new目录
sudo mount -o loop ${orign_iso_file} ${origin_iso}
cp -a ${origin_iso} ${new_iso}
sudo umount ${origin_iso}

#将初始化内存盘压缩cpio文件解压到./initrd目录
cd ${initrd} && gunzip < ${new_iso}/install.amd/initrd.gz sudo cpio --extract --preserve --verbose

#下载testing的firmware包
cd ${firmware_file} &&
wget http://cdimage.debian.org/cdimage/unofficial/non-free/firmware/testing/current/firmware.tar.gz
&& tar zxf firmware.tar.gz

#将所有的firmware deb包提取到./firmware/target目录
for file in *deb; do
dpkg-deb -x ${file} ${firmware_target}
done

#将target目录下所有的内容拷贝到./initrd目录
sudo cp -ra ${firmware_target}/. ${initrd}

#打包新的initrd文件并拷贝到./new目录下
cd ${initrd} && find . cpio --create --format='newc' gzip -9 > ../initrd.gz.new
sudo cp ../initrd.gz.new ${new_iso}/install.amd/initrd.gz

#制作新的镜像文件
cd ${origin_pwd} &&
sudo genisoimage -o ${new_iso_file} -b isolinux/isolinux.bin \\
-c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -J -R ${new_iso}

sudo rm -rf ${temp}

USB stick引导

上面制作的iso镜像刻录光盘安装系统是没有问题的。但如果要从USB引导就不可以了,因为从USB或硬盘启动时,PC-BIOS需要一个MBR,这样需要再为ISO镜像文件添加一个MBR,这与原来的El Torito引导记录并不冲突,二者可以共存。因此就可以创建一个MBR来启动El Torito引导记录,从而无论是从CDROM还是USB,HDD都可以正确引导。
这种MBR就叫做isohybrid

syslinux提供了这样的isohybrid MBR,还需要使用xorriso来制作镜像。因此先安装xorriso和syslinux

apt-get install xorriso syslinux

然后将上面脚本最后制作iso的命令更改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# -iso-level iso级别3允许文件大于4G
# -partition_offset 分区表起始位置
# -isohybrid-mbr 主引导记录文件
# -b 为PC-BIOS指定El Torito引导记录文件(boot image)
# -e 为EFI指定El Torito引导记录文件(boot image)
# -c 指定El Torito Boot Catalog文件
# -no-emul-boot 没有模拟启动,默认是软盘模拟启动
# -boot-load-size BIOS要读取引导记录文件(boot image)的几个数据块,boot image由-b参数指定。
# -boot-info-table 引导信息表写入boot image
# -r或-R Rock Ridge扩展
# -J Joliet扩展,用于windows系统
# -V 指定volume lable
# -o 输出iso文件
sudo xorriso -as mkisofs -iso-level 3 -partition_offset 16 -isohybrid-mbr \\
/usr/lib/syslinux/isohdpfx.bin -o ${new_iso_file} -b isolinux/isolinux.bin -c isolinux/boot.cat \\
-no-emul-boot -boot-load-size 4 -boot-info-table -r -V "firmwared debian" ${new_iso}

这里没有使用-J参数,如果添加了此参数会有警告:

libisofs: WARNING : Can’t add /debian to Joliet tree. Symlinks can
only be added to a Rock Ridget tree.

-J参数为iso生成Joliet目录树,当iso文件在windows系统下使用时才有用,Joliet不是标准的,只有windows和linux(为了和windows兼容)在使用。因此这个参数可以安全的去掉。

这里使用的isohybrid MBR为syslinux提供的/usr/lib/syslinux/isohdpfx.bin,这样生成的iso无论是刻盘还是写到usb stick都可以正常的引导安装了。

脚本下载

参考:
add-firmware-to
REBUILDING DEBIAN INSTALLER ISO TO INCLUDE ADDITIONAL DRIVERS
Mkisofs

===
[erq]

直接连上打印机虽然看起来好像是安装成功了,但是不能打印的,因为缺少firmware。

printer-driver-foo2zjs带了应用程序getweb可以用来下载对应的firmware并转换到linux可以使用的格式:

getweb P1008

sihpP1006.img

(c) Copyright Hewlett-Packard 2009

这样/lib/firmware/hp下会安装了P1008可以使用的firmware文件sihpP1006.dl

这样就可以正常使用P1008了。

安装

1
# apt-get install courier-imap courier-authlib-mysql

配置

编辑/etc/courier/authdaemonrc

1
2
3
...
authmodulelist="authmysql"
...

编辑/etc/courier/authmysqlrc,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
MYSQL_SERVER localhost
MYSQL_USERNAME postfix
MYSQL_PASSWORD postfix
MYSQL_PORT 3306
MYSQL_DATABASE mail
MYSQL_USER_TABLE users
#MYSQL_CRYPT_PWFIELD password # 加密密码
MYSQL_CLEAR_PWFIELD password # 非加密密码
MYSQL_UID_FIELD 5000 # 虚拟邮箱域目录所有者uid
MYSQL_GID_FIELD 5000
MYSQL_LOGIN_FIELD email #用户名
MYSQL_HOME_FIELD '/var/mail/vmail' #虚拟邮箱域邮箱基本目录
# 用户Maildir目录
MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
#MYSQL_NAME_FIELD

SSL/TLS加密

未启用SSL/TLS加密时,客户端与imap服务器的所有通讯都是以明文传输的,包括认证用户名和密码。因为如果需要安全的imap服务,则需要启用SSL/TLS加密。

安装courier-imap-ssl

1
# apt-get install courier-imap-ssl

安装过程中为会localhost自签一对证书,放置在/etc/courier/imapd.pem文件中,如果正式使用,最好还是去申请CA签署的证书。

为imap服务的域名imap.openwares.net生成自签证书:

编辑/etc/courier/imapd.cnf:

1
CN=imap.openwares.net #CN为Canonical Name缩写

删除掉安装时为localhost自签的证书

1
# rm -f /etc/courier/imapd.pem

重新为imap.openwares.net生成证书

1
# mkimapdcert

重新启动ssl imapd

1
# /etc/init.d/courier-imap-ssl restart

将未加密imap服务删除

1
2
# /etc/init.d/courier-imap stop
# rm /etc/init.d/courier-imap

未启用SSL/TLS加密的imapd使用知名端口143,启用加密后imapd使用知名端口993。

===
[erq]

SASL基础配置

postfix支持SASL认证,可以使用Cyrus SASL或Dovecot SASL实现,通常使用Cyrus SASL。
因为postfix链接了libsasl库,所以是直接通过函数调用的方式与Cyrus SASL通信,因此无需saslauthd守护程序的支持。
认证配置文件的名字为smtpd.conf,其中smtpd由postfix传递给Cyrus SASL库,cyrus添加后缀.conf。cyrus会先搜索/usr/lib/sasl2/目录查找smtpd.conf,如果找到则不继续查找。debian发行版此配置文件的路径为/etc/postfix/sasl/smtpd.conf

Cyrus SASL支持多种认证方式,通过saslauthd守护程序支持/etc/shadow,PAM和IMAP server,然后通过插件机制(叫做auxiliary property plugins)支持其他认证方式。

auxprop插件有如下几个:

  • sasldb
    帐号存储在Berkeley DB中
  • sql
    帐号存储在SQL数据库中,比如mysql,PostgreSQL。要使用sql插件,必须安装libsasl2-modules-sql

    apt-get install libsasl2-modules-sql

  • ldapdb
    帐号存储在LDAP数据库中

下面的配置文件/etc/postfix/sasl/smtpd.conf使用sql插件:

1
2
3
4
5
6
7
8
9
pwcheck_method: auxprop
auxprop_plugin: sql
mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM
sql_engine: mysql
sql_hostnames: 127.0.0.1
sql_user: postfix
sql_passwd: postfix
sql_database: mail
sql_select: SELECT password FROM users WHERE email = '%u@%r'

其中:
sql_hostnames - 指定localhost则通过UNIX-domain socket连接到mysql,如果指定127.0.0.1则通过tcp连接mysql

为了启用sasl认证,必须在/etc/postfix/main.cf中指定:
smtpd_sasl_auth_enable = yes

reload postfix,测试一下sasl auth

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ telnet localhost 25
Trying ::1...
Connected to openwares.net.
Escape character is '^\]'.
220 openwares.net ESMTP Postfix (Debian/GNU)
EHLO test
250-openwares.net
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM <---smtp认证启用
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

也可以通过saslauthd + PAM + pam_mysql的方式来使用mysql数据库存储账户,可以支持密码加密。

有些客户端不能正确的识别AUTH,在main.cf中添加如下指令来支持这些客户端:
broken_sasl_auth_clients = yes

SMTP认证策略

有以下几个认证策略用于限制SASL的认证机制:

  • noanonymous
    不允许匿名认证的SASL认证机制
  • noplaintext
    不允许传输未加密的用户名和密码信息的SASL认证机制
  • nodictionary
    不允许容易被字典攻击的SASL认证机制
  • forward_secrecy
    在会话之间传递密钥
  • mutual_auth
    仅使用客户和服务器相互认证的机制

未加密STML会话
默认的认证策略是允许SASL匿名认证之外的所有其他认证机制,在main.cf中:
smtpd_sasl_security_options = noanonymous

加密SMTP会话(TLS)
在加密的SMTP会话中有一个单独的参数控制认证策略,一般在main.cf中如下设置:

smtpd_sasl_security_options = noanonymous, noplaintext
smtpd_sasl_tls_security_options = noanonymous

如果只有在TLS加密的前提下才提供AUTH认证,可以在main.cf中添加:
smtpd_tls_auth_only = yes

SASL授权
客户端通过SASL认证后,postfix给于客户适当的授权

中继授权
通过在中继策略中添加permit_sasl_authenticated选项,postfix允许认证的客户端向本域之外的远程其他域收件人发送邮件。
/etc/postfix/main.cf中:

1
2
3
4
5
6
7
8
9
10
# postfix 2.0 and later
smtpd_relay_restrictions =
permit_mynetworks
permit_sasl_authenticated <---
reject_unauth_destination
# postfix 2.0 and before
smtpd_recipient_restrictions =
permit_mynetworks
permit_sasl_authenticated <---
reject_unauth_destination

注意:postfix版本2.9.6,main.cf中设置smtpd_relay_restrictions参数,重新加载postfix时会提示:
postconf: warning: /etc/postfix/main.cf: unused parameter: smtpd_relay_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination,因为2.10及以下版本需要使用smtpd_recipient_restrictions参数

拒绝未认证的客户端

main.cf配置文件中添加:

1
2
smtpd_delay_reject = yes
smtpd_client_restrictions = permit_sasl_authenticated, reject

注意:这样设置可能会导致拒绝接受其他smtp投递过来的信件。

发送者地址授权

如果没有SMTP认证,SMTP客户端可以使用MAIL FROM命令随意指定信封上的发件者邮件地址,因为smtp服务器不只知道smtp客户的用户名。
使用SASL认证之后,postfix可以通过维护一张信封地址和认证用户之间的映射表就可以控制smtp用户只能使用自己拥有的信封地址来发送邮件。
/etc/postfix/main.cf:

1
smtpd_sender_login_maps = hash:/etc/postfix/controlled_envelope_senders

/etc/postfix/controlled_envelope_senders:

1
2
3
4
5
# envelope sender owners (SASL login names)
john@example.com john@example.com
helpdesk@example.com john@example.com, mary@example.com
postmaster admin@example.com
@example.net barney, fred, john@example.com, mary@example.com

SASL其他选项

每帐号控制
postfix可以通过sasl用户名来实现每个账户的单独控制。通常用于保留(HOLD)或拒绝(REJECT)存在问题帐号的邮件。
/etc/postfix/main.cf:

1
2
3
4
5
smtpd_recipient_restrictions = 
permit_mynetworks
check_sasl_access hash:/etc/postfix/sasl_access
permit_sasl_authenticated
...

/etc/postfix/sasl_access:

1
2
3
4
# Use this when smtpd_sasl_local_domain is empty.
username HOLD
# Use this when smtpd_sasl_local_domain=example.com.
username@example.com HOLD

默认认证域
为没有域名部分的SASL登录名添加域名,比如登录名为john,替换为john@example.com
/etc/postfix/main.cf:
smtpd_sasl_local_domain = example.com

隐藏sasl认证
可以为部分客户或网络隐藏SASL认证,因为有些不需要认证的客户如果发现服务提供SASL认证能力,那么他们会试图去认证,但客户端有没有提供认证信息,这样客户就一直处于认证失败状态。

/etc/postfix/main.cf:
smtpd_sasl_exceptions_networks = !192.0.2.171/32, 192.0.2.0/24

添加sasl登录名到邮件头

在发送邮件的头部Received字段添加SASL认证登录名

参考:
Postfix SASL Howto

===
[erq]

电子邮件系统结构图
图片来自网络

email architecture

基本概念
电子邮件系统有几个基本的概念:

  • MUA
    邮件用户代理(Mail User Agent),邮件系统的客户端,用户用来收发邮件的软件,常见的有linux下的mail,mutt,windows平台下的outlook express等。
  • MSA
    邮件提交代理(Mail Submmission Agent),MSA居于MUA和MTA之间,MSA一般使用587端口向MTA提交邮件。
  • MTA
    邮件传输代理(Mail Transfer Agent),负责邮件的存储和转发,是邮件系统的核心,一般也称之为邮件服务器,常见的有postfix,sendmail,qmail,exim4等。MTA之间使用25端口交换邮件信息。
  • MDA
    邮件投递代理(Mail Dlivery Agent),MTA接收到自己管理的域上用户的邮件后,使用MDA将邮件投递给本地用户。常见的MDA有maildrop,procmail等。
  • MRA
    邮件访问代理(Mail Retrieval Agent),将用户连接到系统邮件,使用POP3或IMAP协议收取邮件,比如fetchmail等。

通常这些代理角色分的并不是很清楚,也不太容易区分。经常一个程序实现多个代理角色。对这几个代理角色更详尽的描述见这里

一封电子邮件在各个代理之间的流动大体是这样的:
MUA → MSA → MTA → … → MTA → MDA → MRA → MUA

安装

apt-get install postfix postfix-mysql

基本配置
postfix主配置文件有两个/etc/postfix/main.cf和master.cf

main.cf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
myhostname = mail.openwares.net #指定主机名
mydomain = openwares.net #指定域名
myorigin = $mydomain #本邮件服务器所发送邮件的域名后缀

#本地投递的域名,所有发送给user@mydestination的邮件都在本地交付
mydestination = localhost.localdomain localhost

#为来自哪些网络的客户转发邮件(forward,relay),默认为邮件服务器所连接的子网,如果邮件服务器连接在广域网上,
#那么默认设置就太open了。
mynetworks = 127.0.0.0/8 \[::ffff:127.0.0.0\]/104 \[::1\]/128
relay_domains = #拒绝为陌生人转发邮件
relayhost = #直接通过互联网发送邮件
inet_interfaces = all #postfix监听的接口

理解虚拟域
postfix有两种域,一种是本地域, 另一种就是虚拟域。

本地域:

本地域一般包括postfix运行的机器上的主机名和ip地址,main.cf中用mydestination指名本地域。本地域上的所有用户都有对应的unix账户。如果采用mbox邮箱格式,则用户的邮箱是/var/mail目录下的用户名同名文件,如果采用Maildir邮箱格式,比如在main.cf中设置home_mailbox = Maildir/,则用户的邮箱就是用户主目录的Maildir目录。

虚拟域:

除了本地域之外,postfix还可以管理其他域,这就是虚拟域。虚拟域分为两种,一种是虚拟别名域,另一种是虚拟邮箱域

  • 虚拟别名域
    使用virtual_alias_domain指定虚拟别名域,然后通过虚拟别名映射virtual_alias_maps将,虚拟域的用户帐号映射到本地unix账户或者远程mail地址
  • 虚拟邮箱域
    使用virtual_mailbox_domains指定虚拟邮箱域,通过virtual_mailbox_maps等配置参数为虚拟域的用户映射邮箱地址。虚拟邮箱域的账户不必有对应的unix系统账户。

一个域要么是本地域,要么是虚拟域;一个虚拟域要么是虚拟别名域,要么是虚拟邮箱域。也就是本地域,虚拟别名域,虚拟邮箱域是互斥的

那么一个postfix邮件系统要添加一个额外的域,有这么几种选择,几个实例如下:

  • 加入本地域
    很简单,直接将域名添加到mydestination中即可。这样有两个缺点:
    第一,所有本地域上的同名用户都对应同一个unix系统账户,也就是info@domain1.tld和info@domain2.tld的所有邮件都将发给unix系统用户info。
    第二,所有的用户必须有对应的unix系统用户,如果用户很多,管理起来比较麻烦。
  • 加入虚拟别名域
    /etc/postfix/main.cf:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     virtual_alias_domains = example.com
    virtual_alias_maps = hash:/etc/postfix/virtual
    ```
    /etc/postfix/virtual:
    ```js
    postmaster@example.com postmaster
    info@example.com joe
    sales@example.com jane
    # Uncomment entry below to implement a catch-all address
    # @example.com jim #example.com域上的所有其他用户的邮件都发送给jim,这样可能会有垃圾邮件的困扰

也可以将虚拟别名域上的用户映射到远程账户,只是作为转发之用。

  • 加入虚拟邮箱域
    /etc/postfix/main.cf:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     virtual_mailbox_domains = example.com 
    virtual_mailbox_base = /var/mail/vhosts #指定虚拟邮箱域内所有用户邮箱相对的基本目录
    virtual_mailbox_maps = hash:/etc/postfix/vmailbox
    virtual_minimum_uid = 100 #邮箱文件(mbox)或目录(Mailbox)的最小owner id
    virtual_uid_maps = static:5000 #静态映射邮箱所有者uid
    #静态映射邮箱所有者gid。uid和gid也可以指定查找表,通过邮件地址来查找对应的gid或uid
    virtual_gid_maps = static:5000
    virtual_alias_maps = hash:/etc/postfix/virtual #虚拟邮箱域也可以使用别名映射
    ```
    /etc/postfix/vmailbox:
    ```js
    #mbox邮箱格式,完整的邮箱地址为/var/mail/vhosts/example.com/info
    info@example.com example.com/info
    #Maildir邮箱格式,完整的邮箱地址为/var/mail/vhosts/example.com/sales/
    sales@example.com example.com/sales/
    # Comment out the entry below to implement a catch-all.
    # @example.com example.com/catchall
    #...virtual mailboxes for more domains...
    /etc/postfix/virtual:
    1
    postmaster@example.com postmaster #虚拟邮箱域用户映射到本地unix用户

postfix支持丰富的查找表类型, hash,ldap,mysql等,一般使用数据库比较方便。

虚拟邮箱域mysql数据库配置
这里使用mysql数据库来设置openwares.net虚拟邮箱域

创建数据库

1
2
3
4
5
6
7
8
9
10
11
mysql> CREATE DATABASE mail;
mysql> GRANT ALL ON mail.* TO 'postfix'@'localhost' IDENTIFIED BY 'postfix';
mysql> GRANT ALL ON mail.* TO 'postfix'@'localhost.localdomain' IDENTIFIED BY 'postfix';
mysql> FLUSH PRIVILEGES;
mysql> USE mail;
mysql> CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
PRIMARY KEY (email)
);
mysql> quit;

创建postfix配置文件
/etc/postfix/mysql_virtual_mailboxes.cf

1
2
3
4
5
user = postfix
password = postfix
dbname = mail
query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s'
hosts = 127.0.0.1

query语句从user表动态构建出用户对应的Maildir目录,格式为domain.tld/username/

/etc/postfix/main.cf中添加:

1
2
3
4
5
6
virtual_mailbox_domains = openwares.net
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailboxes.cf
virtual_mailbox_base = /var/mail/vmail
virtual_minimum_uid = 5000
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

创建虚拟邮箱文件夹的所有者

1
2
# groupadd -g 5000 vmail
# useradd -g vmail -u 5000 vmail -d /var/mail/vmail -m

在users表里添加用户

1
mysql> insert into users values ('test@openwares.net', 'password');

就可以使用test@openwares.net邮箱了。

别名设置

/etc/aliases为postfix的本地别名数据库,可以为本地收件人重定向邮件,这种重定向由本地交付代理(local delivery agent)处理。可以添加一个重定向将root重定向到自己的用户,从而所有的系统邮件都会发给你。比如在文件中添加如下行:

1
root: yourname

修改/etc/aliases之后,需要执行命令

1
# newaliases

使修改生效。

TLS加密

如果不开启TLS,则邮件客户端与服务器之间是明文传输的,包括邮件内容和smtp认证的用户名和密码都容易被中间节点截获。因此如果需要更安全的电子邮件系统,则需要为postfix配置TLS加密。

启用TLS,需要为服务器创建私钥和数字证书(签名的公钥),公私钥必须是PEM格式,并且私钥不能添加passphrase。
数字证书需要受信任的证书颁发机构(CA)签发才被别人认可,虽然自签也能使用,但不一定为大多数的客户端所支持。
当前免费的CA机构有CACertStartSSL,但被支持的程度还都不高,CACert在开源世界得到广泛支持。

生成自签X.509证书

1
2
$ cd /etc/postfix
$ openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509

一般使用RSA证书就可以了。有了证书后,在main.cf中添加如下设置:

1
2
3
4
smtpd_tls_cert_file = /etc/postfix/smtpd.cert #证书
smtpd_tls_key_file = /etc/postfix/smtpd.key #私钥
smtpd_tls_security_level = may # may 不强制客户端使用TLS, encrypt 则强制客户端使用TLS
#smtpd_use_tls = yes #这是已经废弃的参数,新版本postfix不再使用

通常来讲未机密服务和加密服务使用不同的端口号,比如http使用80,https使用443。smtp使用25,smtps使用465。
但是使用两个端口有些太浪费了,smtp支持STARTSSL,也就是先在25端口上连接,需要加密连接服务时,可以通过STARTSSL将普通连接升级到SSL加密连接。

SMTP最初是设计来传输(transfer)邮件而不是提交(submission)邮件的,因此又有了另一个端口587用于消息提交(message submission)。MSA(Mail Submmission Agent)使用这个端口向MTA(Mail Tansfer Agent)提交邮件。

postfix也可以通过配置直接使用465端口提供加密连接,而不是使用STARTSSL。部分客户端依赖于这种方式,但这种方式是不鼓励使用的。
postfix使用wrapper来支持smtps。

配额quota
可以使用VDA添加配额支持,需要给postfix打补丁。

UPDATE(01/24/2014):
在user表中添加一个用户帐号后,用户的虚拟邮箱目录是尚未建立的,只有当用户收到第一封邮件时,postfix才会为用户建立maildir目录。之后才能使用imap登录用户邮箱,否则imap会有错误提示:

Jan 24 10:33:29 www imapd-ssl: xxx@openwares.net: No such file or directory

所以新增邮箱用户后,立马向其发送一个welcome邮件吧。

参考:
Postfix Basic Configuration
Postfix Virtual Domain Hosting Howto
Postfix Lookup Table Overview
Virtual Users And Domains With Postfix, Courier, MySQL And SquirrelMail (Ubuntu 12.04 LTS)
Postfix TLS Support
SSL vs TLS vs STARTTLS

===
[erq]

抽时间写个MyBatis Generator plugin,生成selectBySampleSelective接口和相应的xml select元素。selectBySampleSelective方法使用一个样本实体记录,通过对sample样本存在的字段与表相应字段做相等比较来检索表记录。虽然selectByExample方法完全可以满足要求,但selectByExample实在太重量级了。