<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>代码人生</title>
	<atom:link href="http://www.code-life.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.code-life.com</link>
	<description>阿东的代码人生</description>
	<lastBuildDate>Thu, 12 Apr 2012 09:54:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>[原]Android开发环境搭建（JDK、Android SDK、Eclipse、ADT）</title>
		<link>http://www.code-life.com/?p=387</link>
		<comments>http://www.code-life.com/?p=387#comments</comments>
		<pubDate>Thu, 12 Apr 2012 09:54:05 +0000</pubDate>
		<dc:creator>阿东</dc:creator>
				<category><![CDATA[移动开发]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Eclipse]]></category>

		<guid isPermaLink="false">http://www.code-life.com/?p=387</guid>
		<description><![CDATA[本文基于当前最新版软件在Windows环境下搭建Android开发环境，即Java SE 7u3、Android SDK r18、Eclipse 3.7.2、ADT 18.0.0，参考了Android开发者官方文档（<a href="http://developer.android.com/sdk/index.html">http://developer.android.com/sdk/index.html</a>）。以下安装顺序为推荐顺序，顺序不对可能造成安装失败。

<strong>一、安装JDK</strong>

下载地址：<a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">http://www.oracle.com/technetwork/java/javase/downloads/index.html</a>
Android SDK和Eclipse运行需要JDK 6以上版本支持，注意JRE不足以支持，因此必须安装JDK。JDK当前最新版本Java SE 7u3，下载后直接安装，不在赘述。

<strong>二、安装Android SDK</strong>

下载地址：<a href="http://developer.android.com/sdk/index.html">http://developer.android.com/sdk/index.html</a>
这里下载的Android SDK是初始包（Starter Package） ，包含AVD（Android Virtual Device）Manager和SDK Manager，后续再使用这两个工具在线更新SDK组件（Component）。
如下载不了可能是因为某墙的原因，使用代理访问试试看。
选择ZIP包或安装包（推荐）均可，解压或安装到指定目录，如D:\Eclipse\android-sdk\。

<strong>三、安装Eclipse</strong>

下载地址：<a href="http://www.eclipse.org/downloads/">http://www.eclipse.org/downloads/
</a> Eclipse推荐使用经典版本即Classic版，比较干净资源占用小。当然如果你使用过Eclipse开发过其它项目也可以利用现成的Eclipse。Android SDK需要Eclipse 3.6.2以上版本。
ZIP包解压到指定目录，如D:\Eclipse\。

<strong>四、安装ADT</strong>

Eclipse通过ADT（Android Development Tools）插件来实现Android项目的开发。
打开D:\Eclipse\eclipse.exe，选择Help-&#62;Install，Work with填入https://dl-ssl.google.com/android/eclipse/，如不能获取到列表把https改为http。
如再获取不到可能是由于某墙的原因，使用代理访问试试看。
全部选中列表中的插件Android DDMS、Android Development Tools、Android Hierarchy Viewer、Android Traceview等点击下一步，同意用户协议并开始下载、安装。完成后重启Eclipse。

<strong>五、安装SDK组件</strong>

只下载了Android SDK初始包是不能进行开发的，必须要安装相关的组件才可以继续。必须要安装的组件是SDK Tools、SDK Platform-tools、至少一个SDK Platform。
下载安装SDK组件使用SDK Manager（D:\Eclipse\android-sdk\SDK Manager.exe），选择安装即可。
如果需要进行某个版本Android的开发，必须要选择这个版本的SDK Platform。
下载了必须和可选组件后，使用AVD Manager（D:\Eclipse\android-sdk\AVD Manager.exe）创建一个虚拟设备，以便模拟手机进行程序调试。

<strong>六、Eclipse环境设置</strong>

做好了前面的工作后，就可以设置Eclipse了。Window-&#62;Preferences，左侧选择Android，在SDK Location中填入D:\Eclipse\android-sdk，点击Apply列表会更新，显示已安装的SDK Platform。

<strong>七、创建第一个Android项目</strong>

点击菜单New-&#62;Project...，选择Android Project，输入项目名HelloWorld，在Build Target这一屏选择开发的Android版本，Application Name填写HelloWorld，Package Name填写com.ahhezi.helloworld，Finish。这样一个Android项目就算建立了。
在Package Explorer中项目名上右键Run As-&#62;Android Application，这样就可以启动模拟器并看到运行结果了。]]></description>
			<content:encoded><![CDATA[<p>本文基于当前最新版软件在Windows环境下搭建Android开发环境，即Java SE 7u3、Android SDK r18、Eclipse 3.7.2、ADT 18.0.0，参考了Android开发者官方文档（<a href="http://developer.android.com/sdk/index.html">http://developer.android.com/sdk/index.html</a>）。以下安装顺序为推荐顺序，顺序不对可能造成安装失败。</p>
<p><strong>一、安装JDK</strong></p>
<p>下载地址：<a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">http://www.oracle.com/technetwork/java/javase/downloads/index.html</a><br />
Android SDK和Eclipse运行需要JDK 6以上版本支持，注意JRE不足以支持，因此必须安装JDK。JDK当前最新版本Java SE 7u3，下载后直接安装，不在赘述。</p>
<p><strong>二、安装Android SDK</strong></p>
<p>下载地址：<a href="http://developer.android.com/sdk/index.html">http://developer.android.com/sdk/index.html</a><br />
这里下载的Android SDK是初始包（Starter Package） ，包含AVD（Android Virtual Device）Manager和SDK Manager，后续再使用这两个工具在线更新SDK组件（Component）。<br />
如下载不了可能是因为某墙的原因，使用代理访问试试看。<br />
选择ZIP包或安装包（推荐）均可，解压或安装到指定目录，如D:\Eclipse\android-sdk\。</p>
<p><strong>三、安装Eclipse</strong></p>
<p>下载地址：<a href="http://www.eclipse.org/downloads/">http://www.eclipse.org/downloads/<br />
</a> Eclipse推荐使用经典版本即Classic版，比较干净资源占用小。当然如果你使用过Eclipse开发过其它项目也可以利用现成的Eclipse。Android SDK需要Eclipse 3.6.2以上版本。<br />
ZIP包解压到指定目录，如D:\Eclipse\。</p>
<p><strong>四、安装ADT</strong></p>
<p>Eclipse通过ADT（Android Development Tools）插件来实现Android项目的开发。<br />
打开D:\Eclipse\eclipse.exe，选择Help-&gt;Install，Work with填入https://dl-ssl.google.com/android/eclipse/，如不能获取到列表把https改为http。<br />
如再获取不到可能是由于某墙的原因，使用代理访问试试看。<br />
全部选中列表中的插件Android DDMS、Android Development Tools、Android Hierarchy Viewer、Android Traceview等点击下一步，同意用户协议并开始下载、安装。完成后重启Eclipse。</p>
<p><strong>五、安装SDK组件</strong></p>
<p>只下载了Android SDK初始包是不能进行开发的，必须要安装相关的组件才可以继续。必须要安装的组件是SDK Tools、SDK Platform-tools、至少一个SDK Platform。<br />
下载安装SDK组件使用SDK Manager（D:\Eclipse\android-sdk\SDK Manager.exe），选择安装即可。<br />
如果需要进行某个版本Android的开发，必须要选择这个版本的SDK Platform。<br />
下载了必须和可选组件后，使用AVD Manager（D:\Eclipse\android-sdk\AVD Manager.exe）创建一个虚拟设备，以便模拟手机进行程序调试。</p>
<p><strong>六、Eclipse环境设置</strong></p>
<p>做好了前面的工作后，就可以设置Eclipse了。Window-&gt;Preferences，左侧选择Android，在SDK Location中填入D:\Eclipse\android-sdk，点击Apply列表会更新，显示已安装的SDK Platform。</p>
<p><strong>七、创建第一个Android项目</strong></p>
<p>点击菜单New-&gt;Project...，选择Android Project，输入项目名HelloWorld，在Build Target这一屏选择开发的Android版本，Application Name填写HelloWorld，Package Name填写com.ahhezi.helloworld，Finish。这样一个Android项目就算建立了。<br />
在Package Explorer中项目名上右键Run As-&gt;Android Application，这样就可以启动模拟器并看到运行结果了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code-life.com/?feed=rss2&#038;p=387</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>“维基解密”重大曝光一览</title>
		<link>http://www.code-life.com/?p=375</link>
		<comments>http://www.code-life.com/?p=375#comments</comments>
		<pubDate>Thu, 09 Dec 2010 06:59:59 +0000</pubDate>
		<dc:creator>阿东</dc:creator>
				<category><![CDATA[大千世界]]></category>
		<category><![CDATA[WikiLeaks]]></category>
		<category><![CDATA[维基解密]]></category>

		<guid isPermaLink="false">http://www.code-life.com/?p=375</guid>
		<description><![CDATA[<div id="Content">
<div id="Contentp">

　　日前，美国知名泄密网站“<a href="http://wikileaks.org" target="_blank">维基解密</a>”披露了9万多份美军机密文件，众多鲜为人知的阿富汗战争内幕随之曝光，一时间，“维基解密”网站也成为众人关注的对象。为此，英国《每日电讯报》7月26日梳理了“维基解密”近几年来所泄露的几大“不能说的秘密”。

***美军袭击伊平民视频

　　近期，“维基解密”网页上的一段视频录像显示，驻伊拉克美军士兵在直升机上朝地面上的人群开火，结果造成包括2名英国路透社记者在内的15人死亡。

　　这段视频立即引起舆论大哗，外界纷纷指责美军的暴行。但美国军方却拒绝对开枪士兵进行惩处，并声称“记者、平民和武装分子混杂在一起，而且恰巧是在美军准备扫荡的地区，所以导致了美军的失误”。

***关塔那摩监狱手册

　　2007年，“维基解密”公布了一份美国国防部下发给士兵的《关塔那摩监狱管理指导手册》。

　　该手册内容显示，监狱管理士兵有权阻止红十字会工作人员探视囚犯。如果被关押人员表现良好或是积极与军方配合，还可获得“特别奖励”，而这“特别奖励”就是一卷手纸。

　　美军内部手册遭曝光后，人权组织立即表示了不满和抗议。

***基督教科学会内部教义

　　2008年，“维基解密”贴出了基督教科学会的内部教义手册，揭露了部分基督教科学会骗人敛财的内幕，令外界大为震惊。

　　在手册内容遭泄密后，科学会派出律师要求“维基解密”删除这些资料。但作为回应，“维基解密”创始人阿桑奇反而贴出了更多科学会的内部资料，并宣布“‘维基解密’不会向基督教科学会的威胁低头，恰如它没有向瑞士银行、俄罗斯海外干细胞研究中心、非洲前腐败官员或五角大楼的威胁低头一样”。

***气候学家擅自更改数据

　　去年，超过1000封英格兰东安格利亚大学气候研究所的邮件内容被公布在“维基解密”网站上。邮件内容显示，气候学家擅自更改对自己研究不利的气候数据，以证明全球气候变暖主要是由人类活动造成的。此事导致人们对全球变暖理论产生怀疑，影响很恶劣，外界纷纷指责科学家操纵研究结果的行为。

　　为此，英格兰东安格利亚大学特别成立独立的调查小组对事件进行调查，并且还解雇了气候研究所主任菲利普•琼斯教授。

***佩林私人邮件账号

　　在2008年美国总统竞选期间，美国共和党总统候选人麦凯恩的竞选搭档佩林的私人邮件账户曾被黑客窃取，之后，她和家人的大量私人照片以及一些邮件内容被“维基解密”网站公布在网上，引发民众热议。

　　对此，麦凯恩竞选团队斥责“维基解密”的行为是对公民隐私权“赤裸裸的侵犯”。

***50万条9•11短信

　　去年11月，“维基解密”网站曝光了超过50万条9•11事件发生当天美国民众通过手机发送的短消息内容，其中包括美国联邦政府以及地方官员的短信。不过，“维基解密”获取以及公布这一消息的途径和动机都遭到外界怀疑。

　　但“维基解密”表示，这批短信是匿名人士提供的，他们公布这些短信只是为了尽可能地还原9·11事件发生当天的情形。与此同时，美国警方和消防部门表示，无法证实9·11当天他们的内部通讯是否曾遭到拦截。美国电话公司也认为，如果手机短信真的被拦截，那么是何人要这样做、怎么做到的、为何选择将其公布在网站上，其动机都不得不让人产生怀疑。

（来源：<a href="http://www.chinadaily.com.cn/hqgj/2010-07/28/content_11058848.htm" target="_blank">中国日报网</a> 方颖 编辑：刘纯萍）

</div>
</div> <a href="http://www.code-life.com/?p=375">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div id="Content">
<div id="Contentp">
<p>　　日前，美国知名泄密网站“<a href="http://wikileaks.org" target="_blank">维基解密</a>”披露了9万多份美军机密文件，众多鲜为人知的阿富汗战争内幕随之曝光，一时间，“维基解密”网站也成为众人关注的对象。为此，英国《每日电讯报》7月26日梳理了“维基解密”近几年来所泄露的几大“不能说的秘密”。</p>
<p>***美军袭击伊平民视频</p>
<p>　　近期，“维基解密”网页上的一段视频录像显示，驻伊拉克美军士兵在直升机上朝地面上的人群开火，结果造成包括2名英国路透社记者在内的15人死亡。</p>
<p>　　这段视频立即引起舆论大哗，外界纷纷指责美军的暴行。但美国军方却拒绝对开枪士兵进行惩处，并声称“记者、平民和武装分子混杂在一起，而且恰巧是在美军准备扫荡的地区，所以导致了美军的失误”。</p>
<p>***关塔那摩监狱手册</p>
<p>　　2007年，“维基解密”公布了一份美国国防部下发给士兵的《关塔那摩监狱管理指导手册》。</p>
<p>　　该手册内容显示，监狱管理士兵有权阻止红十字会工作人员探视囚犯。如果被关押人员表现良好或是积极与军方配合，还可获得“特别奖励”，而这“特别奖励”就是一卷手纸。</p>
<p>　　美军内部手册遭曝光后，人权组织立即表示了不满和抗议。</p>
<p>***基督教科学会内部教义</p>
<p>　　2008年，“维基解密”贴出了基督教科学会的内部教义手册，揭露了部分基督教科学会骗人敛财的内幕，令外界大为震惊。</p>
<p>　　在手册内容遭泄密后，科学会派出律师要求“维基解密”删除这些资料。但作为回应，“维基解密”创始人阿桑奇反而贴出了更多科学会的内部资料，并宣布“‘维基解密’不会向基督教科学会的威胁低头，恰如它没有向瑞士银行、俄罗斯海外干细胞研究中心、非洲前腐败官员或五角大楼的威胁低头一样”。</p>
<p>***气候学家擅自更改数据</p>
<p>　　去年，超过1000封英格兰东安格利亚大学气候研究所的邮件内容被公布在“维基解密”网站上。邮件内容显示，气候学家擅自更改对自己研究不利的气候数据，以证明全球气候变暖主要是由人类活动造成的。此事导致人们对全球变暖理论产生怀疑，影响很恶劣，外界纷纷指责科学家操纵研究结果的行为。</p>
<p>　　为此，英格兰东安格利亚大学特别成立独立的调查小组对事件进行调查，并且还解雇了气候研究所主任菲利普•琼斯教授。</p>
<p>***佩林私人邮件账号</p>
<p>　　在2008年美国总统竞选期间，美国共和党总统候选人麦凯恩的竞选搭档佩林的私人邮件账户曾被黑客窃取，之后，她和家人的大量私人照片以及一些邮件内容被“维基解密”网站公布在网上，引发民众热议。</p>
<p>　　对此，麦凯恩竞选团队斥责“维基解密”的行为是对公民隐私权“赤裸裸的侵犯”。</p>
<p>***50万条9•11短信</p>
<p>　　去年11月，“维基解密”网站曝光了超过50万条9•11事件发生当天美国民众通过手机发送的短消息内容，其中包括美国联邦政府以及地方官员的短信。不过，“维基解密”获取以及公布这一消息的途径和动机都遭到外界怀疑。</p>
<p>　　但“维基解密”表示，这批短信是匿名人士提供的，他们公布这些短信只是为了尽可能地还原9·11事件发生当天的情形。与此同时，美国警方和消防部门表示，无法证实9·11当天他们的内部通讯是否曾遭到拦截。美国电话公司也认为，如果手机短信真的被拦截，那么是何人要这样做、怎么做到的、为何选择将其公布在网站上，其动机都不得不让人产生怀疑。</p>
<p>（来源：<a href="http://www.chinadaily.com.cn/hqgj/2010-07/28/content_11058848.htm" target="_blank">中国日报网</a> 方颖 编辑：刘纯萍）</p>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.code-life.com/?feed=rss2&#038;p=375</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[原]Postfix邮件服务器配置详解</title>
		<link>http://www.code-life.com/?p=362</link>
		<comments>http://www.code-life.com/?p=362#comments</comments>
		<pubDate>Tue, 07 Dec 2010 12:49:33 +0000</pubDate>
		<dc:creator>阿东</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[开源软件]]></category>
		<category><![CDATA[技术空间]]></category>
		<category><![CDATA[Postfix]]></category>

		<guid isPermaLink="false">http://www.code-life.com/?p=362</guid>
		<description><![CDATA[　　公司需要搭建一台邮件服务器，经过n次的系统重装、反反复复试验之后，折腾了将近一个月，终于将它搞定。回头看看，安装配置也不是那么复杂，只要搞清楚了原理，应该会进行得比较顺利的。安装过程中参考了很多教程，多且杂，这边这样说那边那样说，甚是烦躁，而且多数教程已过期，参考价值不大。于是乎我决定写一篇教程，作为多且杂中的一篇，希望对需要配置邮件服务器的朋友有所帮助。

　　关于邮件服务器的基础知识我在这里就不赘述了，如果你还不是非常了解，建议你先去<a href="http://linux.vbird.org/linux_server/0380mail.php" target="_blank">鸟哥的Linux私房菜</a>（繁体中文）补习一下。qmail、Sendmail、Postfix三种MTA的比较请参考<a href="http://www.hzqbbc.com/blog/arch/2005/06/qmail_sendmail.html" target="_blank">http://www.hzqbbc.com/blog/arch/2005/06/qmail_sendmail.html</a>。关于MTA的选择，由于一年前配置qmail对我留下了阴影，我决定弃用qmail而选择Postfix。实际上，Postfix是个不错的选择。
<blockquote>大规模应用例子

国内若干个大型email ISP（如163.net/tom.com/163.com及sohu等）过去都使用qmail，后来全部更换成postfix。

新浪使用qmail，yahoo使用qmail。但这些已经不是普通的qmail了。</blockquote>
　　本文中Linux发行版为CentOS5.5（<a href="http://www.centos.org/" target="_blank">http://www.centos.org/</a>），采用Dovecot作为IMAP和POP3服务器，Cyrus SASL对SMTP进行认证，pam_mysql模块来实现Cyrus SASL对数据库的读取，使用ExtMail作为WebMail、ExtMan进行管理。当前软件均为最新版本：postfix-2.7.1、 dovecot-2.0.6、cyrus-sasl-2.1.22、pam_mysql-0.6.2、extmail-1.2、extman-1.1。
<!--more-->
<h3>一、安装相关软件</h3>
　　Sendmail与Postfix可能会产生冲突，最好先卸载Sendmail：

service sendmail stop  # 如果Sendmail正在运行
yum remove sendmail  # 或 rpm -e sendmail

　　需要预先安装以下包：cyrus-sasl-lib、cyrus-sasl、cyrus-sasl-devel、cyrus-sasl-md5、cyrus-sasl-plain、pam-devel、xorg-x11-fonts-Type1、ruby、libdbi、libdbi-devel、perl-DBI、db4-devel、openssl-devel、lua、rrdtool、perl-File-Tail、perl-rrdtool、 perl-Unix-Syslog，其中openssl-devel及前面的包是系统自带的，可以使用YUM安装（推荐）或RPM安装；lua及后面的包是需要下载的，下载RPM包并安装。RPM包搜索下载不错的去处<a href="http://dag.wieers.com/rpm/" target="_blank">DAG</a>和<a href="http://www.rpmfind.net/" target="_blank">Rpmfind</a>。

　　根据你的系统情况可能有些包已经安装，有些包不列在其中。当然你也可以下载源码自己编译安装，这样的话后面的配置中做相应的修改就可以适应了。如果后续安装出现错误，查看错误提示或日志，判断是否为某些软件缺失导致。
<h3>二、添加系统组和用户</h3>
groupadd postfix -g 501
useradd postfix -u 501 -g 501 -s /sbin/nologin
groupadd postdrop -g 502
groupadd dovenull -g 503
useradd dovenull -u 503 -g 503 -s /sbin/nologin
groupadd dovecot -g 504
useradd dovecot -u 504 -g 504 -s /sbin/nologin
groupadd vmail -g 505
useradd vmail -u 505 -g 505 -s /sbin/nologin

　　postfix和postdrop用户/组为Postfix相关程序运行时使用，dovenull和dovecot用户/组为Dovecot程序运行时使用，vmail用户/组为虚拟用户使用。其中501~505的uid或gid为手动指定，注意不能与现有的重复。你也可以不指定由系统自动分配。uid和gid分配可查看/etc/passwd和/etc/group文件。这些uid和gid后面配置中会使用到。
<h3>三、认证相关配置</h3>
　　MySQL作为存储虚拟域和虚拟用户的数据库，避免了使用系统帐户带来的安全性问题，同时也便于管理。MySQL的安装这里就省略了，你可以参考<a href="http://www.code-life.com/?p=185" target="_blank">[原]LAMP环境配置</a> 中MySQL安装部分。将MySQL的路径加入到配置文件中：

echo "/usr/local/mysql/lib/mysql"&#62;&#62;/etc/ld.so.conf
ldconfig
echo "export PATH=$PATH:/usr/local/mysql/bin"&#62;&#62;/etc/profile
export PATH=$PATH:/usr/local/mysql/bin

　　以上假定MySQL编译安装在/usr/local/mysql目录下。如果你是使用YUM或RPM安装的MySQL，可能不需要以上操作。

　　pam_mysql模块实现了Cyrus SASL的SMTP身份验证的数据库读取。由于新版Dovecot内置了读取MySQL数据库的功能，因此IMAP和POP3不需要使用pam_mysql模块。下载pam_mysql（<a href="http://pam-mysql.sourceforge.net/" target="_blank">http://pam-mysql.sourceforge.net/</a>）并编译安装：

./configure --with-cyrus-sasl2 --with-mysql=/usr/local/mysql
make
make install

　　如果Cyrus SASL为编译安装，使用编译配置--with-cyrus-sasl2=/path/to/cyrus-sasl，如果MySQL为YUM或RPM安装，使用编译配置--with-mysql就可以了。编译安装完成后将会生成/lib/security/pam_mysql.so文件。

　　新建/etc/pam.d/smtp文件，该文件配置SMTP以何种方式进行认证（这里是pam_mysql模块），写入如下内容：

account required pam_mysql.so user=extmail passwd=extmail888 host=localhost db=extmail table=mailbox usercolumn=uid passwdcolumn=password crypt=1
auth sufficient pam_mysql.so user=extmail passwd=extmail888 host=localhost db=extmail table=mailbox usercolumn=uid passwdcolumn=password crypt=1

　　其中user 数据库用户名、passwd 数据库密码、host 数据库主机、db 数据库名、table 数据库表、usercolumn 用户字段、passwdcolumn 用户密码字段、crypt 加密方式（MySQL的crypt函数加密方式）。数据库的建立在后面内容中介绍。

　　新建/etc/sasl2/smtpd.conf文件，配置Cyrus SASL使用saslauthd服务来进行验证，写入如下内容：

pwcheck_method: saslauthd
mech_list: plain login
<h3>四、编译安装Dovecot</h3>
　　Dovecot为IMAP和POP3服务器，目前已支持直接对MySQL数据库的读取，因此不需要借助pam_mysql模块。下载Dovecot（<a href="http://www.dovecot.org/" target="_blank">http://www.dovecot.org/</a>）并编译安装：

./configure --prefix=/usr/local/dovecot --with-mysql --with-ssl
make
make install
ln -s /usr/local/dovecot/sbin/dovecot /usr/sbin/dovecot

　　使用编译配置--with-mysql增加对MySQL数据库直接读取的支持。如果需要增加安全连接SSL/TLS支持，配置参数加上--with-ssl选项，这个功能需要OpenSSL支持（第一部分已安装）。

　　修改Dovecot配置文件/usr/local/dovecot/etc/dovecot/dovecot.conf，如下：

listen = *
base_dir = /var/run/dovecot/
login_greeting = Dovecot ready.
mail_uid = 505
mail_gid = 505
log_path = /var/log/dovecot.log
ssl = required
ssl_cert = &#60;/etc/pki/tls/certs/mail.cert
ssl_key = &#60;/etc/pki/tls/private/mail.key
mail_location = maildir:/home/domains/%d/%n/Maildir
passdb {
   driver = sql
   args = /usr/local/dovecot/etc/dovecot/dovecot-mysql.conf
}
userdb {
   driver = sql
   args = /usr/local/dovecot/etc/dovecot/dovecot-mysql.conf
}

　　其中mail_uid和mail_gid为第二部分中设置的vmail用户的uid和vmail组的gid。ssl、ssl_cert、 ssl_key为安全连接SSL/TLS的选项（需OpenSSL支持，第一部分已安装），如不需要可删除。mail_location选项为虚拟域和虚拟用户的用户目录。passdb和userdb部分设置密码和用户数据读取方式（直接MySQL读取）。

　　新建Dovecot的MySQL读取配置文件/usr/local/dovecot/etc/dovecot/dovecot-mysql.conf（或与dovecot.conf中保持一致的路径），如下：

driver = mysql
connect = host=/tmp/mysql.sock dbname=extmail user=extmail password=extmail888
default_pass_scheme = MD5
password_query = SELECT uid AS username,domain,password FROM mailbox WHERE username='%u' AND active='1'
user_query = SELECT homedir,505 AS uid,505 AS gid FROM mailbox WHERE username='%u' AND active='1'

　　connect参数设置MySQL的Socket路径、数据库名、数据库用户、数据库密码等。password_query设置读取SQL，505为第二部分中设置的vmail用户的uid和vmail组的gid。数据库的建立在后面内容中介绍。
<h3>五、安装ExtMail/ExtMan</h3>
　　ExtMail/ExtMan是应用比较广泛的WebMail和管理界面，采用Perl编写。下载perl-DBD-mysql（<a href="http://search.cpan.org/dist/DBD-mysql/" target="_blank">http://search.cpan.org/dist/DBD-mysql/</a>）和perl-GD（<a href="http://search.cpan.org/dist/GD/" target="_blank">http://search.cpan.org/dist/GD/</a>），解压进入源码目录同样的命令编译安装：

perl Makefile.PL
make
make install

　　下载ExtMail和ExtMan（<a href="http://www.extmail.org/" target="_blank">http://www.extmail.org/</a>），解压到Web根目录下extsuite目录（本文中Web根目录为/var/www/），设定相关目录及属性：

chown -R vmail.vmail /var/www/extsuite
mkdir /tmp/extman
chown -R vmail.vmail /tmp/extman/
mkdir /home/domains
chmod 700 /home/domains
chown -R vmail.vmail /home/domains
cp -r /var/www/extsuite/extman/addon/mailgraph_ext/ /usr/local/mailgraph_ext/

　　将/var/www/extsuite/extmail/webmail.cf.default重命名为/var/www/extsuite/extmail/webmail.cf，修改以下MySQL设置部分：

SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail888
SYS_MYSQL_DB = extmail
SYS_MYSQL_HOST = localhost
SYS_MYSQL_SOCKET = /tmp/mysql.sock

　　将/var/www/extsuite/extman/webman.cf.default重命名为/var/www/extsuite/extman/webman.cf，修改以下MySQL设置部分：

SYS_MYSQL_USER = webman
SYS_MYSQL_PASS = webman888
SYS_MYSQL_DB = extmail
SYS_MYSQL_HOST = localhost
SYS_MYSQL_SOCKET = /tmp/mysql.sock

　　其中/tmp/mysql.sock为MySQL的Socket路径。SYS_MYSQL_USER设置的extmail和webman为ExtMail和ExtMan使用的数据库用户名。

　　修改初始化SQL脚本，并在MySQL中执行：

GRANT USAGE ON extmail.* TO 'extmail'@'localhost' IDENTIFIED BY 'extmail888';
GRANT USAGE ON extmail.* TO 'webman'@'localhost' IDENTIFIED BY 'webman888';
GRANT SELECT, UPDATE ON extmail.* TO 'extmail'@'localhost';
GRANT SELECT, INSERT, DELETE, UPDATE ON extmail.* TO 'webman'@'localhost';
FLUSH PRIVILEGES;
CREATE DATABASE extmail;
USE extmail;
CREATE TABLE manager (
   username varchar(255) NOT NULL default '',
   password varchar(255) NOT NULL default '',
   type varchar(64) NOT NULL default 'postmaster',
   uid varchar(255) NOT NULL default '',
   name varchar(255) NOT NULL default '',
   question text NOT NULL default '',
   answer text NOT NULL default '',
   disablepwdchange smallint(1),
   createdate datetime NOT NULL default '0000-00-00 00:00:00',
   expiredate DATE NOT NULL default '0000-00-00',
   active tinyint(1) NOT NULL default '1',
   PRIMARY KEY  (username)
) ENGINE=MyISAM COMMENT='Ext/Webman - Admin Accounts';
CREATE TABLE alias (
   address varchar(255) NOT NULL default '',
   goto text NOT NULL,
   domain varchar(255) NOT NULL default '',
   createdate datetime NOT NULL default '0000-00-00 00:00:00',
   active tinyint(1) NOT NULL default '1',
   PRIMARY KEY  (address)
) ENGINE=MyISAM COMMENT='ExtMail - Virtual Aliases';
CREATE TABLE domain (
   domain varchar(255) NOT NULL default '',
   description varchar(255) NOT NULL default '',
   hashdirpath varchar(255) NOT NULL default '',
   maxalias int(10) NOT NULL default '0',
   maxusers int(10) NOT NULL default '0',
   maxquota varchar(16) NOT NULL default '0',
   maxnetdiskquota varchar(16) NOT NULL default '0',
   transport varchar(255) default NULL,
   can_signup tinyint(1) NOT NULL default '0',
   default_quota varchar(255) default NULL,
   default_netdiskquota varchar(255) default NULL,
   default_expire varchar(12) default NULL,
   disablesmtpd smallint(1),
   disablesmtp smallint(1),
   disablewebmail smallint(1),
   disablenetdisk smallint(1),
   disableimap smallint(1),
   disablepop3 smallint(1),
   createdate datetime NOT NULL default '0000-00-00 00:00:00',
   expiredate DATE NOT NULL default '0000-00-00',
   active tinyint(1) NOT NULL default '1',
   PRIMARY KEY  (domain)
) ENGINE=MyISAM COMMENT='ExtMail - Virtual Domains';
CREATE TABLE domain_manager (
   username varchar(255) NOT NULL default '',
   domain varchar(255) NOT NULL default '',
   createdate datetime NOT NULL default '0000-00-00 00:00:00',
   active tinyint(1) NOT NULL default '1',
   KEY username (username)
) ENGINE=MyISAM COMMENT='Ext/Webman - Domain Admins';
CREATE TABLE mailbox (
   username varchar(255) NOT NULL default '',
   uid varchar(255) NOT NULL default '',
   password varchar(255) NOT NULL default '',
   clearpwd varchar(128) NOT NULL default '',
   name varchar(255) NOT NULL default '',
   mailhost varchar(255) NOT NULL default '',
   maildir varchar(255) NOT NULL default '',
   homedir varchar(255) NOT NULL default '',
   quota varchar(16) NOT NULL default '0',
   netdiskquota varchar(16) NOT NULL default '0',
   domain varchar(255) NOT NULL default '',
   uidnumber int(6) NOT NULL default '1000',
   gidnumber int(6) NOT NULL default '1000',
   createdate datetime NOT NULL default '0000-00-00 00:00:00',
   expiredate DATE NOT NULL default '0000-00-00',
   active smallint(1) NOT NULL default '1',
   disablepwdchange smallint(1),
   disablesmtpd smallint(1),
   disablesmtp smallint(1),
   disablewebmail smallint(1),
   disablenetdisk smallint(1),
   disableimap smallint(1),
   disablepop3 smallint(1),
   question text NOT NULL default '',
   answer text NOT NULL default '',
   PRIMARY KEY  (username)
) ENGINE=MyISAM COMMENT='ExtMail - Virtual Mailboxes';
INSERT INTO `manager` VALUES ('admin','$1$F0egu4LX$yG0wetjGPUnIJlqMhQwlo1','admin','root','Administrator','How are you?','Fine, thanks!','0','2010-10-22 11:47:04','0000-00-00',1);

　　初始化管理员用户名为admin，密码为admin888。

　　执行ExtMail程序需要Apache支持suEXEC，关于suEXEC，请参考（<a href="http://oss.org.cn/ossdocs/apache/httpd/2.0-cn/suexec.html" target="_blank">http://oss.org.cn/ossdocs/apache/httpd/2.0-cn/suexec.html</a>），可能需要重新编译Apache，在编译配置时加入--enable-suexec --with-suexec-caller=daemon --with-suexec-uidmin=500 --with-suexec-gidmin=500 --with-suexec-docroot=/var/www参数。

　　Apache虚拟主机配置，修改/usr/local/apache2/conf/httpd.conf（或/etc/httpd.conf），添加以下行：

NameVirtualHost *
&#60;VirtualHost *&#62;
   ServerName mail.domain.com
   DocumentRoot /var/www/extsuite/extmail/html
   ScriptAlias /extmail/cgi /var/www/extsuite/extmail/cgi
   Alias /extmail /var/www/extsuite/extmail/html
   ScriptAlias /extman/cgi /var/www/extsuite/extman/cgi
   Alias /extman /var/www/extsuite/extman/html
   SuexecUserGroup vmail vmail
&#60;/VirtualHost&#62;

　　访问http://mail.domain.com即可进入WebMail，访问http://mail.domain.com/extman进行管理。
<h3>六、安装Postfix</h3>
　　主角上场，下载Postfix（<a href="http://www.postfix.org/" target="_blank">http://www.postfix.org/</a>）并编译安装：

make -f Makefile.init makefiles 'CCARGS=-DUSE_TLS -DHAS_MYSQL -I/usr/local/mysql/include/mysql -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl' 'AUXLIBS=-L/usr/local/mysql/lib/mysql -lmysqlclient -lz -lm -L/usr/lib/sasl2 -lsasl2 -lssl -lcrypto'
make install

　　其中/usr/local/mysql/include/mysql为MySQL包含文件目录，/usr/include/sasl为SASL 包含文件目录，/local/mysql/lib/mysql为MySQL库文件目录，/usr/lib/sasl2为SASL库文件目录。安装时会有交互操作，一般情况下全部按默认设置一路Enter下去就可以了。

　　配置Postfix配置文件/etc/postfix/main.cf，修改如下：

# 一般设置
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
unknown_local_recipient_reject_code = 550
debug_peer_level = 2
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
ddd $daemon_directory/$process_name $process_id &#38; sleep 5
sendmail_path = /usr/sbin/sendmail
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/local/man
sample_directory = /etc/postfix
readme_directory = no
# 每个邮箱和每封邮件最大尺寸限制（单位为字节，Byte）
mailbox_size_limit = 107374182400
message_size_limit = 53687091200
virtual_mailbox_limit = 107374182400
# SSL/TLS安全连接设置，安全连接支持后面内容中介绍，如不需要可省略
smtpd_tls_key_file = /etc/pki/tls/private/mail.key
smtpd_tls_cert_file = /etc/pki/tls/certs/mail.cert
smtpd_tls_loglevel = 1
smtpd_tls_auth_only = yes
smtpd_tls_security_level = may
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
# SASL验证相关设置
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
smtpd_recipient_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_unauth_destination
# 域名、主机等设置
myhostname = mail.domain.com
mydomain = domain.com
myorigin = $mydomain
mynetworks = 127.0.0.0/8
inet_interfaces = all
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_limit_maps.cf
virtual_mailbox_base = /home/domains
virtual_uid_maps = static:505
virtual_gid_maps = static:505
local_transport = virtual
local_recipient_maps = $virtual_mailbox_maps

　　默认配置文件中有相应的解释，有很大的参考价值。其中virtual_uid_maps = static:505和virtual_gid_maps = static:505为第二部分中设置的vmail用户的uid和vmail组的gid。

　　配置Postfix配置文件/etc/postfix/master.cf，查找到相应行修改如下：

# SMTP设置
smtp      inet  n       -       n       -       -       smtpd
# 如需要SSL/TLS支持则加入此行
smtps      inet  n       -       n       -       -       smtpd
-o smtpd_tls_wrappermode=yes

　　配置MySQL虚拟别名配置文件/etc/postfix/mysql_virtual_alias_maps.cf，修改如下：

user = extmail
password = extmail
hosts = localhost
dbname = extmail
table = alias
select_field = goto
where_field = address
additional_conditions = AND active = '1'

　　其中user为数据库用户名，password为数据库密码，hosts为数据库主机，dbname为数据库名。下面几个配置文件类似，省略。

　　配置MySQL虚拟域配置文件/etc/postfix/mysql_virtual_domains_maps.cf，修改如下：

user = extmail
password = extmail
hosts = localhost
dbname = extmail
table = domain
select_field = domain
where_field = domain
additional_conditions = AND active = '1'

　　配置MySQL虚拟用户配置文件/etc/postfix/mysql_virtual_mailbox_maps.cf，修改如下：

user = extmail
password = extmail
hosts = localhost
dbname = extmail
table = mailbox
select_field = maildir
where_field = username
additional_conditions = AND active = '1'

　　配置MySQL虚拟磁盘配额配置文件/etc/postfix/mysql_virtual_limit_maps.cf，修改如下：

user = extmail
password = extmail
hosts = localhost
dbname = extmail
table = mailbox
select_field = quota
where_field = username
additional_conditions = AND active = '1'
<h3>七、添加SSL/TLS支持</h3>
　　SSL/TLS的原理，请参考<a href="http://www.infosecurity.org.cn/article/secprotocol/ssl/8349.html" target="_blank">http://www.infosecurity.org.cn/article/secprotocol/ssl/8349.html</a>。YUM或RPM安装crypto-utils，并用crypto-utils生成证书和私钥：

yum install crypto-utils
genkey --days 365 mail.domain.com
mv /etc/pki/tls/certs/mail.domain.com.cert /etc/pki/tls/certs/mail.cert
mv /etc/pki/tls/private/mail.domain.com.key /etc/pki/tls/private/mail.key

　　使用genkey工具时会有相应的设置，成功完成后生成证书文件*.cert和私钥文件*.key文件。关于SSL/TLS的其它设置以上步骤中均已提到。
<h3>八、添加到系统自启动，并启动Postfix系统</h3>
　　修改/etc/rc.local，加入以下行：

/var/www/extsuite/extman/daemon/cmdserver -v -d
/usr/local/mailgraph_ext/mailgraph-init start
dovecot
postfix start

　　添加saslauthd服务自启动，执行：

chkconfig --add saslauthd

　　防火墙开启邮件服务器的相应端口，主要的为25（SMTP）、110（POP3）、143（IMAP）、465（SSL/TLS SMTPs）、995（SSL/TLS POP3s）、993（SSL/TLS IMAPs）。

　　启动Postfix：

newaliases
/var/www/extsuite/extman/daemon/cmdserver -v -d
/usr/local/mailgraph_ext/mailgraph-init start
service saslauthd start
dovecot
postfix start
<h3>九、完</h3>
　　至此，一个相对完整的邮件服务器就配置成功了。后续根据需要还可以加入杀毒、反垃圾邮件功能。

　　尊重作者劳动，转载请注明出处，来自阿东的代码人生（<a href="http://www.code-life.com/" target="_blank">http://www.code-life.com</a>）。如有需要帮助的欢迎留言，我会尽量帮忙解答。提问也需要智慧，请阅读<a href="http://www.code-life.com/?p=319" target="_blank">How To Ask Questions The Smart Way (提问的智慧)</a>。 <a href="http://www.code-life.com/?p=362">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>　　公司需要搭建一台邮件服务器，经过n次的系统重装、反反复复试验之后，折腾了将近一个月，终于将它搞定。回头看看，安装配置也不是那么复杂，只要搞清楚了原理，应该会进行得比较顺利的。安装过程中参考了很多教程，多且杂，这边这样说那边那样说，甚是烦躁，而且多数教程已过期，参考价值不大。于是乎我决定写一篇教程，作为多且杂中的一篇，希望对需要配置邮件服务器的朋友有所帮助。</p>
<p>　　关于邮件服务器的基础知识我在这里就不赘述了，如果你还不是非常了解，建议你先去<a href="http://linux.vbird.org/linux_server/0380mail.php" target="_blank">鸟哥的Linux私房菜</a>（繁体中文）补习一下。qmail、Sendmail、Postfix三种MTA的比较请参考<a href="http://www.hzqbbc.com/blog/arch/2005/06/qmail_sendmail.html" target="_blank">http://www.hzqbbc.com/blog/arch/2005/06/qmail_sendmail.html</a>。关于MTA的选择，由于一年前配置qmail对我留下了阴影，我决定弃用qmail而选择Postfix。实际上，Postfix是个不错的选择。</p>
<blockquote><p>大规模应用例子</p>
<p>国内若干个大型email ISP（如163.net/tom.com/163.com及sohu等）过去都使用qmail，后来全部更换成postfix。</p>
<p>新浪使用qmail，yahoo使用qmail。但这些已经不是普通的qmail了。</p></blockquote>
<p>　　本文中Linux发行版为CentOS5.5（<a href="http://www.centos.org/" target="_blank">http://www.centos.org/</a>），采用Dovecot作为IMAP和POP3服务器，Cyrus SASL对SMTP进行认证，pam_mysql模块来实现Cyrus SASL对数据库的读取，使用ExtMail作为WebMail、ExtMan进行管理。当前软件均为最新版本：postfix-2.7.1、 dovecot-2.0.6、cyrus-sasl-2.1.22、pam_mysql-0.6.2、extmail-1.2、extman-1.1。<br />
<span id="more-362"></span></p>
<h3>一、安装相关软件</h3>
<p>　　Sendmail与Postfix可能会产生冲突，最好先卸载Sendmail：</p>
<p>service sendmail stop  # 如果Sendmail正在运行<br />
yum remove sendmail  # 或 rpm -e sendmail</p>
<p>　　需要预先安装以下包：cyrus-sasl-lib、cyrus-sasl、cyrus-sasl-devel、cyrus-sasl-md5、cyrus-sasl-plain、pam-devel、xorg-x11-fonts-Type1、ruby、libdbi、libdbi-devel、perl-DBI、db4-devel、openssl-devel、lua、rrdtool、perl-File-Tail、perl-rrdtool、 perl-Unix-Syslog，其中openssl-devel及前面的包是系统自带的，可以使用YUM安装（推荐）或RPM安装；lua及后面的包是需要下载的，下载RPM包并安装。RPM包搜索下载不错的去处<a href="http://dag.wieers.com/rpm/" target="_blank">DAG</a>和<a href="http://www.rpmfind.net/" target="_blank">Rpmfind</a>。</p>
<p>　　根据你的系统情况可能有些包已经安装，有些包不列在其中。当然你也可以下载源码自己编译安装，这样的话后面的配置中做相应的修改就可以适应了。如果后续安装出现错误，查看错误提示或日志，判断是否为某些软件缺失导致。</p>
<h3>二、添加系统组和用户</h3>
<p>groupadd postfix -g 501<br />
useradd postfix -u 501 -g 501 -s /sbin/nologin<br />
groupadd postdrop -g 502<br />
groupadd dovenull -g 503<br />
useradd dovenull -u 503 -g 503 -s /sbin/nologin<br />
groupadd dovecot -g 504<br />
useradd dovecot -u 504 -g 504 -s /sbin/nologin<br />
groupadd vmail -g 505<br />
useradd vmail -u 505 -g 505 -s /sbin/nologin</p>
<p>　　postfix和postdrop用户/组为Postfix相关程序运行时使用，dovenull和dovecot用户/组为Dovecot程序运行时使用，vmail用户/组为虚拟用户使用。其中501~505的uid或gid为手动指定，注意不能与现有的重复。你也可以不指定由系统自动分配。uid和gid分配可查看/etc/passwd和/etc/group文件。这些uid和gid后面配置中会使用到。</p>
<h3>三、认证相关配置</h3>
<p>　　MySQL作为存储虚拟域和虚拟用户的数据库，避免了使用系统帐户带来的安全性问题，同时也便于管理。MySQL的安装这里就省略了，你可以参考<a href="http://www.code-life.com/?p=185" target="_blank">[原]LAMP环境配置</a> 中MySQL安装部分。将MySQL的路径加入到配置文件中：</p>
<p>echo "/usr/local/mysql/lib/mysql"&gt;&gt;/etc/ld.so.conf<br />
ldconfig<br />
echo "export PATH=$PATH:/usr/local/mysql/bin"&gt;&gt;/etc/profile<br />
export PATH=$PATH:/usr/local/mysql/bin</p>
<p>　　以上假定MySQL编译安装在/usr/local/mysql目录下。如果你是使用YUM或RPM安装的MySQL，可能不需要以上操作。</p>
<p>　　pam_mysql模块实现了Cyrus SASL的SMTP身份验证的数据库读取。由于新版Dovecot内置了读取MySQL数据库的功能，因此IMAP和POP3不需要使用pam_mysql模块。下载pam_mysql（<a href="http://pam-mysql.sourceforge.net/" target="_blank">http://pam-mysql.sourceforge.net/</a>）并编译安装：</p>
<p>./configure --with-cyrus-sasl2 --with-mysql=/usr/local/mysql<br />
make<br />
make install</p>
<p>　　如果Cyrus SASL为编译安装，使用编译配置--with-cyrus-sasl2=/path/to/cyrus-sasl，如果MySQL为YUM或RPM安装，使用编译配置--with-mysql就可以了。编译安装完成后将会生成/lib/security/pam_mysql.so文件。</p>
<p>　　新建/etc/pam.d/smtp文件，该文件配置SMTP以何种方式进行认证（这里是pam_mysql模块），写入如下内容：</p>
<p>account required pam_mysql.so user=extmail passwd=extmail888 host=localhost db=extmail table=mailbox usercolumn=uid passwdcolumn=password crypt=1<br />
auth sufficient pam_mysql.so user=extmail passwd=extmail888 host=localhost db=extmail table=mailbox usercolumn=uid passwdcolumn=password crypt=1</p>
<p>　　其中user 数据库用户名、passwd 数据库密码、host 数据库主机、db 数据库名、table 数据库表、usercolumn 用户字段、passwdcolumn 用户密码字段、crypt 加密方式（MySQL的crypt函数加密方式）。数据库的建立在后面内容中介绍。</p>
<p>　　新建/etc/sasl2/smtpd.conf文件，配置Cyrus SASL使用saslauthd服务来进行验证，写入如下内容：</p>
<p>pwcheck_method: saslauthd<br />
mech_list: plain login</p>
<h3>四、编译安装Dovecot</h3>
<p>　　Dovecot为IMAP和POP3服务器，目前已支持直接对MySQL数据库的读取，因此不需要借助pam_mysql模块。下载Dovecot（<a href="http://www.dovecot.org/" target="_blank">http://www.dovecot.org/</a>）并编译安装：</p>
<p>./configure --prefix=/usr/local/dovecot --with-mysql --with-ssl<br />
make<br />
make install<br />
ln -s /usr/local/dovecot/sbin/dovecot /usr/sbin/dovecot</p>
<p>　　使用编译配置--with-mysql增加对MySQL数据库直接读取的支持。如果需要增加安全连接SSL/TLS支持，配置参数加上--with-ssl选项，这个功能需要OpenSSL支持（第一部分已安装）。</p>
<p>　　修改Dovecot配置文件/usr/local/dovecot/etc/dovecot/dovecot.conf，如下：</p>
<p>listen = *<br />
base_dir = /var/run/dovecot/<br />
login_greeting = Dovecot ready.<br />
mail_uid = 505<br />
mail_gid = 505<br />
log_path = /var/log/dovecot.log<br />
ssl = required<br />
ssl_cert = &lt;/etc/pki/tls/certs/mail.cert<br />
ssl_key = &lt;/etc/pki/tls/private/mail.key<br />
mail_location = maildir:/home/domains/%d/%n/Maildir<br />
passdb {<br />
   driver = sql<br />
   args = /usr/local/dovecot/etc/dovecot/dovecot-mysql.conf<br />
}<br />
userdb {<br />
   driver = sql<br />
   args = /usr/local/dovecot/etc/dovecot/dovecot-mysql.conf<br />
}</p>
<p>　　其中mail_uid和mail_gid为第二部分中设置的vmail用户的uid和vmail组的gid。ssl、ssl_cert、 ssl_key为安全连接SSL/TLS的选项（需OpenSSL支持，第一部分已安装），如不需要可删除。mail_location选项为虚拟域和虚拟用户的用户目录。passdb和userdb部分设置密码和用户数据读取方式（直接MySQL读取）。</p>
<p>　　新建Dovecot的MySQL读取配置文件/usr/local/dovecot/etc/dovecot/dovecot-mysql.conf（或与dovecot.conf中保持一致的路径），如下：</p>
<p>driver = mysql<br />
connect = host=/tmp/mysql.sock dbname=extmail user=extmail password=extmail888<br />
default_pass_scheme = MD5<br />
password_query = SELECT uid AS username,domain,password FROM mailbox WHERE username='%u' AND active='1'<br />
user_query = SELECT homedir,505 AS uid,505 AS gid FROM mailbox WHERE username='%u' AND active='1'</p>
<p>　　connect参数设置MySQL的Socket路径、数据库名、数据库用户、数据库密码等。password_query设置读取SQL，505为第二部分中设置的vmail用户的uid和vmail组的gid。数据库的建立在后面内容中介绍。</p>
<h3>五、安装ExtMail/ExtMan</h3>
<p>　　ExtMail/ExtMan是应用比较广泛的WebMail和管理界面，采用Perl编写。下载perl-DBD-mysql（<a href="http://search.cpan.org/dist/DBD-mysql/" target="_blank">http://search.cpan.org/dist/DBD-mysql/</a>）和perl-GD（<a href="http://search.cpan.org/dist/GD/" target="_blank">http://search.cpan.org/dist/GD/</a>），解压进入源码目录同样的命令编译安装：</p>
<p>perl Makefile.PL<br />
make<br />
make install</p>
<p>　　下载ExtMail和ExtMan（<a href="http://www.extmail.org/" target="_blank">http://www.extmail.org/</a>），解压到Web根目录下extsuite目录（本文中Web根目录为/var/www/），设定相关目录及属性：</p>
<p>chown -R vmail.vmail /var/www/extsuite<br />
mkdir /tmp/extman<br />
chown -R vmail.vmail /tmp/extman/<br />
mkdir /home/domains<br />
chmod 700 /home/domains<br />
chown -R vmail.vmail /home/domains<br />
cp -r /var/www/extsuite/extman/addon/mailgraph_ext/ /usr/local/mailgraph_ext/</p>
<p>　　将/var/www/extsuite/extmail/webmail.cf.default重命名为/var/www/extsuite/extmail/webmail.cf，修改以下MySQL设置部分：</p>
<p>SYS_MYSQL_USER = extmail<br />
SYS_MYSQL_PASS = extmail888<br />
SYS_MYSQL_DB = extmail<br />
SYS_MYSQL_HOST = localhost<br />
SYS_MYSQL_SOCKET = /tmp/mysql.sock</p>
<p>　　将/var/www/extsuite/extman/webman.cf.default重命名为/var/www/extsuite/extman/webman.cf，修改以下MySQL设置部分：</p>
<p>SYS_MYSQL_USER = webman<br />
SYS_MYSQL_PASS = webman888<br />
SYS_MYSQL_DB = extmail<br />
SYS_MYSQL_HOST = localhost<br />
SYS_MYSQL_SOCKET = /tmp/mysql.sock</p>
<p>　　其中/tmp/mysql.sock为MySQL的Socket路径。SYS_MYSQL_USER设置的extmail和webman为ExtMail和ExtMan使用的数据库用户名。</p>
<p>　　修改初始化SQL脚本，并在MySQL中执行：</p>
<p>GRANT USAGE ON extmail.* TO 'extmail'@'localhost' IDENTIFIED BY 'extmail888';<br />
GRANT USAGE ON extmail.* TO 'webman'@'localhost' IDENTIFIED BY 'webman888';<br />
GRANT SELECT, UPDATE ON extmail.* TO 'extmail'@'localhost';<br />
GRANT SELECT, INSERT, DELETE, UPDATE ON extmail.* TO 'webman'@'localhost';<br />
FLUSH PRIVILEGES;<br />
CREATE DATABASE extmail;<br />
USE extmail;<br />
CREATE TABLE manager (<br />
   username varchar(255) NOT NULL default '',<br />
   password varchar(255) NOT NULL default '',<br />
   type varchar(64) NOT NULL default 'postmaster',<br />
   uid varchar(255) NOT NULL default '',<br />
   name varchar(255) NOT NULL default '',<br />
   question text NOT NULL default '',<br />
   answer text NOT NULL default '',<br />
   disablepwdchange smallint(1),<br />
   createdate datetime NOT NULL default '0000-00-00 00:00:00',<br />
   expiredate DATE NOT NULL default '0000-00-00',<br />
   active tinyint(1) NOT NULL default '1',<br />
   PRIMARY KEY  (username)<br />
) ENGINE=MyISAM COMMENT='Ext/Webman - Admin Accounts';<br />
CREATE TABLE alias (<br />
   address varchar(255) NOT NULL default '',<br />
   goto text NOT NULL,<br />
   domain varchar(255) NOT NULL default '',<br />
   createdate datetime NOT NULL default '0000-00-00 00:00:00',<br />
   active tinyint(1) NOT NULL default '1',<br />
   PRIMARY KEY  (address)<br />
) ENGINE=MyISAM COMMENT='ExtMail - Virtual Aliases';<br />
CREATE TABLE domain (<br />
   domain varchar(255) NOT NULL default '',<br />
   description varchar(255) NOT NULL default '',<br />
   hashdirpath varchar(255) NOT NULL default '',<br />
   maxalias int(10) NOT NULL default '0',<br />
   maxusers int(10) NOT NULL default '0',<br />
   maxquota varchar(16) NOT NULL default '0',<br />
   maxnetdiskquota varchar(16) NOT NULL default '0',<br />
   transport varchar(255) default NULL,<br />
   can_signup tinyint(1) NOT NULL default '0',<br />
   default_quota varchar(255) default NULL,<br />
   default_netdiskquota varchar(255) default NULL,<br />
   default_expire varchar(12) default NULL,<br />
   disablesmtpd smallint(1),<br />
   disablesmtp smallint(1),<br />
   disablewebmail smallint(1),<br />
   disablenetdisk smallint(1),<br />
   disableimap smallint(1),<br />
   disablepop3 smallint(1),<br />
   createdate datetime NOT NULL default '0000-00-00 00:00:00',<br />
   expiredate DATE NOT NULL default '0000-00-00',<br />
   active tinyint(1) NOT NULL default '1',<br />
   PRIMARY KEY  (domain)<br />
) ENGINE=MyISAM COMMENT='ExtMail - Virtual Domains';<br />
CREATE TABLE domain_manager (<br />
   username varchar(255) NOT NULL default '',<br />
   domain varchar(255) NOT NULL default '',<br />
   createdate datetime NOT NULL default '0000-00-00 00:00:00',<br />
   active tinyint(1) NOT NULL default '1',<br />
   KEY username (username)<br />
) ENGINE=MyISAM COMMENT='Ext/Webman - Domain Admins';<br />
CREATE TABLE mailbox (<br />
   username varchar(255) NOT NULL default '',<br />
   uid varchar(255) NOT NULL default '',<br />
   password varchar(255) NOT NULL default '',<br />
   clearpwd varchar(128) NOT NULL default '',<br />
   name varchar(255) NOT NULL default '',<br />
   mailhost varchar(255) NOT NULL default '',<br />
   maildir varchar(255) NOT NULL default '',<br />
   homedir varchar(255) NOT NULL default '',<br />
   quota varchar(16) NOT NULL default '0',<br />
   netdiskquota varchar(16) NOT NULL default '0',<br />
   domain varchar(255) NOT NULL default '',<br />
   uidnumber int(6) NOT NULL default '1000',<br />
   gidnumber int(6) NOT NULL default '1000',<br />
   createdate datetime NOT NULL default '0000-00-00 00:00:00',<br />
   expiredate DATE NOT NULL default '0000-00-00',<br />
   active smallint(1) NOT NULL default '1',<br />
   disablepwdchange smallint(1),<br />
   disablesmtpd smallint(1),<br />
   disablesmtp smallint(1),<br />
   disablewebmail smallint(1),<br />
   disablenetdisk smallint(1),<br />
   disableimap smallint(1),<br />
   disablepop3 smallint(1),<br />
   question text NOT NULL default '',<br />
   answer text NOT NULL default '',<br />
   PRIMARY KEY  (username)<br />
) ENGINE=MyISAM COMMENT='ExtMail - Virtual Mailboxes';<br />
INSERT INTO `manager` VALUES ('admin','$1$F0egu4LX$yG0wetjGPUnIJlqMhQwlo1','admin','root','Administrator','How are you?','Fine, thanks!','0','2010-10-22 11:47:04','0000-00-00',1);</p>
<p>　　初始化管理员用户名为admin，密码为admin888。</p>
<p>　　执行ExtMail程序需要Apache支持suEXEC，关于suEXEC，请参考（<a href="http://oss.org.cn/ossdocs/apache/httpd/2.0-cn/suexec.html" target="_blank">http://oss.org.cn/ossdocs/apache/httpd/2.0-cn/suexec.html</a>），可能需要重新编译Apache，在编译配置时加入--enable-suexec --with-suexec-caller=daemon --with-suexec-uidmin=500 --with-suexec-gidmin=500 --with-suexec-docroot=/var/www参数。</p>
<p>　　Apache虚拟主机配置，修改/usr/local/apache2/conf/httpd.conf（或/etc/httpd.conf），添加以下行：</p>
<p>NameVirtualHost *<br />
&lt;VirtualHost *&gt;<br />
   ServerName mail.domain.com<br />
   DocumentRoot /var/www/extsuite/extmail/html<br />
   ScriptAlias /extmail/cgi /var/www/extsuite/extmail/cgi<br />
   Alias /extmail /var/www/extsuite/extmail/html<br />
   ScriptAlias /extman/cgi /var/www/extsuite/extman/cgi<br />
   Alias /extman /var/www/extsuite/extman/html<br />
   SuexecUserGroup vmail vmail<br />
&lt;/VirtualHost&gt;</p>
<p>　　访问http://mail.domain.com即可进入WebMail，访问http://mail.domain.com/extman进行管理。</p>
<h3>六、安装Postfix</h3>
<p>　　主角上场，下载Postfix（<a href="http://www.postfix.org/" target="_blank">http://www.postfix.org/</a>）并编译安装：</p>
<p>make -f Makefile.init makefiles 'CCARGS=-DUSE_TLS -DHAS_MYSQL -I/usr/local/mysql/include/mysql -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl' 'AUXLIBS=-L/usr/local/mysql/lib/mysql -lmysqlclient -lz -lm -L/usr/lib/sasl2 -lsasl2 -lssl -lcrypto'<br />
make install</p>
<p>　　其中/usr/local/mysql/include/mysql为MySQL包含文件目录，/usr/include/sasl为SASL 包含文件目录，/local/mysql/lib/mysql为MySQL库文件目录，/usr/lib/sasl2为SASL库文件目录。安装时会有交互操作，一般情况下全部按默认设置一路Enter下去就可以了。</p>
<p>　　配置Postfix配置文件/etc/postfix/main.cf，修改如下：</p>
<p># 一般设置<br />
queue_directory = /var/spool/postfix<br />
command_directory = /usr/sbin<br />
daemon_directory = /usr/libexec/postfix<br />
data_directory = /var/lib/postfix<br />
mail_owner = postfix<br />
unknown_local_recipient_reject_code = 550<br />
debug_peer_level = 2<br />
debugger_command =<br />
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin<br />
ddd $daemon_directory/$process_name $process_id &amp; sleep 5<br />
sendmail_path = /usr/sbin/sendmail<br />
newaliases_path = /usr/bin/newaliases<br />
mailq_path = /usr/bin/mailq<br />
setgid_group = postdrop<br />
html_directory = no<br />
manpage_directory = /usr/local/man<br />
sample_directory = /etc/postfix<br />
readme_directory = no<br />
# 每个邮箱和每封邮件最大尺寸限制（单位为字节，Byte）<br />
mailbox_size_limit = 107374182400<br />
message_size_limit = 53687091200<br />
virtual_mailbox_limit = 107374182400<br />
# SSL/TLS安全连接设置，安全连接支持后面内容中介绍，如不需要可省略<br />
smtpd_tls_key_file = /etc/pki/tls/private/mail.key<br />
smtpd_tls_cert_file = /etc/pki/tls/certs/mail.cert<br />
smtpd_tls_loglevel = 1<br />
smtpd_tls_auth_only = yes<br />
smtpd_tls_security_level = may<br />
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache<br />
smtpd_tls_session_cache_timeout = 3600s<br />
# SASL验证相关设置<br />
smtpd_sasl_auth_enable = yes<br />
broken_sasl_auth_clients = yes<br />
smtpd_sasl_security_options = noanonymous<br />
smtpd_recipient_restrictions =<br />
permit_mynetworks<br />
permit_sasl_authenticated<br />
reject_unauth_destination<br />
# 域名、主机等设置<br />
myhostname = mail.domain.com<br />
mydomain = domain.com<br />
myorigin = $mydomain<br />
mynetworks = 127.0.0.0/8<br />
inet_interfaces = all<br />
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf<br />
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf<br />
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf<br />
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_limit_maps.cf<br />
virtual_mailbox_base = /home/domains<br />
virtual_uid_maps = static:505<br />
virtual_gid_maps = static:505<br />
local_transport = virtual<br />
local_recipient_maps = $virtual_mailbox_maps</p>
<p>　　默认配置文件中有相应的解释，有很大的参考价值。其中virtual_uid_maps = static:505和virtual_gid_maps = static:505为第二部分中设置的vmail用户的uid和vmail组的gid。</p>
<p>　　配置Postfix配置文件/etc/postfix/master.cf，查找到相应行修改如下：</p>
<p># SMTP设置<br />
smtp      inet  n       -       n       -       -       smtpd<br />
# 如需要SSL/TLS支持则加入此行<br />
smtps      inet  n       -       n       -       -       smtpd<br />
-o smtpd_tls_wrappermode=yes</p>
<p>　　配置MySQL虚拟别名配置文件/etc/postfix/mysql_virtual_alias_maps.cf，修改如下：</p>
<p>user = extmail<br />
password = extmail<br />
hosts = localhost<br />
dbname = extmail<br />
table = alias<br />
select_field = goto<br />
where_field = address<br />
additional_conditions = AND active = '1'</p>
<p>　　其中user为数据库用户名，password为数据库密码，hosts为数据库主机，dbname为数据库名。下面几个配置文件类似，省略。</p>
<p>　　配置MySQL虚拟域配置文件/etc/postfix/mysql_virtual_domains_maps.cf，修改如下：</p>
<p>user = extmail<br />
password = extmail<br />
hosts = localhost<br />
dbname = extmail<br />
table = domain<br />
select_field = domain<br />
where_field = domain<br />
additional_conditions = AND active = '1'</p>
<p>　　配置MySQL虚拟用户配置文件/etc/postfix/mysql_virtual_mailbox_maps.cf，修改如下：</p>
<p>user = extmail<br />
password = extmail<br />
hosts = localhost<br />
dbname = extmail<br />
table = mailbox<br />
select_field = maildir<br />
where_field = username<br />
additional_conditions = AND active = '1'</p>
<p>　　配置MySQL虚拟磁盘配额配置文件/etc/postfix/mysql_virtual_limit_maps.cf，修改如下：</p>
<p>user = extmail<br />
password = extmail<br />
hosts = localhost<br />
dbname = extmail<br />
table = mailbox<br />
select_field = quota<br />
where_field = username<br />
additional_conditions = AND active = '1'</p>
<h3>七、添加SSL/TLS支持</h3>
<p>　　SSL/TLS的原理，请参考<a href="http://www.infosecurity.org.cn/article/secprotocol/ssl/8349.html" target="_blank">http://www.infosecurity.org.cn/article/secprotocol/ssl/8349.html</a>。YUM或RPM安装crypto-utils，并用crypto-utils生成证书和私钥：</p>
<p>yum install crypto-utils<br />
genkey --days 365 mail.domain.com<br />
mv /etc/pki/tls/certs/mail.domain.com.cert /etc/pki/tls/certs/mail.cert<br />
mv /etc/pki/tls/private/mail.domain.com.key /etc/pki/tls/private/mail.key</p>
<p>　　使用genkey工具时会有相应的设置，成功完成后生成证书文件*.cert和私钥文件*.key文件。关于SSL/TLS的其它设置以上步骤中均已提到。</p>
<h3>八、添加到系统自启动，并启动Postfix系统</h3>
<p>　　修改/etc/rc.local，加入以下行：</p>
<p>/var/www/extsuite/extman/daemon/cmdserver -v -d<br />
/usr/local/mailgraph_ext/mailgraph-init start<br />
dovecot<br />
postfix start</p>
<p>　　添加saslauthd服务自启动，执行：</p>
<p>chkconfig --add saslauthd</p>
<p>　　防火墙开启邮件服务器的相应端口，主要的为25（SMTP）、110（POP3）、143（IMAP）、465（SSL/TLS SMTPs）、995（SSL/TLS POP3s）、993（SSL/TLS IMAPs）。</p>
<p>　　启动Postfix：</p>
<p>newaliases<br />
/var/www/extsuite/extman/daemon/cmdserver -v -d<br />
/usr/local/mailgraph_ext/mailgraph-init start<br />
service saslauthd start<br />
dovecot<br />
postfix start</p>
<h3>九、完</h3>
<p>　　至此，一个相对完整的邮件服务器就配置成功了。后续根据需要还可以加入杀毒、反垃圾邮件功能。</p>
<p>　　尊重作者劳动，转载请注明出处，来自阿东的代码人生（<a href="http://www.code-life.com/" target="_blank">http://www.code-life.com</a>）。如有需要帮助的欢迎留言，我会尽量帮忙解答。提问也需要智慧，请阅读<a href="http://www.code-life.com/?p=319" target="_blank">How To Ask Questions The Smart Way (提问的智慧)</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code-life.com/?feed=rss2&#038;p=362</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>博主阿东低调回归</title>
		<link>http://www.code-life.com/?p=1</link>
		<comments>http://www.code-life.com/?p=1#comments</comments>
		<pubDate>Tue, 30 Nov 2010 04:41:26 +0000</pubDate>
		<dc:creator>阿东</dc:creator>
				<category><![CDATA[个人日记]]></category>

		<guid isPermaLink="false">http://www.code-life.com/?p=1</guid>
		<description><![CDATA[博主阿东经过一段时间的修炼后，低调回归。
博客程序从<a title="Bo-Blog" href="http://www.bo-blog.com/" target="_blank">Bo-Blog</a>转向<a title="WordPress &#124; China" href="http://cn.wordpress.org/" target="_blank">WordPress</a>，原博客文章陆续转移中……

<strong><span style="color: #008000;">2010-12-09:</span></strong>
<span style="color: #800000;">目前绝大多数文章已经转移成功，剩下的带图片、附件较多的尚未转移。
原搜索引擎过来的链接已失效，试试“站内搜索”，一般均能搜索到。</span>]]></description>
			<content:encoded><![CDATA[<p>博主阿东经过一段时间的修炼后，低调回归。<br />
博客程序从<a title="Bo-Blog" href="http://www.bo-blog.com/" target="_blank">Bo-Blog</a>转向<a title="WordPress | China" href="http://cn.wordpress.org/" target="_blank">WordPress</a>，原博客文章陆续转移中……</p>
<p><strong><span style="color: #008000;">2010-12-09:</span></strong><br />
<span style="color: #800000;">目前绝大多数文章已经转移成功，剩下的带图片、附件较多的尚未转移。<br />
原搜索引擎过来的链接已失效，试试“站内搜索”，一般均能搜索到。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.code-life.com/?feed=rss2&#038;p=1</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>关于时间、地点和人物</title>
		<link>http://www.code-life.com/?p=81</link>
		<comments>http://www.code-life.com/?p=81#comments</comments>
		<pubDate>Sun, 21 Feb 2010 07:11:51 +0000</pubDate>
		<dc:creator>阿东</dc:creator>
				<category><![CDATA[个人日记]]></category>

		<guid isPermaLink="false">http://www.code-life.com/?p=81</guid>
		<description><![CDATA[有人说，真正的爱情就是在合适的时间、合适的地点，遇到合适的人。
第一次，合适的时间、合适的地点，却不是合适的人。
第二次，遇到了合适的人，却不在合适的时间和地点。
希望这次能够完美吧！]]></description>
			<content:encoded><![CDATA[<p>有人说，真正的爱情就是在合适的时间、合适的地点，遇到合适的人。<br />
第一次，合适的时间、合适的地点，却不是合适的人。<br />
第二次，遇到了合适的人，却不在合适的时间和地点。<br />
希望这次能够完美吧！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code-life.com/?feed=rss2&#038;p=81</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[原]Windows下MEncoder下载和Linux下MEncoder的编译</title>
		<link>http://www.code-life.com/?p=85</link>
		<comments>http://www.code-life.com/?p=85#comments</comments>
		<pubDate>Wed, 13 Jan 2010 06:27:39 +0000</pubDate>
		<dc:creator>阿东</dc:creator>
				<category><![CDATA[开源软件]]></category>
		<category><![CDATA[技术空间]]></category>
		<category><![CDATA[网站开发]]></category>
		<category><![CDATA[FFMpeg]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MEncoder]]></category>
		<category><![CDATA[MPlayer]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.code-life.com/?p=85</guid>
		<description><![CDATA[　　2008年的一个项目由于要用到视频截图，研究了一番FFmpeg并写一篇博文<a href="http://www.code-life.com/?p=88" target="_self">[原]Windows下FFmpeg下载和Linux下FFmpeg的编译配置</a>分享了经验，也帮助了不少朋友解决了问题。最近一个项目要用到视频合并，而FFmpeg并不提供视频合并的功能，只能用MEncoder，于是乎又对MEncoder研究了一番，撰文以分享。

　　MEncoder是MPlayer自带的音视频编解码工具。MPlayer官方网站：<a href="http://www.mplayerhq.hu/" target="_blank">http://www.mplayerhq.hu/</a>

　　和其他跨平台开源软件一样，Windows平台的一般使用已编译好的二进制程序包即可，Linux平台需要动手编译。
　　Windows下MEncoder下载：<a href="http://sourceforge.net/projects/mplayer-win32/files/" target="_blank">http://sourceforge.net/projects/mplayer-win32/files/</a>（包含在MPlayer中）

　　OK，下面开始Linux下的MEncoder编译。实验机器的Linux发行版是CentOS 5.1。MEncoder编译要比FFmpeg编译简单的多，因为它提供了常用编解码器，而且在编译配置的时候会自动检测是否安装某个解码器而自动选择是否将其编译进去。

1.下载解压编解码器
下载地址：<a href="http://www.mplayerhq.hu/MPlayer/releases/codecs/" target="_blank">http://www.mplayerhq.hu/MPlayer/releases/codecs/</a>
必要的解码器是essential-********.tar.bz2，而所有解码器为all-********.tar.bz2，为了支持更多的格式，当然选择下载所有了。
下载后解压到某个目录，如/usr/local/lib/codecs，命令如下：
# tar jxvf all-********.tar.bz2
# mv all-******* /usr/local/lib/codecs

2.下载解压MPlayer源码
可以使用SVN检出MPlayer的最新版本：
# svn checkout svn://svn.mplayerhq.hu/mplayer/trunk mplayer
或者是下载每日更新包：<a href="http://www.mplayerhq.hu/MPlayer/releases/mplayer-checkout-snapshot.tar.bz2" target="_blank">http://www.mplayerhq.hu/MPlayer/releases/mplayer-checkout-snapshot.tar.bz2</a>
解压文件：
# tar jxvf mplayer-checkout-snapshot.tar.bz2

3.编译安装MPlayer
进入源码目录，进行编译配置，重要的两个参数--prefix=/usr/local/mplayer安装目录和--codecsdir=/usr/local/lib/codecs解码器目录。如需要添加其它参数请使用./configure --help获取帮助。最后再编译安装。
# cd mplayer-checkout-****-**-**
# ./configure --prefix=/usr/local/mplayer --codecsdir=/usr/local/lib/codecs
# make
# make install

　　到此为止，已经成功了。比起FFmpeg编译要简单得多了。遇到问题的朋友请留言给我，但不要是诸如我怎么下载解压啊之类的初级问题。]]></description>
			<content:encoded><![CDATA[<p>　　2008年的一个项目由于要用到视频截图，研究了一番FFmpeg并写一篇博文<a href="http://www.code-life.com/?p=88" target="_self">[原]Windows下FFmpeg下载和Linux下FFmpeg的编译配置</a>分享了经验，也帮助了不少朋友解决了问题。最近一个项目要用到视频合并，而FFmpeg并不提供视频合并的功能，只能用MEncoder，于是乎又对MEncoder研究了一番，撰文以分享。</p>
<p>　　MEncoder是MPlayer自带的音视频编解码工具。MPlayer官方网站：<a href="http://www.mplayerhq.hu/" target="_blank">http://www.mplayerhq.hu/</a></p>
<p>　　和其他跨平台开源软件一样，Windows平台的一般使用已编译好的二进制程序包即可，Linux平台需要动手编译。<br />
　　Windows下MEncoder下载：<a href="http://sourceforge.net/projects/mplayer-win32/files/" target="_blank">http://sourceforge.net/projects/mplayer-win32/files/</a>（包含在MPlayer中）</p>
<p>　　OK，下面开始Linux下的MEncoder编译。实验机器的Linux发行版是CentOS 5.1。MEncoder编译要比FFmpeg编译简单的多，因为它提供了常用编解码器，而且在编译配置的时候会自动检测是否安装某个解码器而自动选择是否将其编译进去。</p>
<p>1.下载解压编解码器<br />
下载地址：<a href="http://www.mplayerhq.hu/MPlayer/releases/codecs/" target="_blank">http://www.mplayerhq.hu/MPlayer/releases/codecs/</a><br />
必要的解码器是essential-********.tar.bz2，而所有解码器为all-********.tar.bz2，为了支持更多的格式，当然选择下载所有了。<br />
下载后解压到某个目录，如/usr/local/lib/codecs，命令如下：<br />
# tar jxvf all-********.tar.bz2<br />
# mv all-******* /usr/local/lib/codecs</p>
<p>2.下载解压MPlayer源码<br />
可以使用SVN检出MPlayer的最新版本：<br />
# svn checkout svn://svn.mplayerhq.hu/mplayer/trunk mplayer<br />
或者是下载每日更新包：<a href="http://www.mplayerhq.hu/MPlayer/releases/mplayer-checkout-snapshot.tar.bz2" target="_blank">http://www.mplayerhq.hu/MPlayer/releases/mplayer-checkout-snapshot.tar.bz2</a><br />
解压文件：<br />
# tar jxvf mplayer-checkout-snapshot.tar.bz2</p>
<p>3.编译安装MPlayer<br />
进入源码目录，进行编译配置，重要的两个参数--prefix=/usr/local/mplayer安装目录和--codecsdir=/usr/local/lib/codecs解码器目录。如需要添加其它参数请使用./configure --help获取帮助。最后再编译安装。<br />
# cd mplayer-checkout-****-**-**<br />
# ./configure --prefix=/usr/local/mplayer --codecsdir=/usr/local/lib/codecs<br />
# make<br />
# make install</p>
<p>　　到此为止，已经成功了。比起FFmpeg编译要简单得多了。遇到问题的朋友请留言给我，但不要是诸如我怎么下载解压啊之类的初级问题。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code-life.com/?feed=rss2&#038;p=85</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>80后世家</title>
		<link>http://www.code-life.com/?p=96</link>
		<comments>http://www.code-life.com/?p=96#comments</comments>
		<pubDate>Thu, 24 Dec 2009 04:51:35 +0000</pubDate>
		<dc:creator>阿东</dc:creator>
				<category><![CDATA[大千世界]]></category>
		<category><![CDATA[80后]]></category>

		<guid isPermaLink="false">http://www.code-life.com/?p=96</guid>
		<description><![CDATA[　　夫80后者，初从文，未及义务教育之免费，不见高等学校之分配，适值扩招，过五关，斩六将，本硕相继，寒窗数载，二十六乃成，负债十万。觅生计，背井离乡，东渡苏浙，南下湖广，西上志愿，北漂京都，披星戴月，秉烛达旦，十年无休，蓄十万。楼市暴涨，无栖处，购房金不足首付，遂投股市，翌年缩至万余，随抑郁成疾，入院一周，倾其所有病无果，因欠费被逐院门。寻医保，不合大病之规，拒付，带病还。友怜之，送三袋奶粉，饮之，卒。]]></description>
			<content:encoded><![CDATA[<p>　　夫80后者，初从文，未及义务教育之免费，不见高等学校之分配，适值扩招，过五关，斩六将，本硕相继，寒窗数载，二十六乃成，负债十万。觅生计，背井离乡，东渡苏浙，南下湖广，西上志愿，北漂京都，披星戴月，秉烛达旦，十年无休，蓄十万。楼市暴涨，无栖处，购房金不足首付，遂投股市，翌年缩至万余，随抑郁成疾，入院一周，倾其所有病无果，因欠费被逐院门。寻医保，不合大病之规，拒付，带病还。友怜之，送三袋奶粉，饮之，卒。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code-life.com/?feed=rss2&#038;p=96</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[整理/非原创]解决局域网连接到MySQL数据库速度慢的问题</title>
		<link>http://www.code-life.com/?p=98</link>
		<comments>http://www.code-life.com/?p=98#comments</comments>
		<pubDate>Thu, 17 Dec 2009 05:52:13 +0000</pubDate>
		<dc:creator>阿东</dc:creator>
				<category><![CDATA[开源软件]]></category>
		<category><![CDATA[技术空间]]></category>
		<category><![CDATA[网站开发]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.code-life.com/?p=98</guid>
		<description><![CDATA[　　使用localhost连接本地MySQL数据库正常，但通过局域网另一台机器连接却异常缓慢。默认情况下，MySQL开启了域名反向解析，例如把192.168.0.12反向解析到devel，这样的域名反向解析需要耗费时间，一般情况下也没有必要。所以在MySQL数据库配置文件中(Windows为my.ini，Linux为my.cnf)，加入一行：kip-name-resolve，重启MySQL即可。
　　这样做的话授权表中访问的主机名只能使用IP了。如果需要使用主机名，请把相应的IP、主机名加入到hosts文件中(Windows是C:\WINDOWS\system32\drivers\etc\hosts，Linux是/etc/hosts)。]]></description>
			<content:encoded><![CDATA[<p>　　使用localhost连接本地MySQL数据库正常，但通过局域网另一台机器连接却异常缓慢。默认情况下，MySQL开启了域名反向解析，例如把192.168.0.12反向解析到devel，这样的域名反向解析需要耗费时间，一般情况下也没有必要。所以在MySQL数据库配置文件中(Windows为my.ini，Linux为my.cnf)，加入一行：kip-name-resolve，重启MySQL即可。<br />
　　这样做的话授权表中访问的主机名只能使用IP了。如果需要使用主机名，请把相应的IP、主机名加入到hosts文件中(Windows是C:\WINDOWS\system32\drivers\etc\hosts，Linux是/etc/hosts)。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code-life.com/?feed=rss2&#038;p=98</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>又是一年光棍节</title>
		<link>http://www.code-life.com/?p=107</link>
		<comments>http://www.code-life.com/?p=107#comments</comments>
		<pubDate>Wed, 11 Nov 2009 05:39:03 +0000</pubDate>
		<dc:creator>阿东</dc:creator>
				<category><![CDATA[大千世界]]></category>

		<guid isPermaLink="false">http://www.code-life.com/?p=107</guid>
		<description><![CDATA[又是一年光棍节！本人体貌端正男，诚征一适龄未婚女性共度佳节！
2008年光棍节：<a href="http://www.code-life.com/?p=105" target="_self">http://www.code-life.com/?p=105</a>]]></description>
			<content:encoded><![CDATA[<p>又是一年光棍节！本人体貌端正男，诚征一适龄未婚女性共度佳节！<br />
2008年光棍节：<a href="http://www.code-life.com/?p=105" target="_self">http://www.code-life.com/?p=105</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.code-life.com/?feed=rss2&#038;p=107</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>永远做你的红颜知己好吗？</title>
		<link>http://www.code-life.com/?p=110</link>
		<comments>http://www.code-life.com/?p=110#comments</comments>
		<pubDate>Tue, 01 Sep 2009 14:59:45 +0000</pubDate>
		<dc:creator>阿东</dc:creator>
				<category><![CDATA[情感美文]]></category>

		<guid isPermaLink="false">http://www.code-life.com/?p=110</guid>
		<description><![CDATA[　　作者: 马丹 责任编辑: 刘克 来源: <a href="http://lady.people.com.cn/GB/1090/4229204.html" target="_blank">http://lady.people.com.cn/GB/1090/4229204.html</a>

　　人的感情生活，除去与生俱来的亲情外，爱情和友情就像鸟儿的双翅，使人的情感能够得以飞翔和丰富多采。在这个喧嚣、浮躁的社会，站在情感的边缘地带，我深思着该以怎样的身份出现在你身边。
　　“无论你将来是成功还是失败，我永远都会为你捧场。”不知谁说过，在这个世界上，男人最需要的除了一个老婆之外，还有一个红颜知己。就让我做你永远的红颜知己。
　　当我们以渐成熟的年龄相逢、相识且相知时，我们异常欣喜，相见恨晚。由于相同的志趣爱好，相似的人生经历，在很多问题上我们心灵相通，无需言语而心领神会，达到共识，我能懂你，你的一个眼神，一个动作，甚至一声叹息；你也懂我，我的一句轻语，一缕柔情，甚至一份心事。在一起时总是无比的快乐和愉悦，常有酒逢知己千杯少，话语投机特别多的感觉。我们彼此欣赏，彼此渴慕，我们彼此的关注渗入心灵深处。
　　尽管如此，我不会放纵我的感情，我会用情感的温度计把握着我们之间的“度”，因为，我只愿做你永远的红颜知己。<a name="entrymore"></a>
　　我不做你的妻子，不必承担相夫教子的重任，也不会象与你朝夕相伴，同床共枕的人那样在你面前絮絮叨叨说个没完。我不会让你感到我爱上你的威胁和担忧，也不会给予你爱上我的误解和激情，在这个“情人”风靡全球的时期，我也不做你的情人。因为刻骨铭心的爱只有一次。人的心不是一口箱子，空了可以再装，就象初恋，只有唯一的一次。你会遭遇你的情缘，我也会遭遇我的情缘。我不会象你的情人那样在你面前顿足撒娇无理取闹。只想与你无拘无束，推心置腹的诉说彼此的故事，畅谈彼此的理想和对人生的追求。
　　是谁曾感叹“人生得一知己足矣”？又是谁在高唱“士为知己者死”？“山青青，水碧碧，高山流水……人生难得一知音，……”蔡锷与小凤仙的一阕千古绝唱，曾让我一次又一次感动，流泪。因此，在情感世界里，我愿做你永远的红颜知己。如果你是蓝天，太阳是妻子，月亮是情人，星星是知已，我愿做点缀你生活的星星，虽然平凡，但是灿烂而又长久。也许我不是你的天空中最亮的那颗星星，但是，我会守着一份永恒，给你夜夜清辉，我会以我的兰心蕙质，温婉可人，穿过生活的喧嚣，走进你的心灵，用一种彼此都能会意的语言进行心灵的长谈与交流。
　　我愿当你忠实的倾听者，当你在工作中遇到不顺心的事情，我会陪着你把盏共饮，让你把积郁在心中的烦恼随着话语释放在酒精中，让你在倾吐之后身心舒畅；当你悲伤难过时，我会在你身边，用我纤巧的手轻抚着你眼中的潮汐，聆听着你对人生失意发泄的不满，用我的温柔给你最大的抚慰；当你遭遇逆境时，我会毫不犹豫的伸出援助的手尽我的所能帮你度过难关；当你出差在他乡异地，我会给你一个电话，捎去我的问候和牵挂；当逢年过节时，我会用我灿烂的笑容给你最深的祝福；当你取得成功的时候，面对你身边众多的鲜花和掌声，我会悄悄微笑着从你身边走开，心里默默祝福你再接再厉，取得更大的成就。当然，我也有烦恼，我也会把我的烦恼倾诉给你，让你从我这里得到信任，让你给我的关切中找回男人的豪气和自信，我绝不会霸道蛮横，似水一样的柔情中让你感到自己是一座山，我会让你感到你是我眼中最优秀的男人，让你从我这里得到自信。我也会把我开心的事情告诉你，让你在我的欢声笑语中感受一份愉快的心情。在彼此的关爱中，让我们感受《你是幸福的，我就是快乐的》这首歌的美妙和温馨。
　　有人说，红颜知己已是成年人的童话。就让岁月为我们的从容作证，为我们磊落的笑声作证，为我们宁静的心境作证，让我们将这份纤尘不染的情感延续，共同完成一个现实生活中成年人的童话。
　　在这个喧嚣、浮躁的社会，纵然步履匆匆，能让我带着你的笑容，走过生命的每一个日子，是我最大的快乐和满足。所以，此生，让我做你永远的红颜知己。]]></description>
			<content:encoded><![CDATA[<p>　　作者: 马丹 责任编辑: 刘克 来源: <a href="http://lady.people.com.cn/GB/1090/4229204.html" target="_blank">http://lady.people.com.cn/GB/1090/4229204.html</a></p>
<p>　　人的感情生活，除去与生俱来的亲情外，爱情和友情就像鸟儿的双翅，使人的情感能够得以飞翔和丰富多采。在这个喧嚣、浮躁的社会，站在情感的边缘地带，我深思着该以怎样的身份出现在你身边。<br />
　　“无论你将来是成功还是失败，我永远都会为你捧场。”不知谁说过，在这个世界上，男人最需要的除了一个老婆之外，还有一个红颜知己。就让我做你永远的红颜知己。<br />
　　当我们以渐成熟的年龄相逢、相识且相知时，我们异常欣喜，相见恨晚。由于相同的志趣爱好，相似的人生经历，在很多问题上我们心灵相通，无需言语而心领神会，达到共识，我能懂你，你的一个眼神，一个动作，甚至一声叹息；你也懂我，我的一句轻语，一缕柔情，甚至一份心事。在一起时总是无比的快乐和愉悦，常有酒逢知己千杯少，话语投机特别多的感觉。我们彼此欣赏，彼此渴慕，我们彼此的关注渗入心灵深处。<br />
　　尽管如此，我不会放纵我的感情，我会用情感的温度计把握着我们之间的“度”，因为，我只愿做你永远的红颜知己。<a name="entrymore"></a><br />
　　我不做你的妻子，不必承担相夫教子的重任，也不会象与你朝夕相伴，同床共枕的人那样在你面前絮絮叨叨说个没完。我不会让你感到我爱上你的威胁和担忧，也不会给予你爱上我的误解和激情，在这个“情人”风靡全球的时期，我也不做你的情人。因为刻骨铭心的爱只有一次。人的心不是一口箱子，空了可以再装，就象初恋，只有唯一的一次。你会遭遇你的情缘，我也会遭遇我的情缘。我不会象你的情人那样在你面前顿足撒娇无理取闹。只想与你无拘无束，推心置腹的诉说彼此的故事，畅谈彼此的理想和对人生的追求。<br />
　　是谁曾感叹“人生得一知己足矣”？又是谁在高唱“士为知己者死”？“山青青，水碧碧，高山流水……人生难得一知音，……”蔡锷与小凤仙的一阕千古绝唱，曾让我一次又一次感动，流泪。因此，在情感世界里，我愿做你永远的红颜知己。如果你是蓝天，太阳是妻子，月亮是情人，星星是知已，我愿做点缀你生活的星星，虽然平凡，但是灿烂而又长久。也许我不是你的天空中最亮的那颗星星，但是，我会守着一份永恒，给你夜夜清辉，我会以我的兰心蕙质，温婉可人，穿过生活的喧嚣，走进你的心灵，用一种彼此都能会意的语言进行心灵的长谈与交流。<br />
　　我愿当你忠实的倾听者，当你在工作中遇到不顺心的事情，我会陪着你把盏共饮，让你把积郁在心中的烦恼随着话语释放在酒精中，让你在倾吐之后身心舒畅；当你悲伤难过时，我会在你身边，用我纤巧的手轻抚着你眼中的潮汐，聆听着你对人生失意发泄的不满，用我的温柔给你最大的抚慰；当你遭遇逆境时，我会毫不犹豫的伸出援助的手尽我的所能帮你度过难关；当你出差在他乡异地，我会给你一个电话，捎去我的问候和牵挂；当逢年过节时，我会用我灿烂的笑容给你最深的祝福；当你取得成功的时候，面对你身边众多的鲜花和掌声，我会悄悄微笑着从你身边走开，心里默默祝福你再接再厉，取得更大的成就。当然，我也有烦恼，我也会把我的烦恼倾诉给你，让你从我这里得到信任，让你给我的关切中找回男人的豪气和自信，我绝不会霸道蛮横，似水一样的柔情中让你感到自己是一座山，我会让你感到你是我眼中最优秀的男人，让你从我这里得到自信。我也会把我开心的事情告诉你，让你在我的欢声笑语中感受一份愉快的心情。在彼此的关爱中，让我们感受《你是幸福的，我就是快乐的》这首歌的美妙和温馨。<br />
　　有人说，红颜知己已是成年人的童话。就让岁月为我们的从容作证，为我们磊落的笑声作证，为我们宁静的心境作证，让我们将这份纤尘不染的情感延续，共同完成一个现实生活中成年人的童话。<br />
　　在这个喧嚣、浮躁的社会，纵然步履匆匆，能让我带着你的笑容，走过生命的每一个日子，是我最大的快乐和满足。所以，此生，让我做你永远的红颜知己。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code-life.com/?feed=rss2&#038;p=110</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

