IIS URL重写组件ISAPI_Rewrite3_0087 full版破解 .

  IIS URL重写组件ISAPI_Rewrite是个很好用的东东,可惜Lite版功能有限制,只能全局应用,不能针对某个站点来设置。Full版没有此限制,我找到了ISAPI_Rewrite3_0087这个版本的破解文件,经本人实测,可以使用。

  ISAPI_Rewrite3_0087破解下载地址:http://www.biglee.cn/file/ISAPI_Rewrite3_0087cr.rar

第一步:下载官方原版,地址:http://www.helicontech.com/download/isapi_rewrite/ISAPI_Rewrite3_0087.msi

在根目录的httpd.conf 用文本编辑器打开编辑,写上:

RegistrationName= WWWWANG_Panda
RegistrationCode= 2EAD-35GH-66NN-ZYBA

保存。

第二步:把破解文件压缩包里的两个Dll文件覆盖到安装根目录

  破解完成!

  在要实现静态重写的网站根目录下放入.htaccess文件,在.htaccess里写网站的静态规则,即可。

使用Namecheap FreeDNS免费的DNS解析服务教程

  由于需要URL转发等一些国内域名服务商不提供的域名解析服务,就需要寻找第三方的域名解析服务(即DNS服务)。经过查找与试用,我觉得Namecheap FreeDNS服务比较不错,免费且功能齐全,解析速度也挺快的。由于Namecheap的网站是英文的,可能有些朋友不知道如何使用,现将使用教程简单地写一下,供需要的朋友参考。

  先到https://www.namecheap.com/myaccount/signup.aspx注册一个账号,填写项目有:Username(用户名)、Password(密码)、Confirm Password(确认密码)、First Name(名)、Last Name(姓)和Email。填写完毕后点击Create Account 按钮即可注册完成。

  登录账号(在页面顶部导航栏上方有登录框)后点击菜单PRODUCTS下的Free DNS或者直接访问https://www.namecheap.com/products/freedns.aspx,输入要使用免费 DNS 服务的域名(不带www,如:biglee.cn)

  然后点 Get DNS 按钮,之后就会进入一个确认页面,检查域名无误后点击“Add DNS Service for Selected Domains”按钮,不出意外的话就会提示你添加成功,并且给出了你将要设置的DNS服务器的域名(freedns1.registrar-servers.com、freedns2.registrar-servers.com、freedns3.registrar-servers.com、freedns4.registrar-servers.com、freedns5.registrar-servers.com)。点击OK! Go to the Hosted Domains Page进入域名管理页面,就能看到你添加的域名。

  点击域名进入解析设置页面。如果尚未修改域名的DNS服务器记录,这里会显示无效:Current DNS Status: INACTIVE,并提醒你修改DNS服务器。为了使域名快速生效,还要进行邮箱验证,点击select authorization email,会弹出一个窗口,上面有几个该域名下的邮箱地址(排在左侧)及从Whois信息里获取到的域名所有人邮箱地址(列在右侧),可以选择一个你能收到信的邮箱地址。如果无法从Whois信息里获取邮箱地址信息且你的域名还未建有相关邮箱,那只能等建立好邮箱(不知能否用Namecheap FreeDNS里的邮件转发功能来收信,未做测试,测试过的朋友烦请告知,谢谢)后再验证。

  域名解析设置非常地简单,填写好 HOST NAME(即主机头名或者二级域名,空主机头和www主机头两条记录它已经单独列出来),在 IP ADDRESS/ URL这栏填写好IP地址或者别名,同时选择记录类型(RECORD TYPE),然后点Save Changes按钮保存。如果有好多二级域名记录,一次写不下的话,你保存完后会自动新增5个空白记录。

  Email的MX记录设置有个地方要注意,一般我们都是用的企业邮箱,勾选第三项 User中的第一项I will specify my own MX records(如果用的Google企业邮箱套件请选第三项,会自动配置),保存后才会出现MX记录填写框,填写好相关数据,保存即可。

  特别提醒:如果你的域名正在使用中,那么为了无缝转移解析,要先在Namecheap FreeDNS里做好相关解析再改你域名的DNS服务器记录。

  已经添加的域名,登录管理的路径为:菜单MY ACCOUNT> Manage Domains,点击左侧导航的FreeDNS下的Hosted Domains就能进入域名管理列表。

  另,这里还有动态域名解析服务(Dynamic DNS),我还没试用,等有机会试用了再写个教程。

  

