自創--簡單配置postfix+courier+squirrelmail+pam郵件服務器

Web、Mail、Ftp、DNS、Proxy、VPN、Samba、LDAP 等基础网络服务
头像
xiehuoli
帖子: 5941
注册时间: 2006-06-10 8:43
来自: 中国 CS

自創--簡單配置postfix+courier+squirrelmail+pam郵件服務器

#1

帖子 xiehuoli » 2008-05-27 21:55

牢騷:從沒接觸過郵件服務器,我是一個菜菜鳥,因為公司郵件服務器要求比較復雜。經過寄個禮拜的努力和GOOGLE終于完成了這個巨作。NNND可憐我所有的休息時間都搭上去了,痛恨我那蹩腳的英語水平。痛恨ubuntu為什麽沒有完全的資料。所以本小姐為ubuntu貢獻一下。歡迎大家討論修改,指教

參考
http://wiki.ubuntu.org.cn/index.php?tit ... iant=zh-cn
http://wiki.ubuntu.org.cn/index.php?tit ... iant=zh-tw
http://wiki.ubuntu.org.cn/Ubuntu%E6%9C% ... 1.E5.99.A8
正文:
1.要求用戶使用web郵箱
2.用戶第一次登錄要求提示修改密碼
3.有發件自動回復功能
4.要求用戶賬號為別名
5.郵件過濾和防垃圾郵件,不用考慮,交給郵件防火牆搞定,幾W塊的郵件防火牆總得做點事情賽。軟件這方面暫時還不能和硬件比。
奇怪的要求吧,嘿嘿

軟件
1.平台ubuntu6.06
2.軟件postfix,(邮件传输代理(MTA)和SMTP服务器,這玩意功能很強也很靈活)courier(pop3/imap收件服務)squirrelmail(webmail).apache2.
3.考慮到很多因素所以使用本地認証,PAM認証而不使用mysql認証。有興趣的朋友可以嘗試下mysql認証

安裝
sudo apt-get update
sudo apt-get install apache2,php5,postfix.courier-imap.courier-imap,squirrelmail. (這些都是源裏面有的東西。ubuntu就是這點好)

設置
去到postfix目錄
cd /etc/postfix
備份配置文件
sudo cp main.cf mail.cfbak
修改配置文件
sudo vi main.cf
(main.cf下可以配置的参数有 300多个,绝大多数参数都是不需要配置的,因为默认值就很好。而作为最初的配置,我们更是只挑选其中的极少数几个先来配置一下。编辑这个文件,只列出需要修改或添加的行)我按照我的要求來修改
主機名test.mailserver.com 域名test.mailserver.com

代码
message_size_limit = 204800000 //規定郵件最大尺寸
myhostname = localhost // 找到此行,将等号后面的部分改写为主机名
myhostname = test.mailserver.com  // 变为此状态,设置系统的主机名
myorigin = /etc/mailname //修改/etc/mailname補全成为E-mail地址“@”后面的部分,不過我沒有設置,因為我的主機名就是這個了
inet_interfaces = all  // 接受来自所有网络的请求
mydestination = localhost, localhost.localdomain, , localhost  // 找到此行,将行首的#去掉
mydestination = test.mailserver.com, localhost.localdomain, , localhost // 发给本地邮件的域名test.mailserver.com
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128  // 找到此行,依照自己的内网情况修改。我假定你的本地网络是 192.168.1.0/24 并且将你的本地网络加入到{{{mynetworks}}}。
完成後它看起来应该像这样:
mynetworks = 127.0.0.0/8, 192.168.1.0/24
home_mailbox = Maildir/ //Maildir 是一个邮件池的格式,这种邮件格式不需要文件锁定来保证消息的完整性,因为邮件以一个特有的名字被保存在一个个单独的文件中。一个Maildir是一个包含3个叫做tmp, new和curd的子目录的目录(常常以Maildir命名)。这些子目录应该在同一个文件系统中。
另一个使用Maildir格式的邮箱的理由是Courier IMAP/POP3服务器只支持Maildir格式的邮箱。
在' mailbox_command = procmail -a "$EXTENSION" '那一行前面加上一个"#"将其注释掉。 如果沒有就不用去管了
好了postfix就改到這裏了,如果你們有別的需求要不去網上找,要不就man postfix
重啟下postfix
sudo /etc/init.d/postfix restart

測速postfix能否使用
telnet test.mailserver.com 25
Trying 127.0.1.1...
Connected totest.mailserver.com
Escape character is '^]'.
220 test.mailserver.com ESMTP Postfix (Ubuntu)

修改pam認証
因為使用pam認証,而且要求建立賬號時,自動建立用戶home目錄
cd /etc/pam.d
sudo cp common-session common-sessionbak
sudo vi common-session
看看是否有這句,沒有添加
session required pam_mkhomedir.so umask=0022 skel=/etc/skel
去到skel
cd /etc/skel
看看是否有一下文件,沒有手工添加
ls skel
Examples Maildir
ls skel/Maildir
cur new tmp

配置courier pop/imap
courier-imap我裝上去就哪裏都沒有改就可以了

測試
好了現在建立一個賬號測試一下 賬號TEST
sudo adduser test

Adding user `test'...
Adding new group `test' (1001).
Adding new user `test' (1001) with group `test'.
The home directory `/home/test' already exists. Not copying from `/etc/skel'
adduser: Warning: that home directory does not belong to the user you are currently creating
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for test
Enter the new value, or press ENTER for the default
Full Name []: test
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [y/N] y
ok賬號建立了,去看看/home/test下是否有Maildir這個文件
在看看Maildir下是否有courierimapkeywords courierimapsubscribed courierimapuiddb cur new tmp 這些文件
測試一下IMAP
注意pop端口是110 imap是143
因為我用squirrelmail做webmail squirrelmail默認是支持imap的,網頁郵件還是用imap好,郵件放服務器比較安全
telnet test.mailserver.com 143
應該有如下顯示
Trying 127.0.1.1...
Connected to test.mailserver.com.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL ACL2=UNION] Courier-IMAP ready. Copyright 1998-2004 Double Precision, Inc. See COPYING for distribution information.
在提示符下輸入
a login test test (注意第一個test是用戶ID 第二個是密碼,因為我密碼和ID一樣)
a OK LOGIN Ok.
a logout
不錯,可以使用了
這裏可以參考http://wiki.ubuntu.org.cn/index.php?title=PostfixBasicSetupHowto&variant=zh-cn
裏面詳細說明了pop3 和imap

設置squirrelmail
運行squirrelmail的配置程序
sudo squirrelmail-configure
當然也可以/usr/share/squirrelmail/config/conf.pl
SquirrelMail Configuration : Read: config.php (1.4.0)
---------------------------------------------------------
Main Menu --
1. Organization Preferences
2. Server Settings
3. Folder Defaults
4. General Options
5. Themes
6. Address Books
7. Message of the Day (MOTD)
8. Plugins
9. Database
10. Languages

D. Set pre-defined settings for specific IMAP servers

C Turn color on
S Save data
Q Quit

Command >>
輸入D--> 輸入courier 按R返回
在輸入1 因為我在WEBMAIL界面上顯示郵件地址為mailserver,com
SquirrelMail Configuration : Read: config.php (1.4.0)
---------------------------------------------------------
Organization Preferences
1. Organization Name : mailserver.com
2. Organization Logo : ../images/sm_logo.png
3. Org. Logo Width/Height : (308/111)
4. Organization Title : 按照你的需求輸入
5. Signout Page :
6. Top Frame : _top
7. Provider link : 按照你的需求輸入
8. Provider name : 按照你的需求輸入

R Return to Main Menu
C Turn color on
S Save data
Q Quit

Command >>
輸入完成按R退回到主界面
選擇2
1. Domain :test.mailserver.com 輸入你的域名
2. Invert Time : false
3. Sendmail or SMTP : SMTP 選擇SMTP

A. Update IMAP Settings : localhost:143 (courier)
B. Update SMTP Settings : localhost:25

R Return to Main Menu
C Turn color on
S Save data
Q Quit

輸入後在退回主界面,8 選項是啟用插件。想啟用那個插件輸入插件前面的數字代碼即可

选择主菜单项10。即在命令提示符后输入数字“10”,进入语言设置子菜单,如图9-41所示。这里可将缺省语言(子菜单项1)改为“zh_CN”(中文),将缺省字符集(子菜单项2)改为“gb2312”
Language preferences
1. Default Language : zh_CN
2. Default Charset : utf8 我用UTF8大家可以使用 GB2312
3. Enable lossy encoding : false

R Return to Main Menu
C Turn color on
S Save data
Q Quit
按S保存 Q退出
这里要提一下squirrelmail汉化:
小松鼠邮件系统汉化
小松鼠本身支持很多语言,可下载相应的语言包。可到其主页去下载
www.squirrelmail.org
创建SquirrelMail别名
vi /etc/httpd/conf.d/squirrelmail.conf添加
alias /wemail /usr/share/squirrelmail
建立鏈接到/var/www
ln -s /usr/share/squirrelmail/ /var/www/webmail
在apache2中指定用戶訪問位置
sudo vi /etc/apache2/sites-enabled

ServerAdmin webmaster@localhost
ServerName webmail.mailserver.com
DocumentRoot /var/www/webmail
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
在你的DNS服務器中添加一條到test.mailserver.com的記錄
然後在你的電腦上輸入webmail.mailserver.com
就可以看到webmail 界面了
基本功能實現了輸入建立的賬號和密碼進去看看吧




可是對于我來說任務遠沒有完成
1.我服務器的域名和主機名稱是test.mailserver.com
要求用戶發送郵件到對方,對方顯示收件人地址欄地址為ID@mailserver.mail
我搜索了squirrelmail的運行機制,在squirrelmail提交用戶郵件地址給postfix的時候,下手改掉地址(可能大家有更好的辦法,歡迎提供)
cd /usr/share/squirrelmail/class/deliver/
修改Deliver.class.php 文件,修改之前記得備份
sudo cp Deliver.class.php Deliver.class.phpbak
sudio vi Deliver.class.php
找到
$header[] = 'From: '. $rfc822_header->getAddr_s('from',",$rn ",true) . $rn;
修改為
$header[] = 'From: '.str_replace('test.mail','mail', $rfc822_header->getAddr_s('from',",$rn ",true) ). $rn;
因為我已經有了一個郵件別名系統
我只要在系統上設置給ID@mailserver.com的郵件到ID@test.mailserver.com即可
2.修改密碼
因為是用PAM認証
去squirrelmail官網去下載相應的插件。我下了支持PAM修改密碼的插件change_pass-2.7a-1.4.x.tar.gz 還有兼容插件compatibility-2.0.11-1.0.tar.gz
解壓縮到并復制到squirrelmail目錄
sudo tar -zxf change_pass-2.7a-1.4.x.tar.gz
sudo tar -zxf compatibility-2.0.11-1.0.tar.gz
sudo cp -r change_pass /usr/share/squirrelmail/plugins
sudo cp -r compatibility /usr/share/squirrelmail/plugins
查看change_pass的安裝說明文件INSTALL
要求安裝poppass這個插件
正好源裏面有
sudo apt-get install poppassd
poppassd要求開通106端口 106是很老的一些程序需求的INTERNET服務
UBUNTU默認是沒有打開這個端口的,需要安裝netkit-inetd
sudo apt-get install netkit-inetd
測試看是否OK
$ telnet localhost 106
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
200 poppassd v1.8.1 hello, who are you?
user <username>
200 Your password please.
pass <oldpassword>
200 Your new password please.
newpass <newpassword>
200 Password changed, thank-you.
quit
200 Bye.
Connection closed by foreign host.

