<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[草山狐随笔]]></title> 
<link>http://www.xcopy.net.cn/index.php</link> 
<description><![CDATA[PHP,J2EE,Flex,JavaScript,SEO研究--成功就躲在恐惧背后]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[草山狐随笔]]></copyright>
<item>
<link>http://www.xcopy.net.cn/read.php/389.htm</link>
<title><![CDATA[IBM WebSphere产品分类]]></title> 
<author>admin &lt;quan.zhao@yahoo.com.cn&gt;</author>
<category><![CDATA[JAVA相关]]></category>
<pubDate>Tue, 22 Jul 2008 15:03:36 +0000</pubDate> 
<guid>http://www.xcopy.net.cn/read.php/389.htm</guid> 
<description>
<![CDATA[ 
	服务器<br/>WebSphere Application Server<br/>- Express<br/>for z/OS<br/>iSeries<br/>Network Deployment<br/>V6<br/>WebSphere Extended Deployment<br/>WebSphere Edge Serve<br/><br/><br/>业务整合<br/>WebSphere Business Integration Adapters<br/>WebSphere Business Integration Message Broker<br/>WebSphere Message Broker<br/>for Multiplatforms<br/>for z/OS<br/>with Rules and Formatter Extension for Multiplatforms<br/>with Rules and Formatter Extension for z/OS<br/>WebSphere Data Interchange<br/>for MultiPlatforms<br/>for z/OS<br/>WebSphere MQ<br/>Express<br/>Extended Security Edition<br/>for z/OS<br/>V6<br/>WebSphere Business Integration Connect<br/>Advanced Edition<br/>Enterprise Edition<br/>- Express<br/>WebSphere Business Integration Event Broker<br/>for Multiplatforms<br/>WebSphere Business Integration Express for Item Synchronization<br/>WebSphere Business Integration Monitor<br/>WebSphere Business Integration Server<br/>Express<br/>V4<br/>WebSphere Business Integration Workbench<br/>Entry Edition<br/>V4<br/>WebSphere Business Integration Workbench Server<br/>WebSphere InterChange Server<br/>WebSphere MQ Workflow<br/>for z/OS and OS/390<br/>IBM Global Data Synchronization for WebSphere Product Center<br/>WebSphere Business Integration for Healthcare Collaborative Network Gateway<br/>WebSphere Business Integration Express Plus for Item Synchronization<br/>WebSphere Business Integration Modeler<br/>WebSphere Business Integration Server Express Plus<br/>WebSphere Business Integration Server Foundation<br/>for z/OS<br/>V5<br/>WebSphere Product Center<br/>WebSphere Studio Application Developer Integration Edition<br/><br/><br/>商务<br/>WebSphere Commerce<br/>- Express<br/><br/>网络<br/>Communications Server<br/>for AIX<br/>for Linux on zSeries<br/>for Linux<br/>for Windows<br/>WebSphere Host Access Transformation Services<br/>WebSphere Host Integration Solution<br/>WebSphere Host On-Demand<br/><br/><br/>软件开发<br/>Branch Transformation Toolkit for WebSphere Studio<br/>WebSphere Developer for z/Series<br/>WebSphere Development Studio for iSeries<br/>WebSphere Development Studio Client<br/>Advanced Edition for iSeries<br/>for iSeries<br/>WebSphere Studio Application Developer for Windows and Linux<br/>WebSphere Studio Asset Analyzer<br/>WebSphere Studio Device Developer<br/>WebSphere Studio Site Developer for Linux and Windows<br/>WebSphere Studio Workload Simulator for z/OS and OS/390<br/>Application Monitor for z/OS<br/>COBOL Set for AIX<br/>Enterprise COBOL for z/OS<br/>File Export for z/OS<br/>PL/I for VSE<br/>PL/I Set for AIX<br/>Enterprise PL/I for z/OS<br/>Workload Simulator for z/OS and OS/390<br/><br/><br/>无线技术 – 语音技术 – 普及设备<br/>WebSphere Everyplace Custom Environment<br/>WebSphere Everyplace Micro Environment<br/>WebSphere Translation Server for Multiplatforms<br/>Embedded ViaVoice<br/>Enterprise Edition<br/>Multiplatform Edition<br/>Standard Edition<br/>Everyplace Toolkit for WebSphere Studio<br/>Unified Messaging for WebSphere Voice Response<br/>WebSphere Everyplace Subscription Manager<br/>WebSphere Voice Application Access<br/>WebSphere Voice Response<br/>for AIX<br/>for Windows<br/>WebSphere Voice Server for Multiplatforms<br/>WebSphere Everyplace Access<br/>WebSphere Everyplace Connection Manager<br/>WebSphere Everyplace Mobile Portal Enable<br/>WebSphere Application Server for Telecom<br/>WebSphere Everyplace Device Manager<br/>WebSphere Everyplace Mobile Portal<br/>WebSphere RFID Premises Server 
]]>
</description>
</item><item>
<link>http://www.xcopy.net.cn/read.php/388.htm</link>
<title><![CDATA[由七人分粥的故事谈软件过程管理]]></title> 
<author>admin &lt;quan.zhao@yahoo.com.cn&gt;</author>
<category><![CDATA[乱七糟八]]></category>
<pubDate>Fri, 18 Jul 2008 02:52:38 +0000</pubDate> 
<guid>http://www.xcopy.net.cn/read.php/388.htm</guid> 
<description>
<![CDATA[ 
	也许这个故事你已经听过了，但是某些思考你也许还未进行过，那么请看接下来的内容：<br/>有7个人曾经住在一起，每天分一大桶粥。要命的是，粥每天都是不够的。<br/><br/>a , 一开始，指定一人负责分粥事宜，很快大家发现，这个人为自己分的粥最多最好，于是推选出一个道德高尚的人出来分粥。强权就会产生腐败，大家开始挖空心思去讨好他，搞得整个小团体乌烟瘴气，显然这个方法不行。<br/><br/>b , 指定一个人分粥和一个人监督，起初比较公平，但到后来分粥的人与监督的人从权力制约走向“权力合作”，于是只有这两个人能吃饱，这种方法也失败了。<br/><br/>谁也信不过，干脆大家轮流主持分粥，每人一天。虽然看起来平等了，但是每人在一周中只有1天吃得饱，其余6天都吃不饱，而且每天粥还有剩的，这种方法造成资源浪费。<br/><br/>c , 民主选举一个3人分粥委员会和一个4人监督委员会，实行集体领导，公平是做到了。但是，监督委员会经常提出各种议案，分粥委员会据理力争，等粥分完时，粥早就凉了，此方法效率太低。<br/><br/>d , 最后想出来一个方法——每个人轮流值日分粥，但分粥的那个人要最后一个领粥。令人惊奇的是，结果7只碗里的粥每次都是一样多，就象用科学仪器量过一样。因为，每个主持分粥的人都认识到，如果每只碗里的粥不相同，他无疑将拿到那份最少的。<br/><br/>同样是7个人，不同的流程和方法，就会造成迥然不同的结果，包括效率、成本上的差异。从这个故事可以看出，有什么流程，就有什么结果，流程决定了结果。<br/><br/>近十年来，软件过程越来越成为人们关注的焦点，正在打破过去人们已经习惯的面向任务的思维方式，逐渐加强面向过程的思考，软件开发和维护的运作以过程为中心的方式在进行。正如软件工程领域领袖级人物瓦茨·汉弗菜(Watts Humphrey)所说，要解决软件危机，首要的任务是把软件活动视作可控的、可度量的和可改进的过程。<br/><br/>其实，通过这个“七人分粥”寓意的小故事，就很清楚地说明软件过程的重要性。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; 业务流程重组（BPR）是另外一个例子，许多企业通过业务重组拯救了自己或从经营业绩的低谷走出来。业务流程重组，就是改变过去纯目标管理的思想，强调管理过程的重要性，实现从职能管理到面向业务流程管理的转变。业务流程重组注重整体流程的优化，确定了“组织为流程而定，而不是流程为组织而定”的指导思想，充分发挥每个人在整个业务流程中的作用。<br/><br/>软件过程管理体现在过程模型、规范、问题处理方法和具体实践等一系列内容之上，但首先体现在组织的文化中，即建立过程管理的先进理念：<br/><br/>以客户为导向、以过程为中心。 <br/><br/>好的过程就能产生好的产品。 <br/><br/>尊重流程，自上而下，依赖流程。 <br/><br/>只关注质量过程而不是质量结果。<br/><br/>　　在当今互联网蓬勃发展的时代，软件企业面临着巨大的挑战。顾客需求瞬息万变、全球性竞争环境和技术创新不断加速等，导致产品生命周期不断缩短、商业模式不稳定，软件过程管理必须适应这种变化，CMMI、敏捷过程管理越来越受到推崇。同时，IBM-Rational的统一过程(RUP)管理和微软的过程管理框架（MSF）在保持其核心内容的前提下，也在不断进行调整，加入新的内容，以适应软件商业模式和开发模式的变化。所以，从这个意义上说，没有一成不变的软件过程管理模式，也没有放之四海而皆准的、通用的软件过程管理模式。软件过程管理模式应该是在不断发展的，就每个具体的软件组织和企业，应该选择适合自己的过程管理模式，并且也可能不只是选择一种模式，而是选择多种模式，以一种模式为主，对其他模式兼收并蓄，形成更有效的软件过程自定义模式。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当然，这一切，归咎于我们有没有这样的理念和文化，过程管理的先进文化一旦在组织中建立起来，其他问题就迎刃而解。软件过程管理存在的最大障碍可能不在究竟用什么过程模型或过程管理系统，而是在于软件企业自身的传统的管理理念和思维方式，树立和保持企业全体人员的正确的、先进的理念，比推广一个管理工具要难得多。所以，软件过程管理的关键是建立正确的过程管理文化。
]]>
</description>
</item><item>
<link>http://www.xcopy.net.cn/read.php/387.htm</link>
<title><![CDATA[澳门发行400万张奥运澳门币纪念钞]]></title> 
<author>Bart.Xu &lt;xyf3215@163.com&gt;</author>
<category><![CDATA[风景图片]]></category>
<pubDate>Tue, 15 Jul 2008 00:46:30 +0000</pubDate> 
<guid>http://www.xcopy.net.cn/read.php/387.htm</guid> 
<description>
<![CDATA[ 
	<a href="http://www.xcopy.net.cn/attachment.php?fid=284" target="_blank"><img src="http://www.xcopy.net.cn/attachment.php?fid=284" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>正面<br/><br/><a href="http://www.xcopy.net.cn/attachment.php?fid=285" target="_blank"><img src="http://www.xcopy.net.cn/attachment.php?fid=285" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>背面<br/>Tags - <a href="http://www.xcopy.net.cn/go.php/tags/%25E5%25A5%25A5%25E8%25BF%2590/" rel="tag">奥运</a> , <a href="http://www.xcopy.net.cn/go.php/tags/%25E7%25BA%25AA%25E5%25BF%25B5%25E9%2592%259E/" rel="tag">纪念钞</a> , <a href="http://www.xcopy.net.cn/go.php/tags/%25E6%25BE%25B3%25E9%2597%25A8%25E5%25B8%2581/" rel="tag">澳门币</a>
]]>
</description>
</item><item>
<link>http://www.xcopy.net.cn/read.php/386.htm</link>
<title><![CDATA[C++通讯录程序源码]]></title> 
<author>admin &lt;quan.zhao@yahoo.com.cn&gt;</author>
<category><![CDATA[工具&amp;软件]]></category>
<pubDate>Thu, 10 Jul 2008 10:52:06 +0000</pubDate> 
<guid>http://www.xcopy.net.cn/read.php/386.htm</guid> 
<description>
<![CDATA[ 
	感谢网友wacr2008 添加了自动配置数据源功能<br/>vckbase.com 下载地址： <br/><a href="http://www.vckbase.com/code/downcode.asp?id=2210" target="_blank">http://www.vckbase.com/code/downcode.asp?id=2210</a><br/><a href="attachment.php?fid=283">点击这里下载文件</a>
]]>
</description>
</item><item>
<link>http://www.xcopy.net.cn/read.php/385.htm</link>
<title><![CDATA[《More Effective C++》中文CHM版]]></title> 
<author>admin &lt;quan.zhao@yahoo.com.cn&gt;</author>
<category><![CDATA[工具&amp;软件]]></category>
<pubDate>Thu, 10 Jul 2008 01:39:57 +0000</pubDate> 
<guid>http://www.xcopy.net.cn/read.php/385.htm</guid> 
<description>
<![CDATA[ 
	<a href="attachment.php?fid=282">点击这里下载文件</a><br/>Tags - <a href="http://www.xcopy.net.cn/go.php/tags/effective/" rel="tag">effective</a> , <a href="http://www.xcopy.net.cn/go.php/tags/c%252B%252B/" rel="tag">c++</a> , <a href="http://www.xcopy.net.cn/go.php/tags/%25E4%25B8%25AD%25E6%2596%2587chm%25E7%2589%2588/" rel="tag">中文chm版</a>
]]>
</description>
</item><item>
<link>http://www.xcopy.net.cn/read.php/384.htm</link>
<title><![CDATA[若你一天在电脑前超过4小时一定要看  ]]></title> 
<author>lincoln.zhou &lt;&gt;</author>
<category><![CDATA[乱七糟八]]></category>
<pubDate>Wed, 09 Jul 2008 15:12:40 +0000</pubDate> 
<guid>http://www.xcopy.net.cn/read.php/384.htm</guid> 
<description>
<![CDATA[ 
	1、伸伸懒腰，松松骨，每小时都要做！<br/>2、推下推下推下，每小时推松手筋！<br/>3、不想变硬颈，得转转转，两边转！<br/>4、千万千万千万，每小时转转胳膊！<br/>5、记住每小时转转脚松松筋 ！<br/>6、记住每小时松松手拉拉筋 ！<br/>7、记住每小时踢踢腿拉拉筋 ！
]]>
</description>
</item><item>
<link>http://www.xcopy.net.cn/read.php/383.htm</link>
<title><![CDATA[人生三件不能等的事情]]></title> 
<author>lincoln.zhou &lt;&gt;</author>
<category><![CDATA[乱七糟八]]></category>
<pubDate>Wed, 09 Jul 2008 14:46:33 +0000</pubDate> 
<guid>http://www.xcopy.net.cn/read.php/383.htm</guid> 
<description>
<![CDATA[ 
	第一：贫穷，贫穷不能等，因为时间久了，你将习惯贫穷，到时不但无法突破自我，甚至会抹杀了自己的梦想，而庸庸碌碌的过一辈子。&nbsp;&nbsp;<br/><br/>第二：梦想不能等，因为人生的阶段不同，会有不同的历练和想法，试想一个问题，如果你二十岁的梦想60岁才实现，那会是什么样的一个情况？<br/>譬如说你二十岁时候的梦想是买一辆法拉利跑车，然后到德国的无限速公路狂飚，你一直努力工作，好不容易到了60岁，总算买的起跑车了，但要实现年轻时候的梦想,恐怕也是心有余而力不足吧.&nbsp;&nbsp;<br/><br/>第三：家人；家人不能等，或许我们还年轻，未来有很多时间可以让我们摸索、打拼，但是家人吗？他们还有时间等我们成功吗？？？还有时间等我们挣到钱，让他们过好日子，让他们以我们为荣？？？&nbsp;&nbsp;<br/><br/>树欲静而风不止，子欲养而亲不待……这是很多人的痛，也是很多人一辈子的遗憾。&nbsp;&nbsp;<br/><br/>人的上半生，要不犹豫&nbsp;&nbsp;<br/>人的下半生，要不后悔&nbsp;&nbsp;<br/>活在当下，把握每次机会，因为机会稍纵即逝，为自己的生命找到出路&nbsp;&nbsp;<br/>急事，慢慢说&nbsp;&nbsp;<br/>大事，清楚的说&nbsp;&nbsp;<br/>小事，幽默的说&nbsp;&nbsp;<br/>没把握的事，谨慎的说&nbsp;&nbsp;<br/>没发生的事，不要胡说&nbsp;&nbsp;<br/>做不到的事，别乱说&nbsp;&nbsp;<br/>伤害人的事，不能说&nbsp;&nbsp;<br/>讨厌的事，对事不对人的说&nbsp;&nbsp;<br/>开心的事，看场合的说&nbsp;&nbsp;<br/>伤心的事，不要见人就说&nbsp;&nbsp;<br/>别人的事，小心的说&nbsp;&nbsp;<br/>自己的事，听听自己的心怎么说&nbsp;&nbsp;<br/>现在的事，做了再说&nbsp;&nbsp;<br/>未来的事，未来再说
]]>
</description>
</item><item>
<link>http://www.xcopy.net.cn/read.php/382.htm</link>
<title><![CDATA[Delphi - 被廉价甩卖的传奇 ]]></title> 
<author>admin &lt;quan.zhao@yahoo.com.cn&gt;</author>
<category><![CDATA[DELPHI]]></category>
<pubDate>Wed, 09 Jul 2008 09:50:55 +0000</pubDate> 
<guid>http://www.xcopy.net.cn/read.php/382.htm</guid> 
<description>
<![CDATA[ 
	2008年5月，全球的目光似乎都在关注微软与雅虎百亿收购的暗战，当雅虎在为500亿还是400亿的价钱出卖自己这个问题所困扰时，昔日微软王朝的挑战者——Borland公司却以2300万美元的价格将曾经为自己奠定传奇的IDE(Integrated Develop Environment：集成开发环境)业务出售给了另一家公司，除了少数Borland铁杆支持者发表了部分追忆式的惋惜外，这条新闻几乎没有引起任何美国主流IT媒体关注，变涟漪消失在微软并购案的新闻海洋之中……<br/>在开发工具领域，Borland公司一直是微软王朝的有力挑战者。然而，2008年5月，Borland公司以2300万美元的价格，将包括 Delphi在内的曾经为自己创造辉煌的IDE业务出售给了另一家公司，这条新闻甚至没有引起美国主流IT媒体的关注。那么，被收购的Delphi等知名开发工具的未来将会怎样？会不会如同收购消息一样消失在人们的视野中？<br/><br/>　 <span style="color: #0000FF;">一个2300万美元的交易</span><br/>　　2008年5月7日，一条消息出现在Borland公司官方网站的新闻中，Borland正式宣布将CodeGear子公司出售给Embarcadero(易博龙)技术公司。<br/><br/>　　CodeGear公司成立于2006年11月14日，是Borland的全资子公司，主要负责Borland的集成开发环境业务。<br/><br/>　　虽然是一个成立仅两年的年轻公司，但是它旗下的产品对于大多数程序开发人员却具有传奇一样的崇高地位，这些产品包括JBuilder、Java开发工具、Delphi与C++Builder，还有刚刚研发出的PHP与Ruby的IDE开发工具。<br/><br/>　　然而，这些著名的开发套件从此将不再属于Borland，一个传奇的时代结束了。<br/><br/>　　<span style="color: #0000FF;">集成开发环境</span><br/><br/>　　集成开发环境(简称IDE)软件是用于程序开发环境的应用程序，一般包括代码编辑器、编译器、调试器和图形用户界面工具，也就是集成了代码编写功能、分析功能、编译功能、Debug功能等一体化的开发软件套。所有具备这一特性的软件或者软件套(组)都可以叫做IDE。如微软的Visual Studio系列，Borland的C++ Builder、Delphi系列等。<br/><br/>　　其实早在两年前，当CodeGear公司还没有从Borland分离出去的时候，Borland首席执行官Tod Nielson就开始计划将IDE部门卖掉，理由是IDE部门遭受到来自微软和免费开放源代码产品的竞争，特别是来自Eclipse基金会的Java IDE，使得Borland的IDE营收比重不断下滑难以为继。<br/><br/>　　Borland那时希望出售IDE业务能够让公司获得更多的资源，投入更多精力用在Borland新看好的应用程序生命周期管理ALM业务上。<br/><br/>　　但当时Delphi和JBuilder等仍然散发着自己的光芒，虽然有许多买家都对Borland的IDE业务很有兴趣，但他们所提出的价格无法让Borland满意。于是在历经半年寻找买主未果后，Borland决定将IDE部门独立出去，成立专门的子公司并命名为CodeGear。<br/><br/>　　其实这一举动本身仍然是一种待价而沽的行为，因为独立出去的CodeGear公司，除了财务仍然和Borland挂钩外，其它所有的运营都与 Borland彻底分开了。这也就意味着无论任何时间，一旦有其他公司表示出购买意向，Borland都能够将这块业务干净利索地全盘出售。<br/><br/>　　而两年之后的今天，那个曾经让无数人学会编程的Turb C，那个让无数程序员着迷于Windows编程的Delphi，最终被Borland甩卖了。2300万美元成为了CodeGear最终的价值——这个价钱在美国甚至不足以拍摄一部二流电影，Borland像扔掉一块烫手的山芋一样甩卖掉了这个曾经为它创造辉煌的IDE业务。<br/><br/>　　<span style="color: #0000FF;">Borland的失策</span><br/><br/>　　廉价甩卖IDE业务，对Borland公司而言，可以说是一种莫大的讽刺，也可以说是一个失败的企业战略，让我们来回顾一下曾经的辉煌是如何演变为现在的无奈。<br/><br/>　　上世纪80年代，Borland凭借Turbo C、Turbo Pascal、SideKick几款产品雄霸计算机编译工具和应用软件市场，并积累下庞大的资金，瞬间爆发的胜利让Borland管理层变得不可一世的自大。<br/><br/>　　1991年，Borland斥资4亿美元并购了当时已经快速走下坡路的Ashton-Tate公司，尽管当时的华尔街分析师都认为 Ashton-Tate根本不值这个价。Borland希望通过Ashton-Tate的dBase全面占领PC桌面数据库市场，与比尔盖茨一争高下，以成为PC软件界的霸主。<br/><br/>　　然而，Ashton-Tate被Borland并购后，将近10年的辉煌也随之消逝。Ashton-Tate原本很有机会成为今日的 Oracle，继续占据PC数据库市场龙头的地位，但Windows和FoxPro的出现改变了这一切。由于当时dBase并没有Windows的版本，原本DOS下dBase程序员急需一个Windows下的dBase开发工具，因此当能够兼容dBase格式的FoxPro For Windows推出之后，立刻吸引了许多原先dBase Ⅲ/dBase Ⅲ Plus的使用者。<br/><br/>　　但Borland自我良好的感觉并没有察觉市场的变化，直到微软连续推出两个版本的FoxPro For Windows之后，Borland才终于发现dBase的使用者正在流失。<br/><br/>　　虽然后来Borland推出了Windows下的dBase，但是它再也无力改变市场了，此时市场的发展出现了变化，PC数据库市场已经开始走入关系数据库的时代，桌面型数据库的市场已经开始逐渐萎缩且出现下滑的迹象。直到1999年3月12日，Borland在dBase已经完全没落之后，才迫不得已将花费数亿美元并购来的dBase廉价售出。<br/><br/>　　虽然Delphi和JBuilder的成功帮助Borland挽回了一些损失，但微软.NET的推出的又打乱了Borland的阵脚，它开始为是否跟随微软进入.NET新平台而犹豫不决，因为Borland当时想要趁Linux的热潮改走跨平台的方向，而不是在Windows平台上辛苦地和已经成为巨头的微软竞争。<br/><br/>　　而随着软件利润整体趋于下降，Borland必须想办法维持公司的成长，开辟新的产品线。从2000年开始，Borland推出并且扩充了 Kylix产品，进军Linux编程市场。不过，随着Linux在2000/2001年从爆炸性成长逐渐回归成正常的发展之后，Borland很快发现，光靠Java和Linux市场将无法获得足够的利润。<br/><br/>　　所有知名的信息研究机构的分析都指出.NET在未来将和Java一起占有相当大的市场后，Borland才知道是不可以失去.NET市场的。于是，Borland匆匆地投入了.NET产品的研发，但是此时的天下已经是微软独霸一方了，这些失败的行动让Borland投注了过多的资源，为自己的传奇终结埋下了最终的致命隐患。<br/><br/>　　回首今天，如果不是Borland犯了过多的错误以及失去了许多宝贵的机会，否则很有可能是主宰软件市场的另一个霸主，可以和微软抗衡，并且站稳软件大公司的地位。但是Borland就这样在盲目自大中失去了自己宝贵的机会。<br/><br/>　　<span style="color: #0000FF;">Delphi能否卷土重来</span><br/>　　此次收购CodeGear的易博龙技术公司成立于1993年，总部设在美国旧金山，它是一家为企业提供专业级数据库工具，用于设计、开发、管理数据库以及其中的数据的公司，它目前在全世界有12000多家企业客户，在“财富100强”中也有90多家是它的客户。公司的旗舰数据库工具包括 ER/Studio、DBArtisan、Rapid SQL及Change Manager，年营收6000万美元。<br/><br/>　　这项收购对于易博龙公司的好处是不言而喻的，首先CodeGear旗下的开发工具拥有忠实的开发者和技术社区，特别是那些追随Delphi、 JBuilder和C++Builder多年且数量庞大的狂热粉丝们。这些开发者多数都是为金融服务、电信、制造、医疗和政府等从事数据库相关的开发工作。对于易博龙来说，如果能够将这些开发人员成功转换为易博龙的忠实用户，那么对于它的数据库软件销售来说，好处自然是不言而喻的。<br/><br/>　　此外，由于应用程序不同，数据库平台也多种多样，许多企业在生产率和资源方面面临越来越多的问题。但如果易博龙能够成功地将CodeGear的全部产品整合到自己现有的产品线中，那么它就能够为自己的客户提供一套集成的产品组合，用于设计、开发、管理和优化异质应用程序及其数据库。<br/><br/>　　CodeGear的全球营销渠道也非常健全，并购能够让易博龙自己的产品迅速进入全球数百万软件开发人员、设计师、独立软件提供商和数据库专业人士的视线之内。已经有分析家预测，如果并购消化顺利，那么将会成就一个年收入超过1亿美元，在全球拥有超过1500万用户，拥有高达10%的年利润增长率的全球最大的平台独立软件供应商。<br/><br/>　　不过此次并购背后的资本推手也值得我们注意，因为易博龙的东家Thoma Cressey Bravo公司是一家相当知名的私人股权投资公司。这家公司在“行业合并”或“发展和收购”上有相当丰富的实战经验，它目前通过一系列的私人股权基金，管理近20亿美元的股权资本。在软件行业，这家公司已完成34次收购，其年收入总额超过5亿美元。而此次并购就是在这家公司的授意下完成的。<br/><br/>　　因此，在这场资本游戏中，Delphi、JBuilder等这些我们熟知的软件未来的命运究竟如何，依然未知。毕竟利益和财富才是投资公司最关注的结果，至于技术的发展，对它们而言，跟其它他任何创造财富的工具没有什么区别。<br/>Tags - <a href="http://www.xcopy.net.cn/go.php/tags/delphi/" rel="tag">delphi</a>
]]>
</description>
</item><item>
<link>http://www.xcopy.net.cn/read.php/381.htm</link>
<title><![CDATA[javamail  例子 详解]]></title> 
<author>wg &lt;&gt;</author>
<category><![CDATA[JAVA相关]]></category>
<pubDate>Mon, 07 Jul 2008 08:00:46 +0000</pubDate> 
<guid>http://www.xcopy.net.cn/read.php/381.htm</guid> 
<description>
<![CDATA[ 
	本文档分三个部分，第一部分简要简单介绍了JavaMail，第二部分用一个完整的JavaMail的实例（API）详解javamail，<br/>最后写测试javamail API的例子和两个使用javamail中的重要技术，一个是介绍如何用velocity构建javamail的模板，<br/>一个是如何读取properties文件。<br/><br/><br/><strong>javamail 简介：</strong><br/>&nbsp;&nbsp; JavaMail是Sun发布的用来处理email的API。它可以方便地执行一些常用的邮件传输。 <br/><br/>　　虽然JavaMail是Sun的API之一，但它目前还没有被加在标准的java开发工具包中<br/>（Java Development Kit），这就意味着你在使用前必须另外下载JavaMail文件。除此以外，<br/>你还需要有Sun的JavaBeans Activation Framework （JAF）。JavaBeans Activation Framework<br/>的运行很复杂，在这里简单的说就是JavaMail的运行必须得依赖于它的支持。在Windows 2000下<br/>使用需要指定这些文件的路径，在其它的操作系统上也类似。 <br/><br/><br/>Java Mail API是Java对电子邮件处理的延伸，它提供和通讯协定无关的 Java解决方案，<br/>可以处理各种email格式，包括IMAP、POP、SMTP，以及MI ME，和其他和Internet相关的讯息通讯协<br/><br/><img src="http://www.xcopy.net.cn/template/XcopyStyle/images/viewimage.gif" alt=""/><a href="http://www.xcopy.net.cn/attachment.php?fid=281" target="_blank">点击在新窗口中浏览此图片</a><br/><a href="http://www.xcopy.net.cn/attachment.php?fid=281" target="_blank">http://www.xcopy.net.cn/at...</a><br/><br/><br/>javamail API实例：<br/>&nbsp;&nbsp;&nbsp;&nbsp;在写实例前&nbsp;&nbsp;我们需要载两个jar包，一个是javamail.jar和activation.jar，这里有个要说明下，<br/>如果你用的是jdk1.6的版本，那么可以不用activation.jar，如果是jdk1.6一下的版本要用activation.jar，<br/>因为jdk1.6集成了activation.jar。 你可以到&nbsp;&nbsp;http://java.sun.com/products/javamail/downloads/index.html 去下载<br/>&nbsp;&nbsp;&nbsp;&nbsp;说了那么多&nbsp;&nbsp;下面就是我们的具体javamail的代码了&nbsp;&nbsp;SendMail.java<br/><br/>import org.apache.velocity.Template;<br/>import org.apache.velocity.VelocityContext;<br/>import org.apache.velocity.app.VelocityEngine;<br/>import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;<br/><br/>import javax.activation.DataHandler;<br/>import javax.activation.FileDataSource;<br/>import javax.mail.*;<br/>import javax.mail.internet.InternetAddress;<br/>import javax.mail.internet.MimeBodyPart;<br/>import javax.mail.internet.MimeMessage;<br/>import javax.mail.internet.MimeMultipart;<br/>import java.io.StringWriter;<br/>import java.util.Iterator;<br/>import java.util.Map;<br/>import java.util.Properties;<br/><br/><br/>class SendMail &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;private MimeMessage mimeMsg;&nbsp;&nbsp;&nbsp;&nbsp; //MIME邮件对象<br/>&nbsp;&nbsp;&nbsp;&nbsp;private Session session;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //邮件会话对象 <br/>&nbsp;&nbsp;&nbsp;&nbsp;private Properties props;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//系统属性<br/>&nbsp;&nbsp;&nbsp;&nbsp;private boolean needAuth = false;&nbsp;&nbsp; //smtp是否需要认证 <br/>&nbsp;&nbsp;&nbsp;&nbsp;private String username = &quot;&quot;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //smtp认证用户名和密码 <br/>&nbsp;&nbsp;&nbsp;&nbsp;private String password = &quot;&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;private String agentIp = &quot;&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;private String agentPort = &quot;&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;private Multipart mp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;private static final String CHAR_SET = &quot;UTF-8&quot;;&nbsp;&nbsp;&nbsp;&nbsp; //Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成MimeMessage对象<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public SendMail() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * this construct has no agent<br/>&nbsp;&nbsp;&nbsp;&nbsp; *<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param smtp<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public SendMail(String smtp) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setSmtpHost(smtp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createMimeMessage();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * this construct has agent<br/>&nbsp;&nbsp;&nbsp;&nbsp; *<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param smtp<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param agentIp<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param agentPort<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public SendMail(String smtp, String agentIp, String agentPort) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.agentIp = agentIp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.agentPort = agentPort;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setSmtpHost(smtp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createMimeMessage();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * it is set the hostName<br/>&nbsp;&nbsp;&nbsp;&nbsp; *<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param hostName String<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void setSmtpHost(String hostName) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (props == null)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;props = System.getProperties();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获得系统属性对象<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;props.put(&quot;mail.smtp.host&quot;, hostName);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置SMTP主机<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (null != this.agentIp &amp;&amp; this.agentIp.length() != 0 &amp;&amp; !this.agentIp.equals(&quot;0&quot;)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;props.put(&quot;http.proxyHost&quot;, this.agentIp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (null != this.agentPort &amp;&amp; this.agentPort.length() != 0 &amp;&amp; !this.agentPort.equals(&quot;0&quot;)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;props.put(&quot;http.proxyPort&quot;, this.agentPort);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * creete MIME mail object<br/>&nbsp;&nbsp;&nbsp;&nbsp; *<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @return boolean<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public boolean createMimeMessage() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session = Session.getDefaultInstance(props, null);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获得邮件会话对象<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (Exception e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mimeMsg = new MimeMessage(session);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建MIME邮件对象<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mp = new MimeMultipart();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (Exception e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(&quot;create MIME mail object failure&quot; + e);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * set identity of tsmtp validation<br/>&nbsp;&nbsp;&nbsp;&nbsp; *<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param needAuth boolean<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void setNeedAuth(boolean needAuth) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (props == null) props = System.getProperties();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (needAuth) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;props.put(&quot;mail.smtp.auth&quot;, &quot;true&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;props.put(&quot;mail.smtp.auth&quot;, &quot;false&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * set user name and password<br/>&nbsp;&nbsp;&nbsp;&nbsp; *<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param name boolean<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param pass boolean<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void setNamePass(String name, String pass) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;username = name;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;password = pass;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * set subject of mail<br/>&nbsp;&nbsp;&nbsp;&nbsp; *<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param subject<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @return boolean<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public boolean setSubject(String subject) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mimeMsg.setSubject(subject);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (Exception e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(&quot;set mail subject is error &quot; + e);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * set the content of mail，the charset of content shoule be UTF-8<br/>&nbsp;&nbsp;&nbsp;&nbsp; *<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param body<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @return boolean<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public boolean setBody(String body) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BodyPart bp = new MimeBodyPart();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bp.setContent(&quot;&quot; + body, &quot;text/html;charset=&quot; + CHAR_SET);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mp.addBodyPart(bp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (Exception e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(&quot;set mail body is error&quot; + e);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * add the attachments, &quot;filePath&quot; should be real local path of a file<br/>&nbsp;&nbsp;&nbsp;&nbsp; *<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param filePath<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @return boolean<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public boolean addFileAffix(String filePath) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BodyPart bp = new MimeBodyPart();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileDataSource fileds = new FileDataSource(filePath);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bp.setDataHandler(new DataHandler(fileds));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bp.setFileName(fileds.getName());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mp.addBodyPart(bp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (Exception e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(&quot;Affix&quot; + filePath + &quot;accour error&quot; + e);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * set the from of mail<br/>&nbsp;&nbsp;&nbsp;&nbsp; *<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param from<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @return boolean<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public boolean setFrom(String from) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mimeMsg.setFrom(new InternetAddress(from));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (Exception e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;set sender is error&quot; + e);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * set the send to of mail<br/>&nbsp;&nbsp;&nbsp;&nbsp; *<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param to<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @return boolean<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public boolean setTo(String to) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (to == null) return false;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mimeMsg.setRecipients(Message.RecipientType.TO, (Address[]) InternetAddress.parse(to));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (Exception e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;reciever&#039;s address is error&quot; + e);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * set the copy to of mail<br/>&nbsp;&nbsp;&nbsp;&nbsp; *<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param copyto<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @return boolean<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public boolean setCopyTo(String copyto) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (copyto == null) return false;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mimeMsg.setRecipients(Message.RecipientType.CC, (Address[]) InternetAddress.parse(copyto));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (Exception e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * set the bcc of mail<br/>&nbsp;&nbsp;&nbsp;&nbsp; *<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param bccto<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @return boolean<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public boolean setBccTo(String bccto) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (bccto == null) return false;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mimeMsg.setRecipients(Message.RecipientType.BCC, (Address[]) InternetAddress.parse(bccto));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (Exception e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * put the mail send out<br/>&nbsp;&nbsp;&nbsp;&nbsp; *<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @return boolean<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public boolean sendout() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mimeMsg.setContent(mp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mimeMsg.saveChanges();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session mailSession = Session.getInstance(props, null);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transport transport = mailSession.getTransport(&quot;smtp&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transport.connect((String) props.get(&quot;mail.smtp.host&quot;), username, password);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transport.sendMessage(mimeMsg, mimeMsg.getAllRecipients());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transport.close();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (Exception e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(&quot;send fail&#92;r&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(e + &quot;&#92;r&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><strong><br/>那么我们的API就写完了，下面是几点要重要说明的<br/>1.一定是创建Session。</strong><br/>如果，你是发送邮件那么 接下来你需要创建你要发送的邮件，也就是一个 message对象。<br/><br/>现在的message对象好像一张白纸，现在就需要我们来添加内容啦message.setContent()可以帮你搞定。<br/><br/>然后我们需要写“信封” message.setFrom(); message.addRecipient();...<br/><br/><br/>哈哈，都搞定了，然后就可以寄出去了<br/>Transport transport = session.getTransport(&quot;smtp&quot;);<br/>transport.sendMessage(message, message.getAllRecipients());<br/>transport.close();<br/><br/>好了，邮件发送完成了：），嘻嘻当然，这里有些过于乐观了，在发送的过程中我们还有遇到其它一些问题，<br/>比如，认证，地址等。下面就JavaMail几个重要的类进行一下介绍<br/><strong><br/>首先是session类：<br/></strong><br/>Session 定义了一个基本的邮件会话，任何工作都是基于这个Session的。Session 对象需要一个 <br/>java.util.Properties 对象来得到类似 邮件服务器，用户名，密码这样的信息。<br/> <br/> Session 的构造函数是私有的，你可以通过 getDefaultInstance() 方法来取得一个单一的可以被共享的默认session 如：<br/><br/>&nbsp;&nbsp;Properties props = new Properties();<br/>&nbsp;&nbsp;// 填写一些信息<br/>&nbsp;&nbsp;Session session = Session.getDefaultInstance(props,null);<br/><br/> 或者，你可以使用 getInstance() 方法来创建一个唯一的 session如：<br/><br/>&nbsp;&nbsp;Properties props = new Properties();<br/>&nbsp;&nbsp;// 填写一些信息<br/>&nbsp;&nbsp;Session session = Session.getInstance(props,null);<br/> <br/> 在这两种方法中 其中的 null 参数是一个 Authenticator 对象，在这里没有被使用的，所以就是null<br/> <br/> 在大多数案例中，使用一个共享session 已经做够了。<br/><br/><strong>Message类</strong><br/><br/>一旦你创建了Session对象，那么下面要做的就是创建 message 来发送。Message 是一个抽象类，在大部分应用中你可以使用它的子类 javax.mail.internet.MimeMessage 。MimeMessage 是一个理解在不同RFCs中定义的MIME类型以及headers的e-mail message 。 Message headers 必须使用 US-ASCII 字符集。<br/><br/> 可以用如下的方法创建一个 Message <br/>&nbsp;&nbsp;MimeMessage message = new MimeMessage(session);<br/> 我们注意到，这里需要用session对象作为构造函数的参数。当然，还有其它的构造函数，比如从用RFC822格式化过的输入流来创建message。<br/><br/> 一旦你得到了 message ,你就可以来设置它的各个部分（parts）。设置内容（content）的基本的机制是使用setContent() 方法。<br/><br/>&nbsp;&nbsp;message.setContent(&quot;Email Content. &quot;,&quot;text/plain&quot;);<br/><br/> 如果，你能够明确你的使用MimeMessage来创建message 并且只是使用普通的文本（plain text） 那么你也可以使用 setText() 方法，setTest()方法只需要设置具体的内容，它默认的MIME类型是 text/plain<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;message.setText(&quot;Email Content. &quot;);<br/> <br/> 对于普通文本类型的邮件，有一种机制是首选（ message.setText(&quot;Email Content. &quot;)）的设置内容的方法。如果要创建其它类型的message ，比如　HTML类型的message&nbsp;&nbsp;那么还是需要使用前者　（　message.setContent(&quot;Email Content. &quot;,&quot;text/html&quot;);　）<br/><br/> 设置主题（subject ），使用setSubject() 方法<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;message.setSubject(&quot; Subject &quot;);<br/><br/><br/><strong>Address 类</strong><br/><br/>当你已经创建了Session 以及 Message，并且已经为message 填充了内容，那么接下来要做的就是给你的邮件添加一个地址（Address）。　就像Message一样，Address也是一个抽象类，我们可以使用它的一个子类javax.mail.internet.InternetAddress　。<br/><br/> 创建一个地址非常简单<br/><br/>&nbsp;&nbsp;Address address = new InternetAddress(&quot;suixin@asiainfo.com&quot;);<br/><br/> 如果，你希望在出现邮件地址的地方出现一个名称，那么你只需要再多传递一个参数。<br/><br/>&nbsp;&nbsp;Address address = new InternetAddress(&quot;suixin@asiainfo.com&quot;,&quot;Steve&quot;);<br/><br/><br/> 你需要为 message 的from以及 to 字段创建address对象。为了识别发送者，你需要使用setFrom() 和 setReplyTo() 方法。<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;messge.setFrom(address);<br/><br/> 如果你的message 需要显示多个 from 地址，可以使用 addFrom() 方法<br/><br/>&nbsp;&nbsp;Address address[] = &#123;....&#125;;<br/>&nbsp;&nbsp;message.addFrom(address);<br/><br/> 为了辨识message 的收件人，你需要使用 setRecipient() 方法。这个方法除了address参数之外，还需要一个Message.RecipientType 。<br/><br/>&nbsp;&nbsp;message.addRecipient(type,address);<br/><br/> Message.RecipientType有几个预先定义好的类型<br/> <br/> Message.RecipientType.TO　　收件人<br/> Message.RecipientType.CC　　抄送<br/> Message.RecipientType.BCC　 暗送<br/><br/> 如果你的一封邮件，需要发送给你的老师，并还要给你的几个同学，那么你可以这样<br/><br/> Address toAddress = new InternetAddress(&quot;teacher@17288.com&quot;);<br/> Address[] ccAddress = &#123;new InternetAddress(&quot;schoolmate1@17288.com&quot;),new InternetAddress(&quot;schoolmate2@17288.com&quot;)&#125;;<br/><br/> message.addRecipient(Message.RecipientType.To, toAddress);<br/> message.addRecipient(Message.RecipientType.CC, ccAddress);<br/> <br/> JavaMail 没有提供电子邮件地址有效性的检测。这些超越了JavaMail API的范围。<br/><br/><br/><strong>Authenticator 类<br/><br/></strong><br/>通过Authenticator设置用户名、密码，来访问受保护的资源，这里的资源一般指的是邮件服务器。<br/> <br/> Authenticator也是一个抽象类，你需要自己编写子类已备应用。你需要实现getPasswordAuthentication()方法，并返回一个PasswordAuthentication实例。你必须在 session被创建时， 注册你的 Authenticator。这样，当需要进行认证是，你的Authenticator就可以被得到。<br/><br/>&nbsp;&nbsp;Properties props = new Properties();<br/>&nbsp;&nbsp;//设置属性<br/>&nbsp;&nbsp;Authenticator auth = new YourAuthenticator();<br/>&nbsp;&nbsp;Session session = Session.getDefaultInstance(props, auth);<br/><br/>Transport 类：<br/><br/> 发送消息最后的一步就是使用Transport类，你可以通过两种方法来进行发送。<br/> Transport 是一个抽象类，你可以调用它静态的send() 方法来发送<br/><br/>&nbsp;&nbsp;Transport.send(message);<br/><br/> 或者，你可以为你使用的协议从session中取得一个指定的实例，<br/><br/>&nbsp;&nbsp;Transport transport = session.getTransport(&quot;smtp&quot;);<br/>&nbsp;&nbsp;transport.sendMessage(message, message.getAllRecipients());<br/>&nbsp;&nbsp;transport.close();<br/><br/>下面我们写一个测试类，来测试我们上面的方法<br/><br/><strong>TestSendMail.java</strong><br/><br/>import java.util.Properties;<br/>import java.io.InputStream;<br/><br/>/**<br/> *<br/> *To test send mail with tamplate<br/> */<br/>public class TestSendMail &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Properties pro = new Properties();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream is = TestSendMail.class.getClassLoader().getResourceAsStream(&quot;mail.properties&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pro.load(is);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMail themail = new SendMail(pro.getProperty(&quot;mail.smtp&quot;), pro.getProperty(&quot;mail.agentIp&quot;), pro.getProperty(&quot;mail.agentPort&quot;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;themail.setNeedAuth(true);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;themail.setNamePass(pro.getProperty(&quot;mail.name&quot;), pro.getProperty(&quot;mail.password&quot;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(null != pro.getProperty(&quot;mail.subject&quot;).toString() &amp;&amp; pro.getProperty(&quot;mail.subject&quot;).toString() != &quot;&quot;)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;themail.setSubject(pro.getProperty(&quot;mail.subject&quot;).toString());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(null != pro.getProperty(&quot;mail.content&quot;).toString() &amp;&amp; pro.getProperty(&quot;mail.content&quot;).toString() != &quot;&quot;)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; themail.setBody(pro.getProperty(&quot;mail.content&quot;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(null != pro.getProperty(&quot;mail.from&quot;).toString() &amp;&amp; pro.getProperty(&quot;mail.from&quot;).toString() != &quot;&quot;)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; themail.setFrom(pro.getProperty(&quot;mail.from&quot;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(null != pro.getProperty(&quot;mail.to&quot;).toString() &amp;&amp; pro.getProperty(&quot;mail.to&quot;).toString() != &quot;&quot;)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; themail.setTo(pro.getProperty(&quot;mail.to&quot;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(null != pro.getProperty(&quot;mail.cc&quot;).toString() &amp;&amp; pro.getProperty(&quot;mail.cc&quot;).toString() != &quot;&quot;)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; themail.setCopyTo(pro.getProperty(&quot;mail.cc&quot;).toString());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(null != pro.getProperty(&quot;mail.bcc&quot;).toString() &amp;&amp; pro.getProperty(&quot;mail.bcc&quot;).toString() != &quot;&quot;)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; themail.setBccTo(pro.getProperty(&quot;mail.bcc&quot;).toString());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(null != pro.getProperty(&quot;mail.affixFile&quot;))&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; themail.addFileAffix(pro.getProperty(&quot;mail.affixFile&quot;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;themail.sendout();<br/>&nbsp;&nbsp;&#125;<br/>&#125;<br/><br/>注意为了方便我们把数据都放在一个perproties文件里的，mail.properties这个文件你可以放在任意编译路径下，都可以读到<br/><strong><br/>下面是perproties的内容</strong><br/><br/>mail.smtp = mail.google.com&nbsp;&nbsp;//mail的服务<br/>mail.name = servicetest&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//邮件的用户名<br/>mail.password = testservice&nbsp;&nbsp;//邮件的密码<br/>mail.agentIp = 10.0.1.8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//代理服务器的Ip<br/>mail.agentPort = 8080&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//代理服务器的端口号<br/>mail.from = timoth.wang@dextrys.com&nbsp;&nbsp;&nbsp;&nbsp; // 邮件发送者<br/>mail.to = timoth.wang@dextrys.com&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 邮件接收者 <br/>mail.cc = andy.zhao@dextrys.com ,lexy.chen@dextrys.com , wg1191@163.com&nbsp;&nbsp;//抄送<br/>mail.bcc = steven.lv@dextrys.com&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//暗送<br/>mail.subject = this is the subject&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//主题<br/>mail.affixFile = D:&#92;&#92;wg&#92;&#92;test.css&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//附件的路径和文件名<br/>mail.content = &lt;a href=http://www.google.com&gt;google&lt;/a&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //邮件内容<br/><br/>下面将介绍怎样用邮件模板发邮件<br/>我们用velocity这个优秀的框架来实现我们的mail模板<br/>下面我们对velocity 做个简单的认识<br/><br/>Velocity是一个基于java的模板引擎（template engine）。它允许任何人仅仅简单的使用模板语言<br/>（template language）来引用由java代码定义的对象。<br/>当Velocity应用于web开发时，界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点，<br/>也就是说，页面设计人员可以只关注页面的显示效果，而由java程序开发人员关注业务逻辑编码。<br/>Velocity将java代码从web页面中分离出来，这样为web站点的长期维护提供了便利，同时也为我们在JSP和PHP之<br/>外又提供了一种可选的方案。<br/><br/>想了解更多，建议去googl一下，因为我们的主要目的是javamail<br/>那好，我们就开始我们的javamail模板之旅吧<br/>首先我们要下载一个velocity的Jar包才能支持velocity框架&nbsp;&nbsp;大家可以到这里下 http://velocity.apache.org/download.cgi<br/>建议下1.5版本的<br/><br/>OK ，那么既然是模板我们就先设计一下我们的邮件模板吧，velocity所以的模板是一.vm作为后缀名的&nbsp;&nbsp;所以我们的mailTemplate.vm<br/>就是我们的模板文件吧&nbsp;&nbsp;下面是内容：<br/><br/>&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;<br/>&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;<br/>&nbsp;&nbsp;&lt;head&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;vehicle ceo&lt;/title&gt;<br/><br/><br/>&nbsp;&nbsp;&lt;/head&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;body&nbsp;&nbsp;&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; Hi&nbsp;&nbsp;$to <br/> <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Welcome to&nbsp;&nbsp;$site&nbsp;&nbsp;<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $content&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $test&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from $from&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&lt;body &gt;<br/>&lt;/html&gt;<br/><br/>你可以在里面任意设计&nbsp;&nbsp; 如果是变量 那么用$+变量名&nbsp;&nbsp;这个可以通过后台传进来实现动态交互。<br/>摸版我们已经设计好了&nbsp;&nbsp;那么下面我们来写一个用摸版的方法吧<br/><br/>其实就一个方法而已 ， 你可以把这个方法加在前面的SendMial.java类里<br/><br/> /**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * get mail content with template.&nbsp;&nbsp;the keys in the map should relative to the variable that define in the<br/>&nbsp;&nbsp;&nbsp;&nbsp; * body of vm file<br/>&nbsp;&nbsp;&nbsp;&nbsp; *<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param templateName this is a vm file , the template style in it<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param map&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the map you can set the variable in it according you need<br/>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return StringWriter&nbsp;&nbsp; the mail body in it<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public String getMailContentWithTemplate(String templateName, Map map) throws Exception &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VelocityEngine ve = new VelocityEngine();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ve.setProperty(&quot;file.resource.loader.class&quot;, ClasspathResourceLoader.class.getName());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ve.init();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*　next, get the Template　*/<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Template t = ve.getTemplate(templateName, &quot;utf-8&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*　create a context and add data */<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VelocityContext context = new VelocityContext();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator keys = map.keySet().iterator();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (keys.hasNext()) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String key = keys.next().toString();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.put(key, map.get(key));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringWriter writer = new StringWriter();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.merge(context, writer);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return writer.toString();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>这个方法的两个参数比较重要 templateName 是.vm文件的名字，map这是用户可以自定义的，要注意map里的key要和.vm文件里的变量相对应<br/>具体看下面的测试类<br/><br/>那么下面就是一个对发邮件模板的测试啦&nbsp;&nbsp;TestTamplate.java<br/><br/>import java.util.Properties;<br/>import java.util.Map;<br/>import java.util.HashMap;<br/>import java.io.InputStream;<br/>import java.io.StringWriter;<br/><br/>/**<br/> * To test send mail with tamplate<br/> */<br/>public class TestTamplate &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String args[]) throws Exception &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Properties pro = new Properties();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream is = TestTamplate.class.getClassLoader().getResourceAsStream(&quot;mail.properties&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pro.load(is);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMail themail = new SendMail(pro.getProperty(&quot;mail.smtp&quot;), pro.getProperty(&quot;mail.agentIp&quot;), pro.getProperty(&quot;mail.agentPort&quot;));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map map = new HashMap();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(&quot;to&quot;, &quot;andy.zhao@suzsoft.com&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(&quot;site&quot;, &quot;vehicle&nbsp;&nbsp;CEO&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(&quot;test&quot;, &quot;this is a test，中文&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(&quot;content&quot;, &quot;&lt;a href=&#92;&quot;http://www.google.cn&#92;&quot;&gt;aaa&lt;/a&gt;&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(&quot;from&quot;, &quot;eric&quot;);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String writer = themail.getMailContentWithTemplate((&quot;mailTemplate.vm&quot;), map);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;themail.setNeedAuth(true);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;themail.setNamePass(pro.getProperty(&quot;mail.name&quot;), pro.getProperty(&quot;mail.password&quot;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;themail.setTo(pro.getProperty(&quot;mail.to&quot;).toString());<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (null != pro.getProperty(&quot;mail.cc&quot;).toString() &amp;&amp; pro.getProperty(&quot;mail.cc&quot;).toString() != &quot;&quot;) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;themail.setCopyTo(pro.getProperty(&quot;mail.cc&quot;).toString());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (null != pro.getProperty(&quot;mail.bcc&quot;).toString() &amp;&amp; pro.getProperty(&quot;mail.bcc&quot;).toString() != &quot;&quot;) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;themail.setBccTo(pro.getProperty(&quot;mail.bcc&quot;).toString());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (null != pro.getProperty(&quot;mail.subject&quot;).toString() &amp;&amp; pro.getProperty(&quot;mail.subject&quot;).toString() != &quot;&quot;) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;themail.setSubject(pro.getProperty(&quot;mail.subject&quot;).toString());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;themail.setBody(writer);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (null != pro.getProperty(&quot;mail.from&quot;) &amp;&amp; pro.getProperty(&quot;mail.from&quot;) != &quot;&quot;) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;themail.setFrom(pro.getProperty(&quot;mail.from&quot;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (null != pro.getProperty(&quot;mail.affixFile&quot;)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;themail.addFileAffix(pro.getProperty(&quot;mail.affixFile&quot;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;themail.sendout();<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/><br/>OK，这就是关于javamail常用的一些技术，我在网上也看了很多，我相信我这个绝对是最全的 ，嘿嘿<br/><br/><br/>Tags - <a href="http://www.xcopy.net.cn/go.php/tags/javamail/" rel="tag">javamail</a> , <a href="http://www.xcopy.net.cn/go.php/tags/%25E4%25BE%258B%25E5%25AD%2590/" rel="tag">例子</a> , <a href="http://www.xcopy.net.cn/go.php/tags/velocity/" rel="tag">velocity</a> , <a href="http://www.xcopy.net.cn/go.php/tags/%25E8%25AF%25BBproperties%25E6%2596%2587%25E4%25BB%25B6%25E9%2582%25AE%25E4%25BB%25B6/" rel="tag">读properties文件邮件</a>
]]>
</description>
</item><item>
<link>http://www.xcopy.net.cn/read.php/380.htm</link>
<title><![CDATA[2008年全国县域经济百强县揭晓 江苏江阴排第一]]></title> 
<author>admin &lt;quan.zhao@yahoo.com.cn&gt;</author>
<category><![CDATA[乱七糟八]]></category>
<pubDate>Mon, 07 Jul 2008 04:17:31 +0000</pubDate> 
<guid>http://www.xcopy.net.cn/read.php/380.htm</guid> 
<description>
<![CDATA[ 
	<a href="http://www.xcopy.net.cn/attachment.php?fid=280" target="_blank"><img src="http://www.xcopy.net.cn/attachment.php?fid=280" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a>
]]>
</description>
</item>
</channel>
</rss>