pjblog升级到3.2.9.518后友情链接页面无数据的解决方法

  前不久得空将博客程序升级到了V3.2.9.518版,今天和一网友交换友情链接时发现友情链接的更多页面里所有友情链接都消失了,只剩下一个友情链接申请提交表单。

  正好有点时间,于是分析了下程序和数据库,找到了问题的所在。

  先看BlogLink.asp的51行:server.Execute("post/link.html"),查看post/link.html文件,发现内容为空,这是直接原因。

  再看生成post/link.html文件的程序代码,是control/f_control.asp里的258行开始的这个Sub PostLink()。对应数据库表结构,可知这个代码是先读取友情链接分类,然后再按分类读取友情链接信息,然而我发现友情链接表里的分类ID都为0,也就是未分类,因此程序最终没有读取到任何信息。

  解决办法有两个,一个就是去后台将所有的友情链接分类。这是最简单的方法。

  还有一个办法就是修改程序,将未分类的友情链接也读取出来。之前一直未注意,不知道上一个版本有没有这样的问题,有的话也是类似的修改方法。附修改后的Sub PostLink()代码如下:

Sub PostLink()
     Dim LoadTemplate, Temp, SaveArticle
  Dim Link_SplitArray, Link_Global_Temp, Link_Layout_Temp, LinkClassTemp, LinkTemp, AllTemp
     LoadTemplate = LoadFromFile("Template/Link.asp")
     If LoadTemplate(0) = 0 Then '读取成功后写入信息
         Temp = LoadTemplate(1)
   Link_SplitArray = Split(Temp, "<#ST(B)#>")
   Link_Global_Temp = Link_SplitArray(1)
   Link_Layout_Temp = Link_SplitArray(2)
         Dim blog_Links
         Set blog_Links = conn.Execute("Select * From blog_LinkClass order by LinkClass_Order asc")
   AllTemp = ""
         Do Until blog_Links.EOF
             LinkClassTemp = Link_Global_Temp
    LinkTemp = Link_Layout_Temp
    Dim LinkSingContent
    LinkSingContent = GetLinkSingleHtml(LinkTemp, Trim(blog_Links("LinkClass_ID")), 3)
    If Len(LinkSingContent) > 0 Then
     LinkClassTemp = Replace(LinkClassTemp, "<$LinkClass_Name$>", Trim(blog_Links("LinkClass_Name")))
     LinkClassTemp = Replace(LinkClassTemp, "<$LinkClass_Title$>", Trim(blog_Links("LinkClass_Title")))
     LinkClassTemp = Replace(LinkClassTemp, "<$LoopLayout$>", LinkSingContent)
     AllTemp = AllTemp & LinkClassTemp
    End If
             blog_Links.movenext
         Loop
   LinkClassTemp = Link_Global_Temp
   LinkTemp = Link_Layout_Temp
   LinkSingContent = GetLinkSingleHtml(LinkTemp, 0, 3)
   If Len(LinkSingContent) > 0 Then
    LinkClassTemp = Replace(LinkClassTemp, "<$LinkClass_Name$>", "其它")
    LinkClassTemp = Replace(LinkClassTemp, "<$LinkClass_Title$>", "Orther")
    LinkClassTemp = Replace(LinkClassTemp, "<$LoopLayout$>", LinkSingContent)
    AllTemp = AllTemp & LinkClassTemp
   End If
         SaveArticle = SaveToFile(AllTemp, "post/link.html")
     End If
 End Sub

ubuntu desktop cd、server、alternate三个版本的区别

Newbies of Ubuntu/Kubuntu/Edubuntu will be confused by the name of her official released CDs – Desktop Live CD, Alternate CD and Server CD. Why she makes these different CDs?

Desktop Live CD
Live CD allows user to boot it from CD-ROM and experience the power of Linux. Live CD is a complete operating system that running from CD. You can use it for testing hardwares and/or softwares compatibilty. You can use it to taste the new version of the distribution. You can use it for internet kiosks or libraries.

You can install any software on the Live CD. Once you reboot or switch off, the change will be lost. Ubuntu Desktop Live CD provides the most common features to end-users, especially for newcomers. It is very easy to use and/or install. If you have no experience in Linux, you can install Ubuntu via the Live CD in a few steps. You can choose the default setting if you are in doubt. It requires more memory compare with Alternate CD.