啟用這個插件
sudo squirrelmail-configure
選擇8
找到compatibility。change_pass插件的數字代碼,輸入保存即可
現在登錄WEBMAIL 到選項裏面修改密碼看是否成功。

3.設置自動回復
去squirrelmail下載插件要選擇你對應認証方式的插件哦
我選擇的是支持PAM的
local_autorespond_forward-3.0-1.4.0.tar.gz
解壓,復制
sudo tar -zxf local_autorespond_forward-3.0-1.4.0.tar.gz
sudo cp -r local_autorespond_forward /usr/share/squirrelmail/plugin
查看安裝文件INSTALL 要求編譯這個文件
Go to the suid_binary directory and configure, compile and
install the suid backend. In many cases, you do not need
to manually specify any configuration options (except
possibly "--enable-auth=pam" and "--enable-webuser=USER"
(the latter only if your web server runs as some user
OTHER than "apache")), otherwise, please consult the README
file for a complete list of the available configuration
options.

$ cd local_autorespond_forward/vacation_binary
$ ./configure
$ make
$ su
# make install

If you do need to specify any configuration options, they
must be placed after the "./configure" command above.

Please note that it is important that you execute "make
install" as the root user.

4) Go back to the main local_autorespond_forward directory

$ cd ..

5) Copy config.sample.php to config.php, edit it and change
any settings as desired.

$ cp config.sample.php config.php
$ vi config.php

在看README文件
提示 編譯時要求加上apapche2執行用戶。(這裏大家可以根據自己的需求按照README的提示運作)
那麽我們可以查看apache2是那個用戶在執行
cat /etc/apache2/apache2.conf
找到User www-data
Group www-data
大家可以根據自己的修改

按照提示要求去到suid_backend目錄
cd suid_backend
sudo ./configure --enable-webuser[www-data] (這裏大家可以根據自己的需求按照README的提示添加參數)
編譯完成之後按照要求把local_autorespond_forward目錄下的config.sample.php文件改名為config.php
cd /usr/share/squirrelmail/plugins/local_autorespond_forward
sudo cp config.sample.php config.php
在運行
sudo squirrelmail-configure
選擇并啟用這個插件。
OK自動回復功能已經實現,發封郵件測試以下吧。

因為給用戶建立的初始密碼為password
設置第一次登錄提示更改密碼!
我直接修改的配置文件,不知道大家是否有更好的辦法
cd /usr/share/squirrelmail/plugins/chang_pass/
sudo cp options.php options.phpbak
sudo vi options.php
找到這一段
sqgetGlobalVar('plugin_change_pass', $plugin_change_pass, SQ_POST);

$messages = array();
if (isset($plugin_change_pass)) {
sqgetGlobalVar('cp_oldpass', $cp_oldpass, SQ_POST);
sqgetGlobalVar('cp_newpass', $cp_newpass, SQ_POST);
sqgetGlobalVar('cp_verify', $cp_verify, SQ_POST);
bindtextdomain('change_pass', SM_PATH . 'plugins/change_pass/locale');
textdomain('change_pass');
$messages = change_pass_check();
bindtextdomain('squirrelmail', SM_PATH . 'locale');
textdomain('squirrelmail');
}
修改為
sqgetGlobalVar('plugin_change_pass', $plugin_change_pass, SQ_POST);
sqgetGlobalVar('mid',$mid);
$messages = array();
if (isset($plugin_change_pass)) {
sqgetGlobalVar('cp_oldpass', $cp_oldpass, SQ_POST);
sqgetGlobalVar('cp_newpass', $cp_newpass, SQ_POST);
sqgetGlobalVar('cp_verify', $cp_verify, SQ_POST);
bindtextdomain('change_pass', SM_PATH . 'plugins/change_pass/locale');
textdomain('change_pass');
$messages = change_pass_check();
if ((!isset($_SESSION['secretkey'])) and ($mid==1))
{
Header('Location: /webmail/src/right_main.php?PG_SHOWALL=0&sort=0&startMessage=1&mailbox=INBOX');
}
bindtextdomain('squirrelmail', SM_PATH . 'locale');
textdomain('squirrelmail');
}
找到
bindtextdomain('change_pass', SM_PATH . 'plugins/change_pass/locale');
textdomain('change_pass');
?>
<table width="100%" cellpadding="2" cellspacing="2" border="0">
<tr><td bgcolor="<?php echo $color[0] ?>">
<center><b><?php echo _("Change Password") ?></b></center>
</td></tr>
<tr><td>
<?php
if (count($messages)) {
foreach ($messages as $line) {
echo htmlspecialchars($line) . "<br>\n";
}
echo "</td></tr>\n";
echo "<tr><td>\n";
}bindtextdomain('change_pass', SM_PATH . 'plugins/change_pass/locale');
textdomain('change_pass');
?>
<table width="100%" cellpadding="2" cellspacing="2" border="0">
<tr><td bgcolor="<?php echo $color[0] ?>">
<center><b><?php
if ($mid == 1 )
{
echo "You have to change your password !!!";
}
else
echo _("Change Password");
?></b></center>
</td></tr>
<tr><td>

修改為



保存退出
cd /usr/share/squirrelmail/src
sudo cp webmail.php webmail.phpbak
sudo vi webmail.php
找到這段
if (empty($right_frame) || (strpos(urldecode($right_frame), '//') !== false)) {
$right_frame = '';

在它之前加上
if ($_SESSION['secretkey'] == 'password') {
$right_frame='/plugins/change_pass/options.php?mid=1';
保存

OK!現在 登錄webmail測試一下吧!
上次由 xiehuoli 在 2008-06-14 9:48,总共编辑 5 次。
年轻没有失败! ! ! ! ! !
噢!有怪兽,有怪兽!
头像
xiehuoli
帖子: 5941
注册时间: 2006-06-10 8:43
来自: 中国 CS

#2

帖子 xiehuoli » 2008-05-27 21:58

squirrelmail附件大小的设置方法
今天终于把squirrelmail的附件大小限制搞定了。主要方法是:修改php.ini
cd /etc/php5/apache2/
vi /php.ini
max_execution_time=30 ;//改为600(增加处理脚本的时间限制)
max_input_time=600 ;//最大输出时间600s
memory_limit=8M ;//改为100M(这样才能发送100M以下的附件)
register_global=on ;//个人认为没必要打开
post_max_size=2M ;//php可接收的post的大小
file_uploads=on ;//允许上传文件
upload_max_filesize=2M ;//改为100M
session_auto_start=1 ;//seession自动启动(我没改)
参考技术信息:
修改SquirrelMail 附件的大小到10M
如果您要修改SquirrelMail 附件的大小,需要直接修改 /etc/php5/apache2/php.ini 文件:
memory_limit = 40M ; //改为40M (这样才能发10M的附件)
post_max_size = 10M ; //php可接受的 post 方法大小 10M
upload_max_filesize = 10M ; //最大上载文件10M
如果使用Postfix 作为后台邮件服务器,还需要修改main.cf
message_size_limit = 14336000 (附件大小,14M,实际为10M的文件)
mailbox_limit = 102400000 (邮箱空间100M)
create_maildirsize = yes
mailbox_extended = yes
.解决小松鼠邮件内容长的时候,不能自动换行!
参考:http://www.taoran.net/tech/squirrelmail.html
使用技巧一:让长的邮件内容自动换行
用SquirrelMail显示长的邮件内容时有一个缺陷,就是不会自动换行。查看源文件后,发现
问题有两点:一是在显示邮件内容时使用的是“pre”标识,二是表格TD都是不定长的。
要让长的邮件内容能自动换行,需要做如下改动:
方法:
vi /usr/share/squirrelmail/functions/mime.php
找到下面的内容:
$body = '<pre>' . implode("\n", $body_ary) . '</pre>';
修改为:
$body = implode("<BR>\n",$body_ary);
vi /usr/share/squirrelmail/src/read_body.php
找到下面的内容:(对于新版本来说的)
html_tag( 'td', '<br>'. $messagebody."\n", 'left')
修改为:
html_tag( 'td', '<br>'. $messagebody."\n", 'left','','width=580')
如果是老版本:
老版本:
找到" <TR><TD BGCOLOR=\"$color[4]\" WIDTH=\"100%\">\n"
修改为" <TR><TD BGCOLOR=\"$color[4]\" WIDTH=\"580\">\n"
年轻没有失败! ! ! ! ! !
噢!有怪兽,有怪兽!
头像
xiehuoli
帖子: 5941
注册时间: 2006-06-10 8:43
来自: 中国 CS

#3

帖子 xiehuoli » 2008-05-27 21:59

让长的邮件内容自动换行
用SquirrelMail显示长的邮件内容时有一个缺陷,就是不会自动换行。查看源文件后,发现
问题有两点:一是在显示邮件内容时使用的是“div”标识,二是表格TD都是不定长的。
要让长的邮件内容能自动换行,需要做如下改动:
1、不再使用“div”标识显示邮件内容:
cd /usr/share/squirrelmail/functions
sudo vi mime.php
-- $body = '<div>' . implode("\n", $body_ary) . '</div>';
++ $body = implode("<BR>\n",$body_ary);

2、找到显示“$messagebody”的TD语句,将TD改成定长:
sudo vi /etc/share/squirrelmail/src/read_body.php
老版本:
-- " <TR><TD BGCOLOR=\"$color[4]\" WIDTH=\"100%\">\n"
++ " <TR><TD BGCOLOR=\"$color[4]\" WIDTH=\"580\">\n"
新版本:
-- html_tag( 'td', '<br>'. $messagebody."\n", 'left')
++ html_tag( 'td', '<br>'. $messagebody."\n", 'left','','width=580')
年轻没有失败! ! ! ! ! !
噢!有怪兽,有怪兽!
头像
xiehuoli
帖子: 5941
注册时间: 2006-06-10 8:43
来自: 中国 CS

#4

帖子 xiehuoli » 2008-05-27 22:00

本附录按照字母顺序,列出可在main.cf配置文件里设定的参数,并简略说明各参数的意义或用途。本附录的用意在于提醒读者各个postfix参数的作用,而非完整说明它们,因为最权威、最完整的信息--postfix包随附的在线说明与配置文件样本,已经在你手上了。因此,本附录只能算是 postfix参数的“速查参考”。
对于每一个参数,我们都会列出其可能值或是设定值的类型,大部分类型的设定值都没有异议,只有一些类型的值需要解释:
逐项列出
参数需要一个或多个可能值。至于某特定参数可能需要哪些值,请参阅在线说明。
查询表
当参数指向查询表时,必须指出表的类型与名称,两者之间以一个冒号隔开,例如:
transport_map = hash:/etc/postfix/transport
路径名称
一个文件的完整路径。
格式样板
某些参数的设定值,是由包含宏的字符串所组成,例如:
smtpd_banner = $myhostname ESMTP $mail_name
宏(此例中的$myhostname与¥mail_name)是在运行时才展开的对应的参数值。至于哪些参数的样板可接受哪些宏,请参阅在线说明文件。
计时单位
postfix有许多涉及时间的参数,例如:
queue_run_delay = 1000s
为了方便描述时间,postfix拟定了一组通用的计时单位简写,如果没注明计时单位,每个时间参数都有自己默认的计时单位。至于特定时间参数的默认计时单位是什么,请参阅在线说明。
单位 简写
秒 s
分 m
时 h
日 d
周 w
所有参数都有一个默认值(虽然某些默认值得空白)。只有实际设定值不同于默认值得参数时,才需要被列在main.cf中。本篇附录虽然列出了参数得默认值,但是不保证新版本得postfix一定不会改变默认值。使用postconf命令得-d选项,可以查出特定参数得默认值。
postconf -d alias_maps

postfix参数速查参考

2bounce_noice_recipient
可能值:邮件地址 默认值:postmaster
“2bounce”是多钟可能得错误类型之一。每一类型错误,都可由你决定是否要发出通知函。2bounce_notice_recipient指定“2bounce”错误类型得通知对象。
范例: 2bounce_notice_recipient = postmaster

access_map_reject_code
可能值:响应码 默认值:554
postfix因为访问表条件限制而拒收邮件时,返回给客户端得smtp响应码。
范例: access_map_reject_code = 554

alias_maps
可能值:别名表 默认值:hash:/etc/aliases, nis:mail.aliases
列出local mda所使用得别名数据库
范例: alias_maps = hash:/etc/aliases, nis:mail.aliases

allow_mail_to_files
可能值:逐项列出 默认值: alias,forward
当local mda在展开别名文件时,禁止或容许local mda将邮件投递到外部文件。
范例: allow_mail_to_files = alias, forward

allow_percent_hack
可能值:yes或no 默认值:yes
在dns 尚未普及之前,寄信方可用特殊格式得收件地址来影响邮递路径,这种技术称为percent hack或sender specific routing。现在,dns与邮递路径得选项已经很可靠了,但是postfix仍然持续支持这项技术。若想要关掉这项功能,可将此参数设定为no。
范例: allow_percent_hack = no

alternate_config_directores
可能值:目录 默认值:无
此参数要求postqueue和postdrop命令从指定得目录读取postfix配置文件。你打算使用得每一个非标准目录,都必须列在此参数中。
范例: alternate_config_directories = /usr/local/postfix/conf

append_at_myorigin
可能值:yes或no 默认值:yes
是否以myorgin得值补齐只含人名部分得不完整邮件地址。比方说,将user改成user@host.example.com
范例: append_at_myorigin = yes

authorized_verp_clients
可能值:主机名称或网域名称 默认值:$mynetworks
verp是供mlm用来处理退信得功能。此功能以一个特殊得分隔字符,将“列表拥有者地址”与“原收件人地址“结合在一起。authorized_verp_clients列出可使用此功能得网域名称或客户端得ip地址。
范例: authorized_verp_clients = $mynetworks

berkeley_db_read_buffer_size
可能值:字节 默认值:131072
读取berkeley db或btree查询表时,所用得缓冲区数量。
范例: berkeley_db_read_buffer_size = 131072

biff
可能值:yes或no 默认值:yes
biff是一个能在收到新邮件时,发出通知给本地用户得小程序。如果你得用户不会登录邮件系统,建议你关掉biff通知,因为这有助于提升邮件系统得效率。
范例: biff = no

body_checks_size_limit
可能值:字节 默认值:51200
限制body_checks得检查范围。注意,不是大小超过此数值得邮件就完全不检查,而是不检查超过此数值范围得部分。因此,如果有一封邮件得正文大小是100kb,则只有前半部会被检查。
范例: body_checks_size_limit = 51200

bounce_service_name
可能值:master.cf定义得服务名称之一 默认值:bounce
无法寄出邮件时,master daemon将状态信息填入日志文件得服务得名称。通常没必要修改此参数。
范例: bounce service name = bounce

canonical_maps
可能值:各类型得查询表 默认值:无
指出规范映射表得类型与位置。规范映射表定义“内部地址格式”与“规范地址格式”得对应关系,postfix依据规范映射表,决定如何改写寄件人得邮件地址。
范例: canonical_maps = hash:/etc/postfix/canonical_maps

command_directory
可能值:目录 默认值:/usr/sbin
postfix得命令行管理工具(postcat、postqueue等)得存放目录。
范例: command_directory = /usr/sbin

command_time_limit
可能值:计时单位 默认值:1000s
当local mda将邮件交给外部命令后,postfix可容许外部命令有多长得运行时间。
范例: command_time_limit = 1000s

content_filter
可能值:传输服务 默认值:无
将邮件传给内容过滤器得传输服务。postfix只负责将邮件传给指定得传输服务,该传输服务要负责将邮件传给内容过滤器。内容过滤器可以将邮件传给其他过滤器,或是交回给postfix系统。
范例: content_filter = myfilter

daemon_timeout
可能值:计时单位 默认值:18000s
postfix daemons处理一次服务得限制时间。如果处理时间超过限制,这些daemon会自动结束。
范例: daemon_timeout = 18000s

debug_peer_list
可能值:主机名称或网域名称 默认值:无
当postfix与特定得主机交互时,可特别提升日志记录得详细程度,以提供足够得调试信息。debug_per_list可列出一个或多个你想要检查得主机、网域或正则表达式。信息详细程度得提升定义在debug_peer_level参数中。
范例:debug_peer_list = example.com, mail.ora.com

default_destination_concurrency_limit
可能值:纯数值 默认值:20
传输服务(定义于master.cf)对于同一目的地同时投递量得上限。如果没明确规定上限,则以 default_destination_concurrency_limit为默认值。请注意,此参数得限制对象是“目的地”,而非“传输服务”本身。决定各个传输服务同时投递量得上限得参数是default_transport_concurrency_limit。
范例: default_destination_concurrency_limit = 20

default_extra_recipient_limit
可能值:纯数值 默认值:1000
当queue manager以优先度较高得传输服务排挤优先度较低得mda时,该传输服务可处理得收件人上限。
范例: default_extra_recipient_limit = 1000

default_process_limit
可能值:纯数值 默认值:100
任何传输服务可同时启动得进程上限。如果你不要刻意限制各个传输服务得进程数,则以default_process_limit参数得值为限制。请注意,此参数得限制对象是各个“传输服务”,如果要针对个别“目的地”做限制,应该使用default_destination_limit参数。
范例: default_process_limit = 100

default_recipient_limit
可能值:纯数值 默认值:10000
限制queue manager为各个传输服务保留在内存里得收件人数量。
范例: default_recipient_limit = 10000

default_verp_delimiters
可能值:字符 默认值:+=
verp是供mlm用来处理退信的技术。此技术以一个特殊的分隔字符,将“列表拥有者地址“与”原收件人地址“结合在一起。default_verp_delimiters参数决定哪些字符可供verp用来构造要被传回的地址。
范例: default_verp_delimiters = +=

defer_service_name
可能值:master.cf定义的服务名称之一 默认值:defer
暂时无法寄出邮件时,master daemon用来交付状态信息并维护日志文件的服务。你通常不需要改变此参数。
范例: defer_service_name = defer

delay_notice_recipient
可能值:邮件地址 默认值:postmaster
”delay“是多种可能的错误类型之一。每一类型错误,都可由你决定是否要发出通知函。此参数决定”delay“错误类型的通知对象。
范例: delay_notico_recipient = postmaster

deliver_lock_attempts
可能值:纯数值 默认值:20
当postfix执行投递操作时,最多刻意尝试几次取得邮箱文件的独占锁定。
范例: deliver_lock_attempts = 20

disable_dns_lookups
可能值:yes或no 默认值:no
当postfix决定邮件的递送目的地时,通常先查询收信网域的dns mx记录。如果disable_dns_lookups成立,则postfix不查询mx记录而直接将邮件递送到收信网域的a记录所指的ip地址。
范例: disable_dns_lookups = no

disable_mime_output_conversion
可能值:yes或no 默认值:no
当远程系统没有声明支持8-bit mime时,postfix会自动将8-bit mime格式转换成7-bit格式。将disable_mime_output_conversion设定成yes,将取消这项转换。
范例:disable_mime_output_conversion = no

disable_vrfy_command
可能值:yes或no 默认值:no
通常postfix容许客户端使用smtp vrfy命令。将disable_vrfy_command设定成yes,可避免外界使用very命令来探测收件地址的有效性(垃圾邮件发送者常用这种技巧来收集邮件地址)。
范例: disable_vrfy_command = no

double_bounce_sender
可能值:邮件地址 默认值:double-bounce
无法将退信通知函寄达原寄件人时,系统就会产生“双退信通知”,并将此通知寄到double_bounce_sender参数指定的地址。该指定地址不应该作任何其他用途,因为寄到该地址的邮件,一律会被偷偷丢弃。
范例:double_bounce_sender = double-bounce

empty_address_recipient
可能值:邮件地址 默认值:mailer-daemon
无法递送出含有空寄件人地址的邮件时,退信通知函的收件地址。例如,发送退信通知函时(这类邮件的寄件人地址是空的),如果无法寄达,则将该通知函该寄到empty_address_recipient所指定的地址。
范例:empty_address_recipient = mailer-daemon

error_service_name
可能值:master.cf定义的服务名称之一 默认值:error
无法递送邮件时,master daemon用来产生错误报告的服务。通常你不需要改变此参数。
范例:eror_service_name = error

export_environment
可能值:环境变量 默认值:tz mail_config
要被导出到外部进程(比方说,启动pipe服务或外部命令时)的所有环境变量。
范例:export_environment = tz, mail_config

fallback_relay
可能值:主机名称或网域名称 默认值:无
如果找不到或无法到达正常的目的地,则将邮件移交给此参数列出的ip地址、主机或网域。
范例: fallback_relay = example.com

fast_flush_domains
可能值:主机名称或网域名称 默认值:$relay_domains
速清服务(fast flush)让queue manager可以应管理员要求,立刻尝试送出特定网域的累积邮件。fast_flush_domains参数列出适合速清服务的ip地址、主机以及网域。
范例:fast_flush_domains = $relay_domains

fast_flush_refresh_time
可能值:计时单位 默认值:12h
速清服务让queue manager可以应管理员要求,立刻尝试送出特定网域的累积邮件。fast_flush_refresh_time参数定义自动速清操作之间的间隔时间。
范例: fast flush refresh time = 12h

fork_attempts
可能值:纯数值 默认值:5
postfix要fork出一个新进程时,最多可以尝试几次。
范例:fork_attempss = 5

forward_expansion_filter
可能值:字符
设定路径名称给forward_path参数,可以使用$user这种由postfix展开的宏,它随状态决定当时邮件的投递路径。forward_expansion_filter参数列出展开宏时所容许的字符。不容许的字符,会被替换成下划线字符(_)。

hash_queue_depth
可能值:纯数值 默认值:1
为了组织队列文件,postfix为每一个队列都建了一个子目录结构。hash_queue_depth参数代表子目录结构在队列目录下的层数。
范例:hash_queue_depth = 1

header_address_token_limit
可能值:纯数值 默认值:10240
限制标题里的地址最多有多少个记号(tokens)可被postfix改写。超过的记号一律予以丢弃。注意:依据rfc 2822的定义,单词、@与。符合,都是记号。
范例: header_address_token_limit = 10240

header_size_limit
可能值:字节 默认值:102400
限制邮件标题可包含的字符数量。超过的部分会被丢弃。
范例: header_size_limit = 102400

home_mailbox
可能值:路径名称 默认值:无
postfix通常是将邮件投递到邮箱目录下的邮箱文件。此参数可将邮箱文件的位置,改成用户主目录下的指定位置。home_mailbox的值,是以用户主目录为起点的相对路径,若在邮箱文件名称末端附加一个/符合,表示你想要使用maildir格式的邮箱。
范例:home_mailbox = mail/mbox

lgnore_mx_lookup_error
可能值:yes或no 默认值:no
当postfix向dns server查询mx记录却得不到响应时,它会隔一段时间之后再试一次,将ignore_mx_lookup_error设定成yes,将让postfix在第一次失败之后,立刻直接查询a记录
范例: ignore_mx_lookup_error = no

in_flow_delay
可能值:计时单位 默认值:1s
postfix每收下一封邮件之后,至少停顿多长时间之后才可以再接再厉接收新信。如果你的服务器遭遇严重的效率问题,或是外来邮件的量实在太大,你可以适当增加此参数的值,让服务器系统有多一点时间消化刚刚收下的邮件。
范例: in_flow_delay = 1s

initial_destination_concurrency
可能值:纯数值 默认值:5
对于同一目的地,初始的投递进程数量。
范例:initial_destination_concurrency =

lpc_ldle
可能值:计时单位 默认值:100s
内部通信渠道之间的闲置时间上限。一旦超过时限,postfix组件将主动切断渠道。
范例:ipc_idle = 100s

line_length_limit
可能值:纯数值 默认值:2048
邮件中任何文字行的长度上限。超过限制的文字行,其超出的部分,在递送时期会被放入下一行。
范例: line_length_limit = 2048

lmtp_connect_timeout
可能值:计时单位 默认值:0s
限制lmtp client完成一次tcp联机最长可以等待的时间。将此参数设定为0,表示取消逾时计算。
范例: lmtp_connect_timeout = 0

lmtp_data_lnit_timeout
可能值:计时单位 默认值:120s
限定lmtp client在送出lmtp data命令之后,lmtp server至少要在多少时间内响应。
范例: lmtp_data_init_timeout = 120s

lmtp_lhlo_timeout
可能值:计时单位 默认值:300s
限定lmtp client在送出lmtp lhlo命令之后,lmtp server至少要在多少时间内响应。
范例: lmtp_lhlo_timeout = 300s

lmtp_quit_timeout
可能值:计时单位 默认值:300s
限定lmtp client在送出lmtp quit命令之后,lmtp server至少要在多少时间内响应。
范例:lmtp_quit_timeout = 300s

lmtp_rset_timeout
可能值:计时单位 默认值:300s
限定lmtp client在送出lmtp rset命令之后,lmtp server至少要在多少时间内响应。
范例: lmtp_rset_timeout = 300s

lmtp_tcp_port
可能值:通信端口编号 默认值:24
当master.cf没有定义lmtp服务时,哪一个tcp port可供lmtp联机之用。
范例:lmtp_tcp_port = 24

local_destination_concurrency_limit
可能值:纯数值 默认值:2
设定同一个本地收件人最多可同时有几个投递进程。
范例: local_destination_concurrency_limit = 2

local_recipient_maps
可能值:查询表 默认值:proxy:unix:passwd.byname $alias_maps
含有所有本地邮件地址的查询表。smtp server借此拒收外界寄给不明用户的邮件。
范例: local_recipient_maps = proxy:unix:passwd.byname $alias_maps

luser_relay
可能值:邮件地址 默认值:无
外界寄给不明用户的邮件,全部转寄到luser_relay所指定的邮件地址(可能会收到大量垃圾邮件)。
范例: luser_relay = info

mail owner
可能值:系统账户名称 默认值:postfix
postfix以此参数指定的系统账户,作为队列文件的拥有者以及postfix daemon进程的运行身份。
范例:mail_owner = postfix

mail_spool_directory
可能值:目录 默认值:(随系统而异)
范例:mail_spool_directory = /var/mail/spool

mailbox_command
可能值:路径名称 默认值:无
用于将邮件投递到邮箱的外部命令,最常用的外部命令大概是procmail。
范例:mailbox_command = /usr/localbin/procmail

mailbox_delivery_lock
可能值:逐项列出 默认值:(随系统而异)
当postfix将邮件投递到文件时,所使用的锁定方法。
范例:mailbox_delivery_lock = fcntl, dotlock

mailbox_transport
可能值:传输服务 默认值:无
用于执行邮箱投递操作的传输服务。
范例:mailbox_transport = cyrus

manpage_directory
可能值:目录 默认值:(随系统而异)
postfix在线说明书(manpage)的存放目录
范例:manpage_directory = /usr/share/man

masqueraade_domains
可能值:网域名称 默认值:无
在邮件离开网关系统之前,将寄件人地址的内部主机名称部分替换成此参数所指定的网域名称。masquerde_domains参数可指定一系列用于地址伪装的网域名称。
范例:masquerade_domains = example.com

max_idle
可能值:计时单位 默认生:100s
除了queue manager之外的postfix服务器进程,等待新服务请求的闲置时间上限。
范例: max_idle = 100s

maximal_backoff_time
可能值:计时单位 默认值:4000s
在每次因故无法投递出邮件时,queue manager便会将下次递送的时间延后,延长后的间隔时间不得超过maximal_backoff_time。
范例:maximal_backoff_time = 4000s

message_size_limit
可能值:字节 默认值:10240000(10M Bytes)
限制单封邮件的最大长度。
范例:message_size_limit = 10240000

mime_header_checks
可能值:查询表(模式表) 默认值:$header_checks
列出用于比对外来邮件的每个mime标题字段的模式表。模式表的索引键,是描述mime标题字段特征的正则表达式,对应值是要对符合条件的邮件采取的处理动作。
范例:mime_header_checks = regexp:/etc/postfix/mime_header_checks

minimal_backoff_time
可能值:计时单位 默认值:1000s
每次因故无法递送出邮件时,queue manager便会延长下次的投递时间,延长后的间隔时间不得低于minimal_backoff_time。
范例:minimal_backoff_time = 1000s

mydomain
可能值:网域名称 默认值:(随系统而异)
邮件提供的网域名称。
范例:mydomain = example.com

mynetworks
可能值:网络地址 默认值:(随系统而异)
列出可通过本邮件系统寄出邮件的网络地址或ip地址。mynetworks或mynetworks_style两参数都可以用来界定转发服务的服务对象,但是mvnetworks的效力高于mynetworks_style。
范例:mynetworks = 192.168.15.32/26

myorigin
可能值:网域名称 默认值:$myhostname
要附加到只含人名部分的不完整邮件地址的网域名称。
范例:myorigin = $myhostname

newaliases_path
可能值:路径名称 默认值:(随系统而异)
用于重建别名数据库的newaliase程序的完整路径。(这是一个刻意为了保持对sendmail的兼容性而设计的程序。)
范例:newaliases_path = /usr/bin/newaliases

notity_classes
可能值: bounce,2bounce、deay,policy,protocol、resource、software的任何可能组合
默认值:resource,software
列出要触发发送通知的错误类型。通知对象的邮件地址,定义在各错误类型的class_notice_recipient参数中。
范例:notify_classes = resource, software

parent_domain_matches_subdomains
可能值:yes、no或任何使用查询表的参数名称 默认值:(参阅范例)
此参数决定查询表里的domain.tld格式的网域名称,是否能涵盖其下的所有子网域。如果设定为no,则只有。domain.tld格式的网域名称才算涵盖其下的所有子网域。
范例:parent_domain_matches_subdomains = debug_peer_list,
fast_flush_domains, mynetworks,
permit_mx_backup_networks,
qmqpd_authorized_clients, relay_domains,
smtpd_access_maps

pickup_service_name
可能值:master.cf定义的服务名称之一 默认值:pickup
供master daemon用于接取本地回复邮件的服务。通常不需要改变此参数。
范例:pickup_service_name = pickup

process_id_directory
可能值:目录 默认值:pid
master daemon用于存放其锁定文件(进程本身的pid文件)的目录。指定的路径是相对于postfix邮箱目录(由mail_spool_directory参数决定)之下。
范例:process_id_directory = pid

proxy_interfaces
可能值:ip地址 默认值:无
如果运行postfix server的机器是位于proxy或nat后台的内部网络上,而且是被当成网域的备用mx主机,那么当主mx系统离线时,它有可能遭遇邮件循环。 proxy_interfaces列出哪些网络接口会从proxy或nat网关收进邮件,让postfix能够避免邮件循环。
范例:proxy_interfaces = 192.168.15.23

qmgr_clog_warn_time
可能值:计时单位 默认值:300s
当特定目的地的邮件阻塞于活动队列时,至少每隔多长时间要发出一次警告。设定值0表示取消这项警告。
范例:qmgr_clog_warn_time = 300s

qmgr_message_active_limit
可能值:纯数值 默认值:20000
限定活动队列最大可容纳多少封邮件。
范例:qmgr_message_active_limit = 20000

qmgr_message_reclplent_minimum
可能值:纯数值 默认值:10
每封邮件至少有多少个收件地址可以被存储在内存里
范例:qmgr_message_recipient_minimun = 10

qmqpd_error_delay
可能值:计时单位 默认值:1s
qmqp服务为一组邮件主机提供一个共同的集中式邮件队列。qmqpd_error_delay定义qmqp server在送错误响应给客户端之前,可以停顿的时间。这项延迟是为了缓和行为错乱的客户端的混乱程度。
范例:qmqpd_error_delay = 1s

queue_directory
可能值:目录 默认值:/var/spool/postfix
postfix队列的主目录
范例: queue_directory = /var/spool/postfix

queue_run_delay
可能值:计时单位 默认值1000s
每隔多久扫描一次等待队列,重新投递等待邮件。
范例:queue_run_delay = 1000s

rbl_reply_maps
可能值:查询表 默认值:无
指出定义“rbl网域名称”与“rbl回复信息模板”对应关系的查询表。使用reject_rbl或reject_rhsbl来拒收垃圾邮件时, postfix依据本参数所指的查询表来解读rbl查询结果的意义。如果查询表里没列出postfix所使用的rbl网域,则使用 default_rbl_reply提供的样板来解读查询结果。
范例:rbl_reply_maps = hash:/etc/postfix/rbl_reply

recipient_canonical_maps
可能值:查询表 默认值:无
指出收件地址的正格表。操作流程与canonical_maps相似,只不过被改写的是收件人地址,而非寄件人地址。recipient_canonical_maps的优先程度高于canonical_maps。
范例:recipient_canonical_maps = hash:/etc/postfix/canonical

reject_code
可能值:响应码 默认值:554
基于客户端限制条件而拒收邮件时,返回给客户端的smtp响应码
范例: reject_code = 554

relay_domains_reject_code
可能值:响应码 默认值:554
因为客户端不符合使用转发服务的资格,而拒收传信要求时,postfix server所使用的smtp响应码。
范例:relay_domains_reject_code = 554

relay_transport
可能值:传输服务 默认值:relay
用于递送转发邮件的传输服务。
范例:relay_transport = relay

relocated_maps
可能值:查询表 默认值:无
定义已移出邮件地址或网域的新位置
范例:relocated_maps = hash:/etc/postfix/relocated

resolve_dequoted_address
可能值:yes或no 默认值:yes
决定postfix是否要处理人名部分含有“寄信方指定的邮递路径”的邮件地址。设定成yes时,postfix会严格遵守rfc 822的规定,标记含有特殊符号的人名部分。
范例:resolve_dequoted_address = yes

sample_directory
可能值:目录 默认值:/etc/postfix
存放postfix配置文件样本得目录。在这些样本文件里可以找到大部分postfix参数得说明与范例。
范例: sample_directory = /etc/postfix

sendmail_path
可能值:路径名称 默认值:(随系统而异)
postfix得sendmail兼容程序得完整路径。sendmail主要是提供脚本或命令行用来寄送邮件。
范例:sendmail_path = /usr/sbin/sendmail

setgid_group
可能值:组得名称或gid值 默认值:postdrop
供potfix用来提交邮件或管理队列得组标识符。你得系统应该设置一个专门给postfix使用的组。
范例:setgid_group = postdrop

showq_service_name
可能值:master.cf定义的服务名称之一 默认值:showq
用于回复postfix队列状态的服务。通常不需要改变此参数。
范例:showq_service_name = showq

smtp_bind_address
可能值:ip地址 默认值:无
当smtp client要联机到远程的邮件服务器时,应该使用的网络接口的ip地址。只有在multihomed系统上(安装多张网卡,而且分别连接不同的网络),才有必要设定此参数;对只有单一实际网络接口的系统,此参数是多余的。
范例:smtp_bind_address = 192.168.15.22

smtp_data_done_timeout
可能值:计时单位 默认值:600s
在smtp client送出“。”表示信息内容结束之后,最多可以等待smtp server在多长时间内的响应。
范例:smtp_data_done_timeout = 600s

smtp_data_xfer_timeout
可能值:计时单位 默认值:180s
smtp client在传送信息的过程中,可以容忍的等待时间。如果联机阻塞时间超过设定值,smtp client会主动切断联机。
smtp_data_xfer_timeout = 180s

smtp_destination_recipient_limit
可能值:纯数值 默认值:(参阅范例)
限制通过smtp client传出的每封邮件,最多可以有多少位收件人。
范例:smtp_destination_recipient_limit =
$default_destination_recipient_limit

smtp_helo_timeout
可能值:计时单位 默认值:300s
smtp client在送出smtp helo命令之后,等待服务器响应的限制时间。
范例:smtp_helo_timeout = 300s

smtp_mail_timeout
可能值:计时单位 默认值:300s
smtp client在送出smtp mail from命令之后,等待服务器响应的限制时间。
范例:smtp_mail_timeout = 300s

smtp_pix_workaround_delay_time
可能值:计时单位 默认值:10s
若smtp server是位于某些有瑕疵的老式cisco pix防火墙之后,当smtp client送出的“。”与“cr/lf”信息结束信号,是分别放在两个不同的封包时,这类防火墙可能会干扰smtp通信。postfix能自动侦测出此问题,并借由延迟送出“。”与“cr/lf”的时间,来避开这问题的发生。smtp_pix_workaround_delay_time参数指出 smtp client在传送完邮件内容之后,必须要等待多长时间(让socket的输出缓冲区可以清空)。然后才可送出“crlf”(如此可确保这三个字符会被编在同一个封包)。
范例:smtp_pix_workaround_delay_time = 10s

smtp_quit_timeout
可能值:计时单位 默认值:300s
smtp client在送出smtp quit命令之后,等待服务器响应的限制时间。
范例:smtp_quit_timeout = 300s

smtp_rcot_timeout
可能值:计时单位 默认值:300s
smtp client在送出smtp rcpt to命令之后。等待服务器响应的限制时间。
范例:smtp_rcpt_timeout = 300s

smtp_skip_5xx_greeting
可能值:yes或no 默认值:yes
当远程的smtp server返回5xx响应码,postfix可以直接退信给原寄件人或是试着将邮件寄到目标网域的其他mx主机(如果有的话) smtp_skip_5xx_greeting决定postfix应该采取何种行为。设定为no时,postfix会继续尝试寄信到另外的mx主机。
范例:smtp_skip_5xx_greting = yes

smtpd_banner
可能值:格式样板 默认值:(参阅范例)
跟在220状态码之后的smtp问候信息。如果你改变此参数,请遵守rfc的要求,以$myhostname为信息的开头。
范例:smtpd_banner = $myhostname ESMTP $mail_name

smtpd_data_restrictions
可能值:UBE限制条件组合 默认值:无
客户端送出smtp data时,所要检查的UBE限制条件组合。
范例:smtpd_data_restrictions = reject_unauth_pipelining

smtpd_error_sleep_time
可能值:计时单位 默认值:1s
当客户端引发错误时,postfix的初始等待时间。当错误次数超过smtpd_soft_error_limit的限制时,postfix在每次错误之后,都会延长一秒等待时间。
范例:smtpd_error_sleep_time = 1s

smptd_expansion_filter
可能值:字符 默认值:(参阅范例)
smtp server展开宏时,所容许的字符。

smtpd_helo_required
可能值:yes或no 默认值:no
决定postfix是否要求客户端必须先送出HELO/EHLO命令,才能开始正式smtp对话
范例: smtpd_helo_required = no

smtpd_history_flush_threshold
可能值:纯数值 默认值:100
限制smtp server命令历程暂存区可容纳的行数。超过此限制之后,旧命令历程将被清理掉。
范例:smtpd_history_flush_threshold = 100

smtpd_noop_commands
可能值:逐项列出 默认值:无
列出postfix应该接受、但是不动作的smtp命令。对于这些无动作命令,postfix总是响应“250ok”。
范例: smtpd_noop_commands = vrfy, expn

smtpd_recipient_limit
可能值:纯数值 默认值:1000
对于每封邮件,客户端最多可以在rcpt to命令指定多少个收件地址。如果超过此限,postfix将决绝rcpt to命令。
范例:smtpd_recipient_limit = 1000

smtpd_restriction_classes
可能值:自定义规范等级的名称 默认值:无
列出管理员自己定义的所有规范等级。每一组规范等级,都是由一系列UBE限制条件组成。
范例: smtpd_restriction_classes = myruleset_a, myruleset_b
myruleset_a = reject_invalid_hostname,
reject_unknown_sender_domain
myruleset_b = permit

smtpd_soft_error_limit
可能值:纯数值 默认值:10
客户端在发生多少次错误之后,postfix才开始执行再出现错误就延迟一秒的操作。
范例:smtpd_soft_error_limit = 10

soft_bounce
可能值:yes或no 默认值:no
设定成yes时,原本应该退信的动作,会改成将邮件放回队列,等待下次递送;此外,原本应该响应永久错误(5xx)的状况,一律改成以暂时性错误码(4xx)响应。当你想测试新配置的效果,却又担心发生误判时(比方说,拒收不应该拒绝的重要邮件),可利用此参数避免造成无法弥补的错误。
范例: soft_bounce = no

strict_7bit_headers
可能值:yes或no 默认值:no
决定postfix是否应该严格遵守RFC的规定,只接受标头全部都是7-bit ascii字符的邮件。在默认情况下,postfix接受标头里含有8-bit文字的邮件。
范例:strict_7bit_headers = no

strict_8bitmime_body
可能值:yes或no 默认值:no
决定postfix应该接受还是拒绝含有8-bits文字、但是却没有编码成适当的mime格式的邮件。
范例:strict_8bitmime_body = no

strict_rfc821_envelopes
可能值:yes或no 默认值:no
依照rfc821的规定,信封地址必须放在一对尖角括号内,而且不能含有多余信息。此参数决定postfix是否要求客户端严格遵守这项规定。
范例:strict_rfc821_envelopes = no

swap_bangpath
可能值:yes或no 默认值:yes
uucp使用”!“字符来指定邮件递送路径。swap_bangpath参数决定postfix是否应该将”!“换成”@“符号,使其成为适合在Internet上传递的邮件。
范例:swap_bangpath =yes

syslog_name
可能值:字符串 默认值:postfix
postfix在邮件日志文件里自称的进程名称。
范例:syslog_name = postfix

transport_retry_time
可能值:计时单位 默认值:60s
每隔多久时间,postfix重新尝试传递先前未能顺利送出的邮件。
范例:transport_retry_time = 60s

undisciosed_recipients_header
可能值:字符串 默认值:(参阅范例)
当标头里的to: resent-to: cc:等字段后全部都没有收件人地址时,应该放在这些字段之后的字符串。
范例:undisclosed_recipients_header = to:undisclosed-recipients:;

unknown_client_reject_code
可能值:响应码 默认值:450
由于reject_unknown_client限制条件而拒收客户端时,所使用的smtp响应码。
范例:unknown_clinet_reject_code = 450

unknown_local_reclplent_reject_code
可能值:响应码 默认值:550
当客户端试图寄信给不存在的本地网域用户时,postfix用于拒绝客户端的smtp响应码。
范例:unknown_local_recipient_reject_code = 550

unknown_virtual_alias_reject_code
可能值:响应码 默认值:550
当客户端试图寄信到postfix控制管理的虚拟别名网域,但是所指定的收件人不存在于该网域时,postfix使用此参数指定的smtp响应码来拒绝客户端。
范例:unknown_virtual_alias_reject_code = 550

verp_delimiter_filter
可能值:字符 默认值:-=+
verp是供mlm处理退信的技术。此技术以一个特殊的分隔符,将“列表拥有者地址”与“原收件人地址”结合在一起。verp_delimiter_filter参数列出可当成分隔符的合法字符。
范例:verp_delimiter_filter = -=+

virtual_alias_maps
可能值:查询表 默认值:无
此参数指向含有“虚拟别名地址”与“实际收件地址”对应关系的查询表。
范例:virtual_alias_maps = hash:/etc/postfix/virtual_alias

virtual_mailbox_base
可能值:目录 默认值:无
虚拟邮箱文件的相对路径起点。所有虚拟邮箱文件都是放在此目录之下。
范例:virtual_mailbox_base = /usr/local/virtual_mail

virtual_mailbox_limit
可能值:字节 默认值:51200000
虚拟邮箱文件的容量上限。对于maildir格式的邮箱而言,此参数只能限制每个文件的大小,而非整体邮箱的大小。此参数值不得低于message_size_limit
范例:virtual_mailbox_limit = 51200000

virtual_mailbox_maps
可能值:查询表 默认值:无
此参数指向含有“虚拟邮箱地址”与“邮箱文件”对应关系的查询表。邮箱文件的路径,以virtual_mailbox_base所指的路径为起点。
范例:virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox

virtual_transport
可能值:传输服务 默认值:virtual
用于投递邮件到虚拟邮箱地址的默认传输服务。
范例:virtual_transport = virtual
年轻没有失败! ! ! ! ! !
噢!有怪兽,有怪兽!
头像
xiehuoli
帖子: 5941
注册时间: 2006-06-10 8:43
来自: 中国 CS

#5

帖子 xiehuoli » 2008-05-27 22:01

postfix sasl身份验证

基本的smtp协议没有验证用户身份的能力。虽然信封上的寄件人地址已经隐含了发信者的身份,然而,由于信封地址实在太容易假造,所以不能当成身份凭据。为了判断客户端是否有权使用转发服务(relay),服务器端必须确认客户端(寄件人)是否当真是对方所自称的那个人。在不能以寄件人地址为身份证书的前提下,smtp势必需要其他补充机制,才能验证客户端的身份。
从postfix的角度看,它需要扮演两种角色:当它身为smtp server时,需要能够验证用户个人的身份(让他们能使用smtp server寄出邮件);当它身为smtp client时,它需要能够提供出自己的身份证书给其他mta检验(以便通过远程mta将邮件递送到最终目的地)。因此,我们也会解释如何设定 postfix,使其能通过其他mta的身份验证。
大多数邮件系统只容许内部网络上的客户端使用转发服务,换言之,ip地址成了客户端身份的识别凭据。然而,并非所有合法用户都具有固定ip地址。比方说,带着笔记本电脑出差远方的同事,他们可能使用领近isp或饭店旅馆提供的临时性ip地址;或者,有些在家工作的用户,他们位于办公室之外的网络,但是需要透过办公室里的邮件系统来寄信。不管你是否能够事先知道用户的ip地址,sasl都能提供可靠的身份验证。
RFC 2554 “smtp service extension for authentication”制定了如何在基本smtp协议上增加验证功能的机制,此机制使得smtp能使用sasl协议来验证客户端身份。我们将示范如何使用carnegie mellon大学开发的cyrus sasl函数库来扩充postfix,使其具备sasl验证能力。
由于cyrus sasl以“函数库”的形式存在,要让你的postfix支持sasl,你必须在编译postfix时就将cyrus sasl函数库链接进去,此外,远程用户也必须设定他们的mua,使其在通过你的邮件系统转发邮件时,能送出正确的标识信息。

sasl概论

有许多客户机/服务器协议没有验证能力,sasl就是用于加强或增加这类协议的一种通用方法。当你设定sasl时,你必须决定两件事;一是用于交换“标识信息”(或称身份证书)的验证机制;一是决定标识信息存储方法的验证架构。sasl验证机制规范client与server之间的应答过程以及传输内容的编码法,sasl验证架构决定服务器本身如何存储客户端的身份证书以及如何核验客户端提供的密码。如果客户端能成功通过验证,服务器端就能确定用户的身份,并借此决定用户具有怎样的权限。对postfix而言,所谓的“权限”指的就是转发服务的访问权。你也可以决定通过验证的用户在转发邮件时,是否要使用特定的寄件人地址。

选择适当的验证机制
cyrus sasl支持多种验证机制,至于要使用哪一种验证机制,客户端与服务器双方必须事先取得共识。以下是一些比较常见的机制;
plain
plain是最简单的机制,但同时也是最危险的机制,因为身份证书(登录名称与密码)是以base64字符串格式通过网络,没有任何加密保护措施。因此,使用plain机制时,你可能会想要结合tls。
login
login不是其正式支持的机制,但某些旧版的mua使用这种机制,所以cyrus sasl让你可选择其是否支持login机制。如果你的用户仍在使用这类老掉牙的mua,你必须在编译sasl函数库时,指定要包含login的支持。 login的证书交换过程类似plain。
otp
otp是一种使用“单次密码”的验证机制。此机制不提供任何加密保护,因为没必要--每个密码都只能使用一次,每次联机都要改用新密码。smto client必须能够产生otp证书。
digest-md5
使用这种机制时,client与server共享同一个隐性密码,而且此密码不通过网络传输。验证过程是从服务器先提出challenge(质询)开始,客户端使用此challenge与隐性密码计算出一个response(应答)。不同的challenge,不可能计算出相同的response;任何拥有secret password的一方,都可以用相同的challenge算出相同的response。因此,服务器只要比较客户端返回的response是否与自己算出的response相同,就可以知道客户端所拥有的密码是否正确。由于真正的密码并没有通过网络,所以不怕网络监测。
kerberos
kerberos是一种网络型验证协议。除非你的网络已经使用kerberos,否则你应该用不到kerberos机制;相对的,如果你的网络已经架设了kerberos验证中心,sasl就能完美的将smtp验证整合进现有的体系。
anonymous
anonymous机制对smtp没有意义,因为smtp验证的用意在于限制转发服务的使用对象,而不是为了形成open relay,sasl之所以提供这种机制,主要是为了支持其他协议。
当客户端链接到一个支持sasl的邮件服务器时,服务器会以优先级列出可用的机制供客户端选择。如果客户端也支持多钟机制,则当第一种机制验证失败时,客户端可能会继续尝试第二种机制,直到通过验证或是所有机制都失败为止。如果双方在一开始就无法协调出共同的机制,验证过程就算失败。
一旦双方在使用哪种机制上达成共识,就开始进行验证过程。实际的交互过程随机制而定,但通常包含一次或多次应答过程。验证协议本身也规定了应答内容的编码格式。

选择适当的验证架构

sasl验证架构可以使用现有的unix系统密码,也可用smtp用户专用密码文件。如果你的网路上kerberos之类的中间控制式验证构架,也可以使用。
哪一种验证架构最适合你,取决于你的服务器从何、如何取得证书信息。举例来说,如果smtp与pop/imap的所有用户的证书数据都是储存在系统密码文件,并通过pam来验证,那么sasl就应该透过pam来取得证书数据。另一方面,如果所有smtp user都只有虚账户,你或许应该将证书数据存放在专用的数据库,并设定sasl与POP/IMAP server从该数据库取得证书数据。

postfix与sasl

在开始使用sasl之前,你应该决定好,要采用哪一种机制与架构的组合,因为你的决定将影响编译、安装、设定的过程。首先,你必须先将sasl函数库安装到你的系统上,或是确定sasl函数库的安装目录与版本。接着,使用你收集到的sasl安装信息来设定postfix的编译选项,然后重新编译 postfix,使其具备sasl验证能力。某些系统平台可能已经预先安装了sasl函数库,甚至提供支持sasl的postfix包,不过,大部分预先编译好的postfix包都不支持sasl。因此,如果你使用现成的postfix包,最好先研读相关说明文件,或是按照本章“测试验证配置”一节所说的测试方法,确认你的postfix确实支持sasl。此外,你也要确认你的sasl函数库支持客户端可能使用的每一种验证机制。比方说,若你的用户中还有人使用老版的outlook express,你的sasl函数库就必须支持login验证机制。
cyrus sasl函数库的研发进度,目前分为两条线路,即sasl与saslv2。其中,sasl已经逐渐被saslv2所取代。在未来,postfix可能只支持saslv2,所以本章只讨论saslv2。此外,postfix与sasl函数库两者的版本都必须正确,才能组合在一起。
postfix从1.17-20020331实验版开始支持saslv2函数库,在这之前的版本,只能使用saslv1。理论上,最新版的postfix与最新版的cyrus saslv2应该可以顺利结合在一起。

postfix的sasl配置

假设你已经安装好sasl函数库,而且postfix也支持sasl,并下定决心要使用哪一种验证机制与架构的组合。现在,让我们逐步设定postfix,使其能够使用sasl来验证用户的身份。

设定验证架构
对于每个使用cyrus sasl函数库的应用系统,cyrus sasl各提供一个独立的配置文件。影响postfix的sasl配置文件是smtpd.conf。此文件通常位于 /usr/local/lib/sasl2/smtpd.conf。基本上,smtpd.conf至少要指出所要使用的验证架构。我们打算讨论两种最常用的架构:unix系统密码以及独立的sasl专用密码。

unix系统密码
通常,让sasl直接使用现有的系统密码来验证用户身份是最方便的。传统的系统密码文件应该是/etc/passwd,但是讲究安全性的现代系统则比较可能使用/etc/shadow、pam或诸如此类的证书数据库。由于这类密码文件只有特权进程才能访问,而postfix却被刻意设计成避开特权身份,所以postfix不能直接访问系统密码文件。
cyrus函数库对于这个问题的解决办法,是提供一个特殊的验证服务器程序,称为saslauthd,它能够代替postfix来取得密码数据。 saslauthd eaemon本身需要特权身份,不过,由于它是一个独立于postfix之外的进程,而且通常不必于外界进行网络通信,所以安全性的危害已经被降到最低。如果你打算让sasl使用unix系统密码,你必须启动cyrus sasl包随附的saslauthd daemon。请注意,使用saslauthd来访问unix系统密码,表示你只能使用明文密码,因为asalauthd需要实际密码才能进行核验。
要让sasl知道postfix将通过saslauthd daemon来访问证书数据库,你必须将下列内容加入smtpd.conf配置文件:
pwcheck_method: saslauthd
cyrus sasl包随附的saslauthd应该会被安装在$PATH环境变量所列的某个目录下。你必须先在后台启动saslauthd daemon,postfix才能使用它来验证客户端。当你启动saslauthd时,你必须使用-a选项指定密码系统的类型最常见的类型包括pam、 shadow或getpwent。举例来说,在一个使用pam的系统上,你应该使用下列命令来启动saslauthd daemon:
saslauthd -a pam

sasl专用密码
如果你不想使用系统密码来验证smtp client,你刻意另外建一个无关系统密码的独立账户数据库。当你的postfix系统纯粹用于提供寄信服务,而不用于接收外来邮件,用户也不用登录服务器系统本身时,使用sasl密码可能是个好主意。请将下列内容加入你的smtpd.conf配置文件:
pwcheck_method: auxprop
在cyrus的术语中,auxprop的意义是auxiliary property plug-ins(辅助性的专属外挂模块),其作用是使用外部程序来进行验证。默认的辅助外挂模块是sasldb(这也是cyrus sasl包随附的程序之一),它应该能满足postfix的所有需求。关键字auxprop只是要求使用外部的sasl密码文件。
使用sasl密码时,不需要用到saslauthd daemon,但是你必须将所有的smtp client账户与密码存放在一个专用的外部密码文件中。sasl默认使用的密码文件是/etc/sasldb2。postfix smtp server至少要具备能读取此文件的权限;如果你使用cyrus sasl的auto_transition功能,则postfix将需要能够写此文件的权限;如果你用不到auto_transition功能,最好不要将写权限开放给postfix。
如果还有其他进程也需要能够访问sasl密码文件(比方说,pop/imap server),你必须适当调整该文件的拥有权与访问权限,让相关进程都能访问它。举例来说,你可以建立一个sasl组,并确定postfix与其他需要访问该文件的账户都隶属于此组。如果有任何去他进程需要更新该文件,则只读模式可能太严格,而你必须提供写权限给必要的进程。下列命令将 /etc/sasldb2的访问模式设定为440,这使得sasl组的所有成员都能够读取该文件,除此之外的其他进程则没有访问权:
chown postfix:sasl /etc/sasldb2
chmod 440 /etc/sasldb2
cyrus sasl包所提供的saslpasswd2工具,可用来产生、维护/etc/sasldb2密码文件。对于每一个账户,你必须提供三项信息:登录名称、 sasl网域名称、密码。就postfix而言,网域名称必须与myhostname参数的值吻合。所以,最保险的设定方法,就是利用postconf -h myhostname来决定网域名称,如下:
saslpasswd2 -c -u `postconf - h myhostname` kdent
-c选项要求saslpasswd2创建(create)一个账户。“-u”选项指出该账户所属的网域,其值直接取自postfix的配置文件。

设定postfix
所有与sasl密码验证相关的postfix参数,全部都是以smtpd_sasl*(关于smtp server的参数)或smtp_sasl*(关于smtp client的参数)为前缀。对于服务器端的配置,你至少需要设定smtpd_sasl_auth_enable参数,并且将 permit_sasl_authenticated限制条件列在某一个smtpd_*_restriction的过滤规则里。

启用sasl验证
smtpd_sasl_auth_enable参数决定postfix smtp server是否支持sasl验证:
smtpd_sasl_auth_enable = yes
有些老的mua没有完全遵守smtp验证协议。依照规范说明书的标准规定,当smtp client送出ehlo命令之后,smt server应该要列出其验证机制支持列表,而且此列表是出现在关键字auth与一个空格之后。
不过,有些mua却期待收到auth与一个等号;
postfix容许你接受这种不遵守规定的行为:
broken_sasl_auth_clients = yes
设定此参数之后,postfix会分别以标准与非标准两种格式来列出它所支持的smtp验证机制。
由于两种格式都出现在smtp server的响应中,所以既不会影响标准的mua,同时又能让那些不标准的mua使用smtp sasl验证。

避免寄件人冒名
当客户端通过postfix寄信时,要如何确定客户端使用的真实的寄件人地址?比方说,某人以A身份通过smtp验证,但是却以B为发行人地址,要如何避免这种冒名情况?postfix容许你设定寄件地址与sasl登录身份的对应关系。举例来说,假设某人的邮件地址是 kdent@example.com,其sasl登录身份为kdent,如果你希望kdent只能以该地址的名义来发邮件,而不能使用其他寄件地址,你应该将下列对应关系定义在一个查询表中:
kdent@example.com kdent
这是一个普通的postfix查询表,你可以逐一列出每一个地址与每一位sasl用户的对应关系,也可以使用正则表达式来表示邮件地址的人名部分或网域部分。制作好查询表之后,请将main.cf的smtpd_sender_login_maps参数指向此表:
smtpd_sender_login_maps = hash:/etc/postfxi/sasl_senders
下一步是将reject_sender_login_mismatch限制条件纳入某个smtpd_*_restrictions过滤规则组合里,这样一来,如果kdent通过sasl验证,但是他却试图以mary@example.com的名义寄出邮件,那么postfix将拒绝帮他寄信。

核准授权用户
如果你的ube过滤规则里包含了smtpd_recipient_restrictions,你得使postfix准许通过验证得用户使用转发服务,也就是将permit_sasl_authenticated安插在限制条件里得适当位置。

设定验证机制
当客户端联机到smtp server时,有哪些密码验证机制可使用,由smtpd_sasl_security_options参数决定。完整得机制选项,取决于你得系统上有哪些机制可用以及你得sasl函数库支持哪些机制。如果不指定任何选项,默认值是接受包括明文密码在内得所有可用机制,但匿名登录除外。如果使用了 saslauthd daemon,就必须接受明文密码,所以,默认值的设想是合情合理的。如果你指定了任何选项,则默认值无效,所以你的选项里必须包含 noanonymous。例如:
smtpd_asal_security_options = noanonymous, noplaintext
以下是通用的机制选项:
noplaintext
此选项将plaintext密码验证排除在外。这使得sasl选项challenge/response技术来使用。如果你的安全政策不容许密码以明文形式流经网络,那就指定noplaintext选项吧,但是这也表示你不能使用saslauthd。
noactive
此选项将可能遭受“主动攻击”的密码机制排除在外。在“主动攻击”中,攻击者想办法将他们安插到client与server之间,所以,某些类型的主动攻击又被称为"中间人攻击“。攻击者可以读取或改变数据,让client或server误以为数据真的是对方送过来的。
nodictionary
此选项将可能遭受”字典攻击“的密码机制排除在外。在”字典攻击“中,攻击者使用预编的密码数据库,逐一测试哪个密码”恰好“能闯入你的系统。这类密码数据库通常由城市、团队、宠物、常见人名、字典词汇,加上各种明显的词汇变化等组成,所以称为”字典攻击“。
noanonymous
排除匿名登录。smtp验证的最主要目的,就是要确认用户的身份,所以”匿名登录“对smtp server是没有意义的。postfix的默认行为是禁止匿名登录。如果你指定了其他选项,你必须明确设定noanonymous。
mutual auth
要求使用互证机制--client与server双方都要提供证明自己身份的证据。

设定步骤汇整
在postfix系统中添加sasl功能所涉及的步骤有点繁复。总结本章前述的知识,以下是我们整理出来的设定步骤:
1、决定你打算支持的验证机制与架构。
2、安装sasl函数库,并重新编译postfix,使其包含sasl。或者取得已经内含sasl的postfix包,以及相关的sasl验证机制。
3、重新安装postfix
4、创建/usr/local/lib/sasl2/smtpd.conf配置文件,将pwcheck_method参数设定为saslauthd(如果使用sasl saslauthd与系统密码的话)或auxprop(如果使用sasl的专属密码文件的话)。
5、如果你选择的验证架构是unix系统密码,请启动saslauthd daemon,并且指出你的系统所用的验证方式;否则,使用saslpasswd2命令在你的系统上创建smtp client的账户与密码。
6、编辑main.cf,启动sasl验证功能,并指出验证方式。基本的设定至少需要下列两项参数:
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_mynetworks,
permit_sasl_authicated, reject_unauth destination
7、重新加载postfix,使我们在main.cf配置文件所做的改变生效:
postfix reload

测试sasl验证配置

经过重重难关之后完成安装,要如何要确定所有步骤都没有出错,证明postfix确实真的已依照我们的要求来进行验证?等到用户旅行到外地了以后,看看他们会不会打长途电话回来抱怨,肯定不是好办法。最好的办法,是直接观察smtp server的交互情况,实际体验验证过程,并立刻查阅日志文件留下的线索。
要想联机到smtp server,最容易的方法是使用telnet工具程序,然后与服务器进程smtp对话。最容易测试的plain机制,如果你禁用这项机制,建议你暂时先启用它,等完成测试实验之后再关掉它。
先让我们了解plain机制的细节,然后再开始动手做实验。plain机制要求你在auth命令之后提供一个身份标识串,此字符串编码成 base64格式。构成此字符串的各项数据的次序是“登录身份”,其后跟着一个null字符,然后是“密码拥有者的身份”,再跟一个null字符,最后是 “密码”本身。通常,“登录身份”与“密码拥有者的身份”是相同的。举例来说,假设用户kdnet的密码为rumpelstiltskin,而且其登录身份与密码拥有者身份相同,那么,他的身份标识符串是“kdent\okdent\orumpelistiltskin”(编码前的格式)。
麻烦之处,在于如何将标识符串编码成base64格式且不包含字符串末端的CR字符。如果你的系统上有mmcncode与printf命令,这步骤应该不难。printf命令能显出指定格式的字符串,但是不会像echo之类的命令那样,自动在字符串末端补一个换行字符。mmencode命令能将输入字符串编码成各种mime格式,且其默认格式正好是我们所需要的base64。
所以,我们可用下列命令来产生base64格式的标识符串:
printf 'kdent\0kdent\0rumpelstiltskin' | mmencode
某些系统平台的printf可能不能正确地处理字符串中间地null字符(\0),要想知道自己系统上地printf有没有这个毛病,只要看base64编码结果是否比原字符串短。如果你地printf有问题,不妨使用echo -n来代替printf。

smtp客户端验证

本章前半段地讨论,着重于postfix如何扮演smtp验证地服务器端角色--验证远程mua或mta地身份,借此判断对方是否有权使用转发服务。现在,我们要换个角度,讨论postfix如何扮演客户端角色--提出自己地身份证明,借此获得远程mta地转发服务地使用权。
首先,你得提供一个密码文件给postfix,其中包含能通过远程服务器得证书数据。此密码文件得每一笔记录,各包含一个代表远程服务器的网域以及一组能通过该服务器验证的账户与密码,格式如下:
destination username:password
当postfix要寄出一封邮件时,它先检查收件地址的网域部分,如果不能在密码文件中找到完全相符的destination,再寻找打算联机的主机名称。这种检查过程使得postfix可以轻易连接共享相同账户数据库的多个mx主机。决定密码文件位置的参数是 smtp_sasl_password_maps。
决定客户端行为的是smtp_sasl_security_options参数,其设定方法与服务器端的 smtpd_sasl_security_options参数相同,所以不再赘述。如果你没指定任何选项,则默认行为是容许系统上所有能找到的机制,唯独匿名登录除外。

smtp客户端验证的设定过程

让我们举个例子来示范要如何设定postfix,才能使其在通过远程系统转发邮件时,提出自己的身份证明。在这个例子中,假设我们有一组可以通过ora.com网域的所有服务器主机的账户以及一组可以通过mail.postfix.org主机的账户。
1、创建/etc/postfix/sasl_passwd密码文件,并填入我们拥有的账户与密码,例如:
ora.com kdent:rumpelstiltskin
mail.postfix.org kyle:quixote
2、使用postmap产生数据库文件:
postmap /etc/postfix/sasl_passwd
3、编辑main.cf配置文件,启动客户端验证功能。请注意,这次要设定的参数是smtp_sasl_auth_enable,而不是 smtpd_sasl_auth_enable(后者用于启动服务器端验证)。接着,在smtp_sasl_password_maps参数中指出密码文件的位置:
smtp_asal_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
4、重新加载postfix,使我们所做的改变生效:
postfix reload
现在,每当postfix smtp client试图通过/etc/postfix/sasl_passwd所列的任何网域或主机来转发邮件时,它就会提供对应的验证书籍。比方说,如果你的 postfix smtp client联机到mail.ora.com服务器,则它会使用kden与rumpelstiltskin这组账户与密码。
年轻没有失败! ! ! ! ! !
噢!有怪兽,有怪兽!
头像
xiehuoli
帖子: 5941
注册时间: 2006-06-10 8:43
来自: 中国 CS

#6

帖子 xiehuoli » 2008-05-27 22:02

寄出邮件时,postfix使用系统的resolver(即DNS client,能向DNS server查询网域信息的函数库)来取得DNS信息。收信时,你的网域的DNS必须能提供递送信息(MX或A记录)给外界查询,让其他MTA能够找到你的postfix server。

DNS对于寄信程序的影响

postfix的smtp MDA必须要能够取得MX与A记录,才能决定收信主机的名称与ip地址。也就是说,在寄信程序中,postfix至少要进行两次DNS查询,第一次是为了取得MX主机名称,另一次是取得该主机名称的ip地址。由于postfix使用操作系统的resolver来访问DNS server,因此,运行postfix的系统至少要能够访问一台DNS server。虽然大部分运行postfix的系统通常也会运行DNS server,但是这并非必要条件。
如果你怀疑自己的系统不能够正确的查询DNS信息,有三个命令行工具可以帮你找出问题:nslookup、 dig以及host。绝大部分unix系统都应该安装这三个工具。你可以利用这些工具查出特定网域的所有类型的资料记录,包括让postfix能将邮件送到正确主机的MX记录。
DNS问题可能源自于postfix所在系统本身的设定错误,也可能是目标网域的DNS server没有设定好。当你寻找问题原因时,有非常重要的一点必须谨记在心:postfix总是先查mx记录,然后再查A记录。即使你可以顺利查出网域名称的ip地址,但是如果该网域没有提供mx信息,postfix不一定能够在第一次就顺利寄出邮件。

配置文件选项

投递邮件时,postfix从DNS系统查出目标网域的所有MX资源记录,然后依据优先值来排序。在postfix顺利连接到收信方的smtp server之后,对方会以状态码来回答smtp MDA的要求。介于2xx范围之间的状态码代表答应要求;若是返回4xx范围内的状态码,表示对方遇到呢暂时性的错误;如果是状态码在5xx范围内,表示发生永久性问题。

PTR记录

为了防治垃圾邮件,现在有许多SMTP server要求客户端的ip地址必须要能够查出有效的PTR资源记录。因此,你的postfix系统的ip地址必须在DNS系统里有一个指向 postfix主机规范名称的PTR记录,这样才能确保所有SMTP SERVER都原意收下你寄出的邮件

DNS对于收信程序的影响

要让postfix收下特定网域的邮件,运行postfix的主机本身名称必须被列在该网域的MX记录里,而且postfix也必须被设定成可以收下该网域的邮件。postfix能收下三种网域的邮件:系统本身所处的本地网域(local domain)、转发网域(relay domains)、虚拟网域(virtual domains)。其中虚拟网域可能是使用虚拟别名(virtual aliases)或虚拟邮箱(virtual mailboxes)。每一种网域都必须被列在特定的postfix参数才有效。
网域类型 参数
本地 mydestination
转发 relay_domains
虚拟邮箱 virtual_mailbox_domains
虚拟别名 virtual_alias_domains
同一个网域不可同时列于不同参数中。如果postfix在两个参数找到同一个网域,它会发出警告。如果你在日志文件看到“mail for example.com loops back to myself“这样的错误信息,通常是因为你的postfix server被列在某网域的MX列表里,但是postfix却没被设定成可以收下该网域的邮件。

常见问题

DNS设定不当所造成的问题,通常没有立刻可见的效果,只能从日志文件里的错误信息来分析。
”mail for domain loops back to myself“ (某网域的邮件绕回我自己)
所有关于DNS的错误中,这可能是最常见的。问题原因是你的postfix server被列在某网域的MX列表里,但是你没让postfix知道,它自己就是该网域的邮件终点站。所以,解法就是将该网域列在 mydestination参数,或是设定为虚拟网域或转发网域。倘若你的postfix server是列在porxy或NAT设备之后,它可能无法察觉自己是某网域的MX主机,在这种情况下,你得将proxy系统得ip地址加到 proxy_interfaces参数
“host found but no data record of requested type“(能找到主机,但是没有指定数据类型得记录)
网域得DNS数据库里找不到MX记录,而且网域名称自己也没有A记录。你得要联络该网域得DNS管理员才能解决这问题。如果你自己就是DNS域名数据库得管理员,请确定你的邮件服务器的主机名称确实列在该网域的MX记录里。
”no mx host for domain has a valid A record“
网域的DNS数据库有MX记录,但是查不出mx主机名称所对应的ip地址。你得要联络该网域DNS管理员才能解决这问题。对于你自己得网域,请确定mx记录所列得每一个主机名称,都有一个有效而且正确得A记录。
”host not found, try again“
从 DNS系统中查询不出任何有意义得结果。有可能是DNS serer断线或拒绝服务,甚至故障。如果能确定该网域得DNS SERVER正常运作无误,问题可能是网络,或是postfix server系统本身得resolver没有设定妥当。对于最后一种可能,你应该检查系统的/etc/nsswitch.conf与/etc /resolv.conf配置文件。
年轻没有失败! ! ! ! ! !
噢!有怪兽,有怪兽!
real
帖子: 60
注册时间: 2008-05-07 13:01

#7

帖子 real » 2008-05-29 15:06

好强的mm阿,让我学到了另外一种配置方法。我曾金在centos5上配置过邮件服务器,不过pop/imap我用的是cyrus-imap,webmail用的是openwebmail,以后有机会也试试看在ubuntu上配置下,呵呵!

赞一个!! :lol:
xzl_zl
帖子: 58
注册时间: 2006-01-25 16:55

#8

帖子 xzl_zl » 2008-05-29 22:19

厉害,最近正在学习postfix,收藏了。
头像
ppabc
帖子: 18
注册时间: 2008-03-09 9:24

#9

帖子 ppabc » 2008-05-31 8:51

MM 那里的啊 真这么强 真是罕见
头像
cnkilior
论坛版主
帖子: 4984
注册时间: 2007-08-05 17:40

#10

帖子 cnkilior » 2008-05-31 9:22

强帖留名!

好强的美女啊!
fish_happy
帖子: 9
注册时间: 2008-05-31 9:20

#11

帖子 fish_happy » 2008-05-31 9:59

ddddddddddddd
头像
zshmail
帖子: 270
注册时间: 2006-07-03 9:12

#12

帖子 zshmail » 2008-05-31 13:53

条理好像不够清晰,希望能整理一下,看得好累!
头像
独孤
帖子: 838
注册时间: 2008-02-02 13:06
来自: 寶能科技
联系:

#13

帖子 独孤 » 2008-05-31 18:17

:lol: :lol:

MM

喜欢
tjycscn
帖子: 38
注册时间: 2006-09-02 22:50

#14

帖子 tjycscn » 2008-06-01 14:32

MM 好强啊,佩服,学习学习
头像
xiehuoli
帖子: 5941
注册时间: 2006-06-10 8:43
来自: 中国 CS

#15

帖子 xiehuoli » 2008-06-02 11:47

zshmail 写了:条理好像不够清晰,希望能整理一下,看得好累!
呵呵!不好意思
最近太忙了,寫的時候很匆忙,就隨心所欲的寫了 都沒時間去修改
等到我有時間了,去修改一下,然後完善一下
年轻没有失败! ! ! ! ! !
噢!有怪兽,有怪兽!
回复