In addition, you can install Ubuntu by Live CD on a Windows system via Wubi. Wubi allows you to install Ubuntu in Windows system as a file. You can uninstall it just like other Windows softwares.

Alternate CD
Unlike Live CD, Alternate CD is a text mode installer. It requires an experienced Linux user to operate. It provides more drivers, such as FakeRAID, software RAID and some other drivers and features. You can also choose LVM and encrytped directory too. It is more flexible and powerful compare with Live CD. The final product is a graphical desktop environment. It can install for a lesser memory machine, thanks to the text mode installer.

Server CD
It is a text mode installer and similar to Alternate CD. You can choose some common servers to install, such as LAMP, mail server, DNS, SQL server and File Server. The servers that you have chosen are almost configured but some of them need to be tuned for different usage. It is targeted to experienced Linux users. The final product is a command line environment.

Conclusion
Ubuntu makes 3 different CDs in order to keep it fit in a 700MB CD and targeted to different users. Although it may cause confusion, it is a good idea for different market and user.

-------------------------------------------

Desktop CD

The desktop CD allows you to try Ubuntu without changing your computer at all, and at your option to install it permanently later. This type of CD is what most people will want to use. You will need at least 192MB of RAM to install from this CD.

Server install CD

The server install CD allows you to install Ubuntu permanently on a computer.

Alternate install CD

The alternate install CD allows you to perform certain specialist installations of Ubuntu. It provides for the following situations:

* creating pre-configured OEM systems;
* setting up automated deployments;
* upgrading from older installations without network access;
* LVM and/or RAID partitioning;
* installs on systems with less than about 192MB of RAM.

 

 

 

----------------------------------------
鉴于选择ubuntu做server的不多

Live CD可以免安装体验 也可以用于网络诊断 比较方便
Live CD也可以用于在windows引导不了时做一些工作
Live CD还可以用于备份系统 还可以用于安装gentoo lfs等发行版
Live CD能干嘛 就看你的想象力了
实乃是居家旅行 走亲访友 杀人越货之必备良药

单纯的安装角度来看
alternate install cd是首选 占用资源小 兼容性好 速度快 定制性相对强

ubuntu 发布的linux里面有一个非常具有迷惑性的版本-desktop。因为有一套server,所以desktop很容易从字面上被理解成桌面版。而这样理解的人通常会弄不明白剩下那个alternate是什么东西。

其实desktop是Live CD的名字,也就是刻录在光盘上运行的Linux。是一套已经装好的系统。把它烧录到光盘上放进光驱就可以直接运行这套完整的linux。当然你也可以在运行之后把它“安装”到硬盘上,而这样的安装更像是一种拷贝或者还原,类似ghost。
真正意义上正统的安装版本则是alternate,它是由许多deb包组成的。可以详细的制定安装内容。是正宗的硬盘安装版。

这两个版本还有一些速度上的区别。
因为类似系统还原,desktop的安装速度较快。而alternate正式的安装相比之下会慢一些。
而运行的时候恰好相反:desktop因为是既成的,可能会缺少对应软件环境的适应性,所以和灵活指定及安装的alternate相比会慢一些。

desktopCD安装前可以看到基本界面和试用(liveCD功能),
alternate面向安装个性化需求更大的更专业一点点的用户.
desktop和alternate都有基本的软件包,要更多的软件包只要修改合适的源下载也是很快的.
desktop是一个live cd ,只用于桌面系统,也可以在LiveCD状态下安装。
alternate是标准的安装CD。包含了一些桌面程序,可以用高级安装模式安装,在安装时可以划分分区。也可以当作Server来用,不过一些Server 程序要自己通过网络来安装
Alternate安装过程会有高级分区以及grub安装选项,Desktop没有.
alternate既能安装desktop也能安装server
desktop是一个live cd ,在桌面环境里面 以向导的方式引导安装
live CD 就是把安装好的软件放到光盘中, 安装时就把其上的内容复制到硬盘再简单配置就行了。

alternate CD上放的DEB的软件包,安装时要解压、配置

只有在机子硬件配置很低时用 live CD安装较慢,其余都比alternate的要快。

--------------------------------------------

 

 

 

 

 

 
 

The Desktop CD Install installs from within a nice graphical interface, and I believe previously had no repository on the CD, it just copies the files across from the cd and eats up memory because it is running a live version as it installs. Excellent if you do not want to install via a menu driven intreface or a command line system.

The Alternative CD installs in a command line environment or menu driven interface, is easy to customize as you go along if you know what you are doing, making it easy to install on low system requirement and does not cause many of the failed installations as the Desktop CD. The alternative CD has a repository on the CD.

The Server CD does not install any desktop environment, such as kde or gnome, and installs a kernel that is less responsive to user inputs (via mouse or keyboard) and is more responsive to disk activity. IE it installs a slightly different kernel. With a server cd if you want a desktop you have to install it via the repositories by apt-get install ubuntu-desktop. The server cd has repository sources on the CD.

That I think are the main diffrences.

 

VideoShot.exe停止工作的解决办法

  正专心查找资料,突然接连冒出两个“VideoShot.exe停止工作”的错误提示,上网搜索了下,这个是迅雷的一个插件,有人说是视频下载完成后就会出这个错。这才想起来刚才应GF之请,在下载几集电视剧以备五一旅途消磨时间用,查看了下下载进度,正好有两集下载完成了。
  既然是视频下载完成后出这个错误提示,这插件应该是个视频预览插件。再看下迅雷,发现迅雷在下载完成后自动切换到下载完成列表,右边有个视频信息一栏,貌似就是预览视频的,但是由于出错了,没信息。那我去禁用或者删除这个插件好了,反正我又不想用迅雷这个预览功能。打开迅雷7,找了设置中心等各个角落也没找到插件管理的地方。
  该死的迅雷,好吧,我自己去你老巢把这个插件给揪出来。在迅雷安装目录搜索了下VideoShot.exe,果真在addinsVideoAddin目录中找到了它。直接删除的话,应该会有什么问题的,那我搜索下配置文件,看看能不能找到相关的信息,搜索包含字符串“VideoShot.exe”的文件,只找到一个unins000.dat,不应该是它,再搜索目录名:VideoAddin,这下找到了好几个文件。其中两个文件比较可疑,一个是Thunderaddins目录下的addins_cache.xml,一个是skindefault目录下的skin.xml。
  用记事本等文本编辑器打开addins_cache.xml,搜索字符串“VideoAddin”,找到了“&lt;addin name='VideoAddin' /&gt;”,删除掉,保存文件。
  再打开skin.xml,同样搜索字符串“VideoAddin”,先是找到一行这样的字符串:
  &lt;texture id=&quot;VideoAddin::texture.videoaddin.bgpanel.bg&quot; /&gt;
为了方便调试与恢复,我不删除,先注释掉,改为:
  &lt;!–&lt;texture id=&quot;VideoAddin::texture.videoaddin.bgpanel.bg&quot; /&gt;–&gt;
  继续搜索字符串“VideoAddin”,找到几行这样的字符串:
[quote]
视频信息面板
&lt;texture id=&quot;VideoAddin::texture.videoaddin.snap.bottompanel&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.videoaddin.line&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.videoaddin.bottompanel&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.viewsnapbtn.play.normal&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.viewsnapbtn.play.down&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.viewsnapbtn.play.hover&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.taskvideoinfo.reftabsbkg&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.viewsnapRightbtn.play.normal&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.viewsnapRightbtn.play.down&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.viewsnapRightbtn.play.hover&quot; /&gt;
&lt;bitmap id=&quot;VideoAddin::bitmap.taskvideoinfo.ExtendTabs.Splitter&quot; /&gt;
&lt;texture id=&quot;VideoAddin::VideoInfo.NineInOne.bkg&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.viewsnapRightbtn.play.disable&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.bkg.addBtn&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.videoInfo.AddNormal&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.videoInfo.AddHover&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.videoInfo.AddDown&quot; /&gt;
&lt;texture id=&quot;VideoAddin.TaskList.DapBtn.FluencyNormal&quot; /&gt;
&lt;texture id=&quot;VideoAddin.TaskList.DapBtn.FluencyHover&quot; /&gt;
&lt;texture id=&quot;VideoAddin.TaskList.DapBtn.FluencyDown&quot; /&gt;
[/quote]
  一看就知道是视频信息那栏一配置信息了,也给注释掉,改成:[quote]&lt;!–视频信息面板
&lt;texture id=&quot;VideoAddin::texture.videoaddin.snap.bottompanel&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.videoaddin.line&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.videoaddin.bottompanel&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.viewsnapbtn.play.normal&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.viewsnapbtn.play.down&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.viewsnapbtn.play.hover&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.taskvideoinfo.reftabsbkg&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.viewsnapRightbtn.play.normal&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.viewsnapRightbtn.play.down&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.viewsnapRightbtn.play.hover&quot; /&gt;
&lt;bitmap id=&quot;VideoAddin::bitmap.taskvideoinfo.ExtendTabs.Splitter&quot; /&gt;
&lt;texture id=&quot;VideoAddin::VideoInfo.NineInOne.bkg&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.viewsnapRightbtn.play.disable&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.bkg.addBtn&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.videoInfo.AddNormal&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.videoInfo.AddHover&quot; /&gt;
&lt;texture id=&quot;VideoAddin::texture.videoInfo.AddDown&quot; /&gt;
&lt;texture id=&quot;VideoAddin.TaskList.DapBtn.FluencyNormal&quot; /&gt;
&lt;texture id=&quot;VideoAddin.TaskList.DapBtn.FluencyHover&quot; /&gt;
&lt;texture id=&quot;VideoAddin.TaskList.DapBtn.FluencyDown&quot; /&gt;–&gt;
[/quote]
  保存文件,退出并重新打开迅雷,再去下载一个视频,下载完成后再也没有错误提示了。

Jinitiator控件IE崩溃及Jinitiator界面汉字方框的解决办法

  前几天拿到的一套网络销售系统原来还有个类似ERP的管理后台,折腾了半天才架设起来并找到入口,类似http://IP:7778/forms/frmservlet?config=webutil&form=main,初步了解了下,好像是用Oracle Form builder开发的。在原来就安装好Jinitiator控件的一台服务器上(Windwos Server 2003操作系统)用IE打开这个网址,然后会弹出个类似JVM的界面,但界面上的汉字都是乱码的,就是显示成黑色线的方框。
  网上搜索了下,说是将Jinitiator安装目录C:Program FilesOracleJInitiator 1.3.1.22下的lib文件夹里的font.properties.zh.5.1复制一份,重命名为font.properties.zh.5.2即可解决,试了下,果然成功了。
  为了方便查看系统,同事就在他的办公电脑(Windows 7)上也浏览器那个网址,并按提示安装了Jinitiator控件,但是安装完成后用IE浏览器这个网址直接就崩溃了。我也在自己的笔记本上(Windows Server 2008)安装此控件,用IE打开也直接崩溃,用Maxthon打开,提示:
Maxthon 阻止了一个错误.
Fault address: 6D4AC228 03:00014228 C:PROGRA~1OracleJINITI~1.22inhotspotjvm.dll
然后就崩溃了。
同事说难道Win7之类的系统与这个控件不兼容?找了台装有Windows XP的电脑试了下,依旧崩溃。
  网上查了下资料,看到有人说Jinitiator和JVM其实是差不多的东西,我就想尝试下安装个JDK看看能不能解决。先是把Jinitiator卸载了,然后安装JDK,试了下还是失败,再把Jinitiator装上去,依旧不成功。
  回顾了下整个过程,我又注意到Maxthon下的错误提示,是与jvm.dll有关的,那把JDK下的jvm.dll复制过来替换了,是否能行呢?搜索下JDK安装目录,找到三个jvm.dll文件,分别在“Javajre6inclient”、“Javajdk1.6.0_10jreinclient”和“Javajdk1.6.0_10jreinserver”目录下,前两个文件大小是一样的,我猜是同样的文件,还有一个文件稍大,用哪个好呢?既然是在运行客户端,那就用client目录下的吧,替换后,再次打开那个网址,再也不崩溃了。
  一波刚平一波又起,IE是不崩溃了,打开的界面同样是乱码的,并且用刚刚那个办法无法解决。再次上网搜索,很快找到解决办法:
在Jinitiator安装目录的lib文件夹中找到font.properties.zh,把里面的
filename.u5b8bu4f53=SIMSUN.TTF
改为
filename.u5b8bu4f53=SIMSUN.TTC
即可
  折腾了半天,解决了两个问题,现将解决办法记录在此,供遇到相同问题的朋友参考。

Oracle数据库出错ORA-01033的解决办法之一

  这几天拿到一套网络销售系统(连电脑一起搬过来),要架设起来看看。开机后发现是Windows Server 2003的操作系统,IIS下的ASP站点,用的是Oracle数据库。打开站点发现报错:ORA-01033:oracle initializationg or shutdown in progress ,是数据库连接问题。通过PL/SQL Developer连接Oracle时也报ORA-01033:oracle initializationg or shutdown in progress 错误提示。经过一番折腾解决了问题。解决思路为:用命令行模式启动数据库服务,看看初始化与装载数据库时具体提示哪个地方出错。过程如下:

1、进入CMD,执行set orACLE_SID=db(要确保连接到正确的SID)
2、执行sqlplus "/as sysdba"
  SQL>shutdown immediate  (先停止服务)
  SQL>startup          (启动服务)
数据库装载完毕,但是报错:
orA-16038:日志 3 序列号 290 无法归档
orA-19504:无法创建文件""
orA-00312:联机日志线程1:'F:ORACLEORADATADBREDO03.LOG'

3、联想到之前系统提示F盘空间不足,虽然我之前已经清理了一些,但是我看了下才几十M的可用空间了,难道是这个原因?再次清理了下F盘,然后再次停止服务后启动服务,此次正常。
4、进入PL/SQL Developer检查,没有再提示错误。
  至此,问题解决,打开站点访问也没有报错了。

PHP利用SMTP发送邮件(Mail)的类与函数

  很多情况下,服务器都没有建邮件服务器,因为PHP自带的Mail函数基本上起不了什么作用。废话不多说,分享一个用SMTP可以发信的类和函数。
SMTP类代码:
[code]class smtp
{
/* Public Variables */
var $smtp_port;
var $time_out;
var $host_name;
var $log_file;
var $relay_host;
var $debug;
var $auth;
var $user;
var $pass;

/* Private Variables */
var $sock;

/* Constractor */
function smtp($relay_host = "", $smtp_port = 25,$auth = false,$user,$pass)
{
$this->debug = FALSE;
$this->smtp_port = $smtp_port;
$this->relay_host = $relay_host;
$this->time_out = 30; //is used in fsockopen()
#
$this->auth = $auth;//auth
$this->user = $user;
$this->pass = $pass;
#
$this->host_name = "localhost"; //is used in HELO command
$this->log_file = "";

$this->sock = FALSE;
}

/* Main Function */
function sendmail($to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "")
{
$mail_from = $this->get_address($this->strip_comment($from));
$body = ereg_replace("(^|(
))(\.)", "\1.\3", $body);
$header .= "MIME-Version:1.0
";
if($mailtype=="HTML"){
$header .= "Content-Type:text/html
";
}
$header .= "To: ".$to."
";
if ($cc != "") {
$header .= "Cc: ".$cc."
";
}
$header .= "From: $from<".$from.">;
";
$header .= "Subject: ".$subject."
";
$header .= $additional_headers;
$header .= "Date: ".date("r")."
";
$header .= "X-Mailer:By Redhat (PHP/".phpversion().")
";
list($msec, $sec) = explode(" ", microtime());
$header .= "Message-ID: <".date("YmdHis", $sec).".".($msec*1000000).".".$mail_from.">;
";
$TO = explode(",", $this->strip_comment($to));

if ($cc != "") {
$TO = array_merge($TO, explode(",", $this->strip_comment($cc)));
}

if ($bcc != "") {
$TO = array_merge($TO, explode(",", $this->strip_comment($bcc)));
}

$sent = TRUE;
foreach ($TO as $rcpt_to) {
$rcpt_to = $this->get_address($rcpt_to);
if (!$this->smtp_sockopen($rcpt_to)) {
$this->log_write("Error: Cannot send email to ".$rcpt_to."
");
$sent = FALSE;
continue;
}
if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) {
$this->log_write("E-mail has been sent to <".$rcpt_to.">;
");
} else {
$this->log_write("Error: Cannot send email to <".$rcpt_to.">;
");
$sent = FALSE;
}
fclose($this->sock);
$this->log_write("Disconnected from remote host
");
}
return $sent;
}

/* Private Functions */

function smtp_send($helo, $from, $to, $header, $body = "")
{
if (!$this->smtp_putcmd("HELO", $helo)) {
return $this->smtp_error("sending HELO command");
}
#auth
if($this->auth){
if (!$this->smtp_putcmd("AUTH LOGIN", base64_encode($this->user))) {
return $this->smtp_error("sending HELO command");
}

if (!$this->smtp_putcmd("", base64_encode($this->pass))) {
return $this->smtp_error("sending HELO command");
}
}
#
if (!$this->smtp_putcmd("MAIL", "FROM:<".$from.">;")) {
return $this->smtp_error("sending MAIL FROM command");
}

if (!$this->smtp_putcmd("RCPT", "TO:<".$to.">;")) {
return $this->smtp_error("sending RCPT TO command");
}

if (!$this->smtp_putcmd("DATA")) {
return $this->smtp_error("sending DATA command");
}

if (!$this->smtp_message($header, $body)) {
return $this->smtp_error("sending message");
}

if (!$this->smtp_eom()) {
return $this->smtp_error("sending <CR>;<LF>;.<CR>;<LF>; [EOM]");
}

if (!$this->smtp_putcmd("QUIT")) {
return $this->smtp_error("sending QUIT command");
}

return TRUE;
}

function smtp_sockopen($address)
{
if ($this->relay_host == "") {
return $this->smtp_sockopen_mx($address);
} else {
return $this->smtp_sockopen_relay();
}
}

function smtp_sockopen_relay()
{
$this->log_write("Trying to ".$this->relay_host.":".$this->smtp_port."
");
$this->sock = @fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);
if (!($this->sock && $this->smtp_ok())) {
$this->log_write("Error: Cannot connenct to relay host ".$this->relay_host."
");
$this->log_write("Error: ".$errstr." (".$errno.")
");
return FALSE;
}
$this->log_write("Connected to relay host ".$this->relay_host."
");
return TRUE;
}

function smtp_sockopen_mx($address)
{
$domain = ereg_replace("^.+@([^@]+)$", "\1", $address);
if (!@getmxrr($domain, $MXHOSTS)) {
$this->log_write("Error: Cannot resolve MX "".$domain.""
");
return FALSE;
}
foreach ($MXHOSTS as $host) {
$this->log_write("Trying to ".$host.":".$this->smtp_port."
");
$this->sock = @fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);
if (!($this->sock && $this->smtp_ok())) {
$this->log_write("Warning: Cannot connect to mx host ".$host."
");
$this->log_write("Error: ".$errstr." (".$errno.")
");
continue;
}
$this->log_write("Connected to mx host ".$host."
");
return TRUE;
}
$this->log_write("Error: Cannot connect to any mx hosts (".implode(", ", $MXHOSTS).")
");
return FALSE;
}

function smtp_message($header, $body)
{
fputs($this->sock, $header."
".$body);
$this->smtp_debug(">; ".str_replace("
", "
".">; ", $header."
>; ".$body."
>; "));

return TRUE;
}

function smtp_eom()
{
fputs($this->sock, "
.
");
$this->smtp_debug(". [EOM]
");

return $this->smtp_ok();
}

function smtp_ok()
{
$response = str_replace("
", "", fgets($this->sock, 512));
$this->smtp_debug($response."
");

if (!ereg("^[23]", $response)) {
fputs($this->sock, "QUIT
");
fgets($this->sock, 512);
$this->log_write("Error: Remote host returned "".$response.""
");
return FALSE;
}
return TRUE;
}

function smtp_putcmd($cmd, $arg = "")
{
if ($arg != "") {
if($cmd=="") $cmd = $arg;
else $cmd = $cmd." ".$arg;
}

fputs($this->sock, $cmd."
");
$this->smtp_debug(">; ".$cmd."
");

return $this->smtp_ok();
}

function smtp_error($string)
{
$this->log_write("Error: Error occurred while ".$string.".
");
return FALSE;
}

function log_write($message)
{
$this->smtp_debug($message);

if ($this->log_file == "") {
return TRUE;
}

$message = date("M d H:i:s ").get_current_user()."[".getmypid()."]: ".$message;
if (!@file_exists($this->log_file) || !($fp = @fopen($this->log_file, "a"))) {
$this->smtp_debug("Warning: Cannot open log file "".$this->log_file.""
");
return FALSE;
}
flock($fp, LOCK_EX);
fputs($fp, $message);
fclose($fp);

return TRUE;
}

function strip_comment($address)
{
$comment = "\([^()]*\)";
while (ereg($comment, $address)) {
$address = ereg_replace($comment, "", $address);
}

return $address;
}

function get_address($address)
{
$address = ereg_replace("([
])+", "", $address);
$address = ereg_replace("^.*<(.+)>;.*$", "\1", $address);

return $address;
}

function smtp_debug($message)
{
if ($this->debug) {
echo $message;
}
}
}[/code]
再写个发邮件函数,方便调用,代码:
[code]function sendmail($smtpserver,$smtpuser,$smtppass,$smtpemailto,$smtpusermail, $mailsubject, $mailbody){
$smtp = new smtp($smtpserver,25,true,$smtpuser,$smtppass);
//$smtp->debug = TRUE;
$smtp->sendmail($smtpemailto, $smtpusermail, $mailsubject, $mailbody, "HTML");
}[/code]
调用函数发送邮件:
$body="邮件内容。。。。。";
sendmail("smtp.exmail.qq.com","邮箱登录名","邮箱密码","收件邮箱","发件邮箱","主题",$body);

发送邮件提示“551 User not local; please try ”错误的原因及解决办法

  一网站要嵌入一个客户反馈系统。为了方便收集反馈信息,并能及时查看信息,我决定以将反馈内容提交到邮箱。
  用了一个之前收集的PHP写的SMTP发邮件类函数,很快就搞定了,本地测试正常。传到服务器后发现收不到信,看了下函数,发现有Debug功能,开启Debug,反馈的信息如下:

 eG15Ym94MTQ3ODk2MzI1 235 Authentication successful >;
 MAIL FROM:; 250 Ok >;
 RCPT TO:; 551 User not local; please try Error: Remote host returned "551 User not local;
 please try " Error: Error occurred while sending RCPT TO command. Error: Cannot send email to ;
 Disconnected from remote host

  查了些资料,说出现以上错误信息的原因和所发邮件有没有内容、内容大小等都没有关系,是中国政府的国家防火墙(GFW,又名“金盾工程”)做了过滤的原因,它(金盾工程)定义了大陆的IP连接到大陆以外(如香港、台湾、欧洲等)的邮件服务器是不可以自己发邮件给自己的!

  相反的,我是用PHP写的发送邮件程序,在海外主机上用腾讯企业邮箱的SMTP发送邮件。看来也是被墙了。再仔细看了下上面那个解释,我注意到“不可以自己发邮件给自己”,正好我为了方便,就是用自己和邮箱账号发给自己的邮箱来收集反馈信息,那我就换个用户来发送试试看,登录腾讯企业邮箱管理,新建了一个专门发送邮件的邮箱账号,再上传测试,成功了。

  问题是解决了,但是我不明白的是,为什么自己邮箱给自己的邮箱发送就被阻止了,而发给同个服务器同个域下的另一个账号就没问题呢?不知道是出于什么目的。。。。

VisualSVN 破解方法

一、VisualSVN 通用破解方法

1. http://www.visualsvn.com/visualsvn/download,下载1.5.x版安装(需要SVN1.5或以上环境)。
2. 进入.NET Framework命令提示符,输入

ildasm "C:/Program Files/VisualSVN/bin/VisualSVN.Core.dll" /out="C:/Program Files/VisualSVN/bin/VisualSVN.Core.il"

或者用 DotNetHelper 工具,将VisualSVN.Core.dll 反编译成 VisualSVN.Core.il文件,再用记事本(最好是Editplus)打开这个文件

在这个文件中找到:“.method public hidebysig static bool  IsValid( ”这行

3、把里函数里面的内容改为:

.maxstack  8
IL_0000:  ldc.i4.
1
IL_0001:  ret

注意:“.maxstack  8”里面的“8”,要看看上下文中的同样标志,是否是8,我的是2

(去掉Lincense判断直接return true)。

或者用DotNetHelper工具,直接编译成.dll文件,注意,默认的文件名称是 VisualSVN.Core_Out.dll

把原有的 VisualSVN.Core.dll 删除,再把VisualSVN.Core_Out.dll(新编译的dll文件)改名成 VisualSVN.Core.dll

4. 回到命令行输入

ilasm "C:/Program Files/VisualSVN/bin/VisualSVN.Core.il" /dll

5、再启动vs2005,看看Visualsvn 是不是可用了

二、关于“VisualSVN-2.5.2”的破解

这个软件的核心部分是.net写的,而且没有加密和混淆,使用Reflector很容易反编译。

原来打算写一个Keygen程序,但是分析代码后发现注册信息部分使用了RSA加密,没有私钥就没办法生成注册码。

所以想到另一个方法,修改判断注册码有效性的函数“IsValid”,让其直接返回TRUE,这时无论输什么注册码,都会提示注册成功,但是无法生成有效的license,导致30天后失效。

最后想了一个笨办法,即延长有效期30年,这个方法有效

源码文件如下,请自行编译后覆盖原文件。

http://files.cnblogs.com/anotherstone/VisualSVN.Core.L_Crack.rar