程序实现代码:

  1. IMGPath="icon_lblog.gif" 
  2.  
  3. Set PP=New ImgWHInfo    
  4. W = PP.imgW(Server.Mappath(IMGPath))    
  5. H = PP.imgH(Server.Mappath(IMGPath))   
  6. Set pp=Nothing   
  7.    
  8. Response.Write("<img src='"&IMGPath&"' border=0>宽:"&W&";高:"&H) 


类代码:

  1. <%  
  2. Class ImgWHInfo '获取图片宽度和高度的类,支持JPG,GIF,PNG,BMP  
  3.     Dim ASO  
  4.     Private Sub Class_Initialize  
  5.         Set ASO=Server.CreateObject("ADODB.Stream")  
  6.         ASO.Mode=3  
  7.         ASO.Type=1  
  8.         ASO.Open  
  9.     End Sub 
  10.     Private Sub Class_Terminate  
  11.         Err.Clear  
  12.         Set ASO=Nothing 
  13.     End Sub   
  14.    
  15.     Private Function Bin2Str(Bin)  
  16.         Dim I, Str  
  17.         For I=1 To LenB(Bin)  
  18.             clow=MidB(Bin,I,1)  
  19.             If ASCB(clow)<128 Then 
  20.                 Str = Str & Chr(ASCB(clow))  
  21.             Else 
  22.                 I=I+1  
  23.                 If I <= LenB(Bin) Then Str = Str & Chr(ASCW(MidB(Bin,I,1)&clow))  
  24.             End If 
  25.         Next 
  26.         Bin2Str = Str  
  27.     End Function 
  28.         
  29.     Private Function Num2Str(Num,Base,Lens)  
  30.         Dim Ret  
  31.         Ret = "" 
  32.         While(Num>=Base)  
  33.             Ret = (Num Mod Base) & Ret  
  34.             Num = (Num - Num Mod Base)/Base  
  35.         Wend  
  36.         Num2Str = Right(String(Lens,"0") & Num & Ret,Lens)  
  37.     End Function 
  38.         
  39.     Private Function Str2Num(Str,Base)   
  40.         Dim Ret,I  
  41.         Ret = 0   
  42.         For I=1 To Len(Str)   
  43.             Ret = Ret *base + Cint(Mid(Str,I,1))   
  44.         Next   
  45.         Str2Num=Ret   
  46.     End Function   
  47.         
  48.     Private Function BinVal(Bin)   
  49.         Dim Ret,I  
  50.         Ret = 0   
  51.         For I = LenB(Bin) To 1 Step -1   
  52.             Ret = Ret *256 + AscB(MidB(Bin,I,1))   
  53.         Next   
  54.         BinVal=Ret   
  55.     End Function   
  56.         
  57.     Private Function BinVal2(Bin)   
  58.         Dim Ret,I  
  59.         Ret = 0   
  60.         For I = 1 To LenB(Bin)   
  61.             Ret = Ret *256 + AscB(MidB(Bin,I,1))   
  62.         Next   
  63.         BinVal2=Ret   
  64.     End Function   
  65.         
  66.     Private Function GetImageSize(filespec)  
  67.         Dim bFlag  
  68.         Dim Ret(3)   
  69.         ASO.LoadFromFile(filespec)   
  70.         bFlag=ASO.Read(3)   
  71.         Select Case Hex(binVal(bFlag))   
  72.         Case "4E5089":   
  73.             ASO.Read(15)   
  74.             ret(0)="PNG"   
  75.             ret(1)=BinVal2(ASO.Read(2))   
  76.             ASO.Read(2)   
  77.             ret(2)=BinVal2(ASO.Read(2))   
  78.         Case "464947":   
  79.             ASO.read(3)   
  80.             ret(0)="gif"   
  81.             ret(1)=BinVal(ASO.Read(2))   
  82.             ret(2)=BinVal(ASO.Read(2))   
  83.         Case "535746":   
  84.             ASO.read(5)   
  85.             binData=ASO.Read(1)   
  86.             sConv=Num2Str(ascb(binData),2 ,8)   
  87.             nBits=Str2Num(left(sConv,5),2)   
  88.             sConv=mid(sConv,6)   
  89.             While(len(sConv)<nBits*4)   
  90.                 binData=ASO.Read(1)   
  91.                 sConv=sConv&Num2Str(AscB(binData),2 ,8)   
  92.             Wend   
  93.             ret(0)="SWF"   
  94.             ret(1)=Int(Abs(Str2Num(Mid(sConv,1*nBits+1,nBits),2)-Str2Num(Mid(sConv,0*nBits+1,nBits),2))/20)   
  95.             ret(2)=Int(Abs(Str2Num(Mid(sConv,3*nBits+1,nBits),2)-Str2Num(Mid(sConv,2*nBits+1,nBits),2))/20)   
  96.         Case "FFD8FF":   
  97.             Do    
  98.             Do: p1=binVal(ASO.Read(1)): Loop While p1=255 And Not ASO.EOS   
  99.             If p1>191 And p1<196 Then Exit Do Else ASO.read(binval2(ASO.Read(2))-2)   
  100.             Do:p1=binVal(ASO.Read(1)):Loop While p1<255 And Not ASO.EOS   
  101.             Loop While True   
  102.             ASO.Read(3)   
  103.             ret(0)="JPG"   
  104.             ret(2)=binval2(ASO.Read(2))   
  105.             ret(1)=binval2(ASO.Read(2))   
  106.         Case Else:   
  107.             If left(Bin2Str(bFlag),2)="BM" Then   
  108.                 ASO.Read(15)   
  109.                 ret(0)="BMP"   
  110.                 ret(1)=binval(ASO.Read(4))   
  111.                 ret(2)=binval(ASO.Read(4))   
  112.             Else   
  113.                     ret(0)=""   
  114.             End If   
  115.         End Select   
  116.         ret(3)="width=""" & ret(1) &""" height=""" & ret(2) &""""   
  117.         getimagesize=ret   
  118.     End Function   
  119.         
  120.     Public Function imgW(IMGPath)  
  121.         Dim FSO,IMGFile,FileExt,Arr  
  122.         Set FSO = Server.CreateObject("Scripting.FileSystemObject")   
  123.         If (FSO.FileExists(IMGPath)) Then   
  124.             Set IMGFile = FSO.GetFile(IMGPath)   
  125.             FileExt=FSO.GetExtensionName(IMGPath)   
  126.             Select Case FileExt   
  127.                 Case "gif","bmp","jpg","png":   
  128.                 Arr=GetImageSize(IMGFile.Path)   
  129.                 imgW = Arr(1)   
  130.             End Select   
  131.             Set IMGFile=Nothing   
  132.         Else 
  133.             imgW = 0  
  134.         End If       
  135.         Set FSO=Nothing   
  136.     End Function   
  137.        
  138.     Public Function imgH(IMGPath)  
  139.         Dim FSO,IMGFile,FileExt,Arr  
  140.         Set FSO = server.CreateObject("Scripting.FileSystemObject")   
  141.         If (FSO.FileExists(IMGPath)) Then   
  142.             Set IMGFile = FSO.GetFile(IMGPath)   
  143.             FileExt=FSO.GetExtensionName(IMGPath)   
  144.             Select Case FileExt   
  145.                 Case "gif","bmp","jpg","png":   
  146.                 Arr=getImageSize(IMGFile.Path)   
  147.                 imgH = Arr(2)   
  148.             End Select   
  149.             Set IMGFile=Nothing   
  150.         Else 
  151.             imgH = 0   
  152.         End If       
  153.         Set FSO=Nothing   
  154.     End Function   
  155. End Class 
  156. %> 

本日志由 flyinweb 于 2009-06-19 22:23:33 发表到 WEB应用开发 中,目前已经被浏览 257 次,评论 0 次;

作者添加了以下标签: ASP图片宽度和高度

HOWTO: Send a Binary Stream by Using XMLHTTP

SUMMARY
In some cases you may want to send a binary stream to a server. One way to do so is to use the IXMLHTTPRequest object. This article demonstrates how to retrieve an ADO recordset from a server, modify it, and send it back as a stream of binary data.

MORE INFORMATION
This example uses the ADODB.Stream object to hold the binary data that is to be sent back to the server. If a newer version of MSXML has been installed in Sid-by-Side mode, then to run the sample code with that specific version, you must explicitly use the GUIDs or ProgIDs for that version. For example, MSXML version 4 only installs in side-by-side mode. Please refer to the following article in the Microsoft Knowledge Base to see what code changes required to run the sample code with the MSXML 4.0 parser: Q305019 INFO: MSXML 4.0 Specific GUIDs and ProgIds.

For example, in the code below, you would create objects with MSXML 4.0 with the following statements:

  1. var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.4.0");  
  2. xmldoc = new ActiveXObject("Msxml2.DOMDocument.4.0");  
  3. var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.4.0"); 

To use XMLHTTP to send a binary stream to a server, follow these steps: 
Paste the following code into a file in your default Web folder and name the file Receiver.asp.

  1. <%  
  2. dim Connection  
  3. dim rs  
  4. Connection = "Provider=SQLOLEDB.1;Data Source=servername;User Id=username;Password=password;Initial Catalog=Northwind;" 
  5. sql =  "Select * from Customers" 
  6.  
  7.  
  8. set rs = server.CreateObject("ADODB.Recordset")  
  9.  
  10. if Request.QueryString("getRecordset") = "YES" then  
  11.     rs.ActiveConnection = Connection  
  12.     rs.CursorLocation = 3 'Client Side  
  13.     rs.CursorType = 3 'Static Recordset  
  14.     rs.LockType = 4 'Batch Optimistic  
  15.     rs.Open sql  
  16.     rs.Save response, 1 'persist adPersistXML  
  17.     Response.End 
  18. else  
  19.     rs.open Request '.BinaryRead(Request.TotalBytes)  
  20.     rs.activeconnection = Connection 'Reconnect  
  21.     rs.updatebatch 'Update adAffectAll  
  22.     rs.close  
  23.     Response.Write "Recordset Saved" 'Send back response  
  24.     Response.End 
  25. end if  
  26.  
  27. %> 


Paste the following code into a file in your default Web folder and name the file Sender.asp

  1. <SCRIPT ID=clientEventHandlersJS LANGUAGE=javascript> 
  2. <!--  
  3.  
  4. var rs;  
  5. var xmldoc;   
  6. var xmlstream;  
  7.  
  8. function SendRS_onclick() {  
  9.     xmlstream = new ActiveXObject("ADODB.Stream");  
  10.     xmlstream.Mode = 3; //read write  
  11.     xmlstream.Open();  
  12.     xmlstream.Type = 1; // adTypeBinary  
  13.     rs.Save(xmlstream,0); //adpersistadtg  
  14.        var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");  
  15.        xmlhttp.Open("POST","http://localhost/Receiver.asp?getRecordset=NO",false);  
  16.     xmlhttp.setRequestHeader("Content-Length",xmlstream.Size); //set the length of the content  
  17.        xmlhttp.send(xmlstream.Read(xmlstream.Size)); //Send the stream  
  18.        alert(xmlhttp.responseText);  
  19. }  
  20.  
  21. function getRS_onclick() {  
  22.     rs = new ActiveXObject("ADODB.Recordset");  
  23.     xmldoc = new ActiveXObject("Msxml2.DOMDocument");  
  24.        var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");  
  25.        xmlhttp.Open("Get","http://localhost/Receiver.asp?getRecordset=YES",false);  
  26.        xmlhttp.send();  
  27.        xmldoc.loadXML(xmlhttp.responseText); //load the returned stream into the dom document  
  28.        rs.Open(xmldoc); //load the dom document into the recordset  
  29.        alert("Recordset Loaded");  
  30. }  
  31.  
  32. function Update_onclick() {  
  33.     alert("before: " + rs.Fields(2).Value);  
  34.     rs.Fields(2).Value = rs.Fields(2).Value + "!";  
  35.     rs.Update();  
  36.     alert("after: " + rs.Fields(2).Value);  
  37. }  
  38.  
  39. //--> 
  40. </SCRIPT> 
  41. <INPUT type="button" value="Get Recordset" id=getRS name=getRS LANGUAGE=javascript onclick="return getRS_onclick()"> 
  42. <INPUT type="button" value="Update" id=Update name=Update LANGUAGE=javascript onclick="return Update_onclick()"> 
  43. <INPUT type="button" value="Send Recordset" id=SendRS name=SendRS LANGUAGE=javascript onclick="return SendRS_onclick()"> 

Modify the Receiver.asp page so that the connection variable contains a Microsoft SQL Server name and a valid SQL userid and password.
Start Microsoft Internet Explorer and browse to http://localhost/sender.asp.
Click Get Recordset. A message box appears and tells you that the recordset was loaded successfully.
Click Update. A message box appears and shows you the value before the update. A second message box appears and shows you the value after the update.
Click Send Recordset. A message box appears and tells you that the recordset was updated.
Known Limitations and Recommendations
Although this allows you to use the persist mechanism to pass the data back and forth to the client, it is recommended that you use UpdateGrams or OpenXML with SQL Server 2000 to pass and send recordset data in XML format.
There are limitations in shaped recordsets. Edited shaped recordsets cannot be persisted in XML format. Also, parameterized shaped commands cannot be persisted at all. For additional information on persisting and limitations, see the following Microsoft Developer Network (MSDN) Web site:
XML Persistence Format
http://msdn.microsoft.com/library/psdk/dasdk/xmli3vsk.htm

REFERENCES
For more information, see the following MSDN Web site:
Saving ADO Recordsets in XML Format
http://msdn.microsoft.com/library/psdk/dasdk/xmli546n.htm

(c) Microsoft Corporation 2001, All Rights Reserved. Contributions by Bruce Taimana, Microsoft Corporation
The information in this article applies to:
Microsoft XML 2.5
Microsoft XML 2.6
Microsoft XML 3.0
Microsoft XML 3.0 SP1
Microsoft XML 4.0

  1. with wscript  
  2.     if .arguments.count<2 then   
  3.         .quit  
  4.     end if   
  5.     set aso=.createobject("adodb.stream")  
  6.     set web=createobject("microsoft.xmlhttp")   
  7.     web.open "get",.arguments(0),0  
  8.     web.send  
  9.     if web.status>200 then   
  10.         .echo "Error:"+web.status  
  11.         .quit   
  12.         aso.type=1  
  13.         aso.open  
  14.         aso.write web.responsebody  
  15.         aso.savetofile .arguments(1),2  
  16.     end if  
  17. end with 

本日志由 flyinweb 于 2009-06-19 22:09:58 发表到 WEB应用开发 中,目前已经被浏览 367 次,评论 0 次;

作者添加了以下标签: Binary StreamXMLHTTP

纯编码实现Access数据库的建立或压缩

  1. <%   
  2. '#######以下是一个类文件,下面的注解是调用类的方法################################################   
  3. '# 注意:如果系统不支持建立Scripting.FileSystemObject对象,那么数据库压缩功能将无法使用   
  4. '# Access 数据库类   
  5. '# CreateDbFile 建立一个Access 数据库文件   
  6. '# CompactDatabase 压缩一个Access 数据库文件   
  7. '# 建立对象方法:   
  8. '# Set a = New DatabaseTools   
  9. '# by (萧寒雪) s.f.   
  10. '#########################################################################################   
  11.  
  12. Class DatabaseTools   
  13.  
  14.     Public function CreateDBfile(byVal dbFileName,byVal DbVer,byVal SavePath)   
  15.         '建立数据库文件   
  16.         'If DbVer is 0 Then Create Access97 dbFile   
  17.         'If DbVer is 1 Then Create Access2000 dbFile   
  18.         On error resume Next   
  19.         If Right(SavePath,1)<>"\" Or Right(SavePath,1)<>"/" Then SavePath = Trim(SavePath) & "\"   
  20.         If Left(dbFileName,1)="\" Or Left(dbFileName,1)="/" Then dbFileName = Trim(Mid(dbFileName,2,Len(dbFileName)))   
  21.         If DbExists(SavePath & dbFileName) Then   
  22.             Response.Write ("对不起,该数据库已经存在!")   
  23.             CreateDBfile = False   
  24.         Else   
  25.             Dim Ca   
  26.             Set Ca = Server.CreateObject("ADOX.Catalog")   
  27.             If Err.number<>0 Then   
  28.                 Response.Write ("无法建立,请检查错误信息  
  29.                 " & Err.number & " 
  30.                 " & Err.Description)   
  31.                 Err.Clear   
  32.                 Exit function   
  33.             End If   
  34.             If DbVer=0 Then   
  35.                 call Ca.Create("Provider=Microsoft.Jet.OLEDB.3.51;Data Source=" & SavePath & dbFileName)   
  36.             Else   
  37.                 call Ca.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & SavePath & dbFileName)   
  38.             End If   
  39.             Set Ca = Nothing   
  40.             CreateDBfile = True   
  41.         End If   
  42.     End function   
  43.  
  44.     Public function CompactDatabase(byVal dbFileName,byVal DbVer,byVal SavePath)   
  45.         '压缩数据库文件   
  46.         '0 为access 97   
  47.         '1 为access 2000   
  48.         On Error resume next   
  49.         If Right(SavePath,1)<>"\" Or Right(SavePath,1)<>"/" Then SavePath = Trim(SavePath) & "\"   
  50.         If Left(dbFileName,1)="\" Or Left(dbFileName,1)="/" Then dbFileName = Trim(Mid(dbFileName,2,Len(dbFileName)))   
  51.         If DbExists(SavePath & dbFileName) Then   
  52.             Response.Write ("对不起,该数据库已经存在!")   
  53.             CompactDatabase = False   
  54.         Else   
  55.             Dim Cd   
  56.             Set Cd =Server.CreateObject("JRO.JetEngine")   
  57.             If Err.number<>0 Then   
  58.                 Response.Write ("无法压缩,请检查错误信息  
  59.                 " & Err.number & " 
  60.                 " & Err.Description)   
  61.                 Err.Clear   
  62.                 Exit function   
  63.             End If   
  64.             If DbVer=0 Then   
  65.                 call Cd.CompactDatabase("Provider=Microsoft.Jet.OLEDB.3.51;Data Source=" & SavePath & dbFileName,"Provider=Microsoft.Jet.OLEDB.3.51;Data   
  66.                 Source=" & SavePath & dbFileName & ".bak.mdb;Jet OLEDB;Encrypt Database=True")   
  67.             Else   
  68.                 call Cd.CompactDatabase("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &   
  69.                 SavePath & dbFileName,"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &   
  70.                 SavePath & dbFileName & ".bak.mdb;Jet OLEDB;Encrypt Database=True")   
  71.             End If   
  72.             '删除旧的数据库文件   
  73.             call DeleteFile(SavePath & dbFileName)   
  74.             '将压缩后的数据库文件还原   
  75.             call RenameFile(SavePath & dbFileName & ".bak.mdb",SavePath & dbFileName)   
  76.             Set Cd = False   
  77.             CompactDatabase = True   
  78.         End If   
  79.     end function   
  80.  
  81.     Public function DbExists(byVal dbPath)   
  82.         '查找数据库文件是否存在   
  83.         On Error resume Next   
  84.         Dim c   
  85.         Set c = Server.CreateObject("ADODB.Connection")   
  86.         c.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbPath   
  87.         If Err.number<>0 Then   
  88.             Err.Clear   
  89.             DbExists = false   
  90.         else   
  91.             DbExists = True   
  92.         End If   
  93.         set c = nothing   
  94.     End function   
  95.  
  96.     Public function AppPath()   
  97.         '取当前真实路径   
  98.         AppPath = Server.MapPath("./")   
  99.     End function   
  100.  
  101.     Public function AppName()   
  102.         '取当前程序名称   
  103.         AppName = Mid(Request.ServerVariables("SCRIPT_NAME"),(InStrRev(Request.ServerVariables("SCRIPT_NAME") ,"/",-1,1))+1,Len(Request.ServerVariables("SCRIPT_NAME")))   
  104.     End Function   
  105.  
  106.     Public function DeleteFile(filespec)   
  107.         '删除一个文件   
  108.         Dim fso   
  109.         Set fso = CreateObject("Scripting.FileSystemObject")   
  110.         If Err.number<>0 Then   
  111.         Response.Write("删除文件发生错误!请查看错误信息  
  112.         " & Err.number & " 
  113.         " & Err.Description)   
  114.         Err.Clear   
  115.         DeleteFile = False   
  116.         End If   
  117.         call fso.DeleteFile(filespec)   
  118.         Set fso = Nothing   
  119.         DeleteFile = True   
  120.     End function   
  121.  
  122.     Public function RenameFile(filespec1,filespec2)   
  123.         '修改一个文件   
  124.         Dim fso   
  125.         Set fso = CreateObject("Scripting.FileSystemObject")   
  126.         If Err.number<>0 Then   
  127.         Response.Write("修改文件名时发生错误!请查看错误信息  
  128.         " & Err.number & " 
  129.         " & Err.Description)   
  130.         Err.Clear   
  131.         RenameFile = False   
  132.         End If   
  133.         call fso.CopyFile(filespec1,filespec2,True)   
  134.         call fso.DeleteFile(filespec1)   
  135.         Set fso = Nothing   
  136.         RenameFile = True   
  137.     End function   
  138.  
  139. End Class   
  140. %>   
  141.  
  142.  现在已可以压缩有密码的数据库,代码如下,但是压缩之后的数据库密码就没有了!如何解决?  
  143.  
  144. <%  
  145. Const JET_3X = 4  
  146.  
  147. Function CompactDB(dbPath, boolIs97)  
  148.     Dim fso, Engine, strDBPath  
  149.     strDBPath = left(dbPath,instrrev(DBPath,"\"))  
  150.     Set fso = CreateObject("Scripting.FileSystemObject")  
  151.  
  152.     If fso.FileExists(dbPath) Then      
  153.         Set Engine = CreateObject("JRO.JetEngine")  
  154.  
  155.         If boolIs97 = "True" Then 
  156.             Engine.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbpath, _  
  157.             "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password='XXXXXXXX';Data Source=" & strDBPath & "temp.mdb;" _  
  158.             & "Jet OLEDB:Engine Type=" & JET_3X  
  159.         Else 
  160.         Engine.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password='XXXXXXXX';Data Source=" & dbpath, _  
  161.         "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strDBPath & "temp.mdb" 
  162.         End If 
  163.  
  164.         fso.CopyFile strDBPath & "temp.mdb",dbpath  
  165.         fso.DeleteFile(strDBPath & "temp.mdb")  
  166.         Set fso = nothing  
  167.         Set Engine = nothing  
  168.  
  169.         CompactDB = "你的数据库, " & dbpath & ", 已经压缩成功!" & vbCrLf  
  170.  
  171.     Else 
  172.         CompactDB = "数据库名称或路径不正确. 请重试!" & vbCrLf  
  173.     End If 
  174.  
  175. End Function 
  176. %>  

本日志由 flyinweb 于 2009-06-19 22:07:59 发表到 WEB应用开发 中,目前已经被浏览 402 次,评论 0 次;

作者添加了以下标签: Access创建压缩

一. 程序思路

  所有的程序,主要实现两个功能,一、发送邮件;二、上传附件。使用无组件上传程序来上传附件到服务器,在发送完后,将删除服务器上的邮件。实现这两个功能,需要一个数据库来存放邮件内容及附件信息(文件名)。邮件的发送有两种情况:一是,无附件的邮件;二是,有附件的邮件。

  1.发送无附件的邮件。用户根据实际情况来填写收信人、发信人、抄送、密送、SMTP服务器地址、邮件主题、邮件内容等信息,这些信息中,收信人、发信人、邮件主题、邮件内容是必须填写的,否则将收不到邮件。如果SMTP服务器支持SMTP验证,那么你就把你在该邮局的用户名和密码填上。如,你填的发信人地址是xxxx@163.com,因为163的SMTP服务,支持SMTP验证,所以你就要需要你在163的用户名xxxx,密码****,这样才能顺利发送邮件;如,你发信人地址是xxxx@hotmail.com,因为hotmail是不需要SMTP验证的,所以你不用填写用户名和密码。只要记住一点,你的发信的SMTP服务器支持SMTP验证的话,你就要填写相应的用户名和密码。你在填写完表单后,点“发送”按钮就直接发送邮件了。这个过程是在mail.asp和inc_clsEmail.asp完成的。

  2.发送带附件的邮件。这个过程,主要分三步,一、填写表单信息(同上),不过在点“发送”按钮前,需要转到第二步,发送附件。二、此步聚主要是上传附件到服务器。需要服务器支持FSO、Dictionary、Stream等组件。在进入上传附件界面前,先在数据库中创建一条记录,把刚成填的表单信息存在表里,然后选择本地需要本地的rar或zip文件,选好后点“上传”按钮就行了,传完后程序将更新数据库中存入附件文件名和字段的内容并自动跳转到发信页面,发信页面从数据库中读取邮件信息并显示出来,此时点“发送”,就将发送附件了。本过程主要由mail.asp、inc_clsEmail.asp、inc_clsUpload.asp、Upload.asp和Uploadok.asp来完成。

  在这个发信程序中用到的文件清单: 
    attachment.mdb  '邮件信息临时存放库
    install.asp    '在数据库中创建邮件信息临时表
    Mail.asp     '发送邮件
    Upload.asp    '文件上传
    Uploadok.asp   '文件上传成功
    inc_clsEmail.asp '邮件发送类
    inc_clsUpload.asp '无组件上传类
    inc_set.asp    '一些表格颜色的设置

二.建立数据库
  1.打开你的Access建立一个文件名为:attachment.mdb.添加以下字段:
    (1). ID     类型为自动编号(存放邮件信息的ID编号)
    (2). smtpcheck 类型为是/否字段(存放是否需要SMTP验证)
    (3). from    类型为文本字段(存放发信人的Email地址)
    (4). fromname  类型为文本字段(存放发信人的名字)
    (5). to     类型为文本字段(存放收信人的Email地址)
    (6). bcc    类型为文本字段(存放密送人的Email地址)
    (7). cc     类型为文本字段(存放抄送人的Email地址)
    (8). server   类型为文本字段(存放SMTP服务器地址)
    (9). subject  类型为文本字段(存放邮件主题)
    (10). body   类型为备注字段(存放邮件的内容)
    (11). username 类型为文本字段(存放邮箱登录用户名)
    (12). password 类型为文本字段(存放邮箱登录的密码)
    (13). filenames 类型为文本字段(存放附件的文件名)
  注意:可以把字段设置为允许为空。

  当然你可以自己添加你认为需要的字段,如果你把字段名或表名换成其它名称,则对程序也要作出相应的更改,不然会出错。如果你不想手工建表及添加字段,那你可以在浏览器中运行Install.asp文件,它可以自动建表,你就可以偷懒了:)

  2. 在开始编写之前你可以罗列一下要用到的SQL语句.

  1. --搜索出数据库中ID号为1的邮件信息  
  2. SQL = "SELECT * FROM attachment ORDER BY WHERE id=1" 
  3. --这个语句是添加新的临时邮件信息时用到的.  
  4. SQL="INSERT INTO attachment(smtpcheck,from,fromname,to,bcc,cc,server,subject,body,username,  
  5. password,filenames) VALUES(true,'cjj8110@hotmail.com',cjj','cjj8110@hotmail.com','','','','测试','测试邮件件发送程序','cjj8110','********','1,zip,1.rar')"   
  6. --删除表中全部数据。  
  7. SQL = "DELETE FROM attachment" 
  8. --删除表中指定ID的记录  
  9. SQL = "DELETE FROM attachment WHERE id =" & id  
  10. --更新表中,指定ID的filenames字段的内容  
  11. SQL = "UPDATE attachemnt SET filenames='" & filenames & "' WHERE ID=" & id 



三.编写代码
  Install.asp:考虑到手工建表有点麻烦,所以写了这个文件。文件主要用到CREATE TABLE和DROP TABLE语句,不过由于数据库的原因,有些数据库有可能不支持此语句。本文以Access为例,因为ACCESS支持这两条语句,如果还是新手还看不懂那也没关系,以为有机会再研究好了:)。由于不清楚数据库定义了那些关键字,所以在创建表和字段时,都用[]把表名和字段名括起来,即使表名或字段名和数据库的关键字冲突,也不会引起程序出错。不过运行本程序前,必须先在Access中创建一个数据库名称为attachment.mdb,可以不为其创建表,用此程序来创建。

install.asp的源码:

  1. <%  
  2.   '此文件在执行后最好删除,因为如果不注意再次执行的话,将会使数据库的所有数据丢失,切记!  
  3.  
  4.   Dim SYS_strTableName,SYS_strSQL,SYS_objRS  
  5.  
  6.   '需要创建的表的名字  
  7.   SYS_strTableName = "attachment" 
  8.     
  9.    Set objConn = Server.CreateObject("ADODB.Connection")  
  10.  
  11.   'OLEDB方式打开数据库的Connection对象连接字符串  
  12.   strcon="provider=microsoft.jet.oledb.4.0;data source=" & Server.mappath("attachment.mdb")  
  13.   objConn.open strcon'和数据库已经建立连接可对其操作了.  
  14.  
  15.  
  16.   'DROP TABLE是一条从数据库中删除表的SQL语句。有些数据库有可能不支持。  
  17.   SYS_strSQL = "DROP TABLE [" & SYS_strTableName & "]" 
  18.  
  19.   '删除表时,如果有错误出现则跳转执行下语句  
  20.   '因为如果DROP TABLE一个数据库中并不存在的表时,就会导致程序出错,  
  21.   '所以加了这个语句On Error Resume Next  
  22.     
  23.   On Error Resume Next 
  24.     
  25.   objConn.Execute (SYS_strSQL)  
  26.     
  27.   '因为On Error Resume Next比较耗资源,执行这条语句后,下面再出现错误将不会被跳转了也就是On Error Resume Next将不对此后的语句产生作用了,如果不加这句话,就对此后的都起屏蔽错误的作用。  
  28.   On Error Goto 0   
  29.  
  30.   '创建表格的主要是用CREATE TABLE语句  
  31.   'CREATE TABLE tablename (fieldname1 fieldytype1,fieldname2 fieldtype2......)  
  32.   SYS_strSQL = "CREATE TABLE [" & SYS_strTableName & "] (" 
  33.     
  34.   '此为创建自动编号类型的字段id  
  35.   SYS_strSQL = SYS_strSQL & "[id] integer IDENTITY (1, 1) PRIMARY KEY NOT NULL ," 
  36.     
  37.   '创建文本类型的字段smtpcheck,字段类型为是/否类型。  
  38.   SYS_strSQL = SYS_strSQL & "[smtpcheck] yesno," 
  39.     
  40.   '创建文本类型的字段homepage,并限定该字段的长度为50(char(50)实现该功能),允许为空(NULL)  
  41.   SYS_strSQL = SYS_strSQL & "[from] char(50) NULL ," 
  42.   SYS_strSQL = SYS_strSQL & "[fromname] char(50) NULL," 
  43.   SYS_strSQL = SYS_strSQL & "[to] char(50) NULL ," 
  44.   SYS_strSQL = SYS_strSQL & "[bcc] char(50) NULL," 
  45.   SYS_strSQL = SYS_strSQL & "[cc] char(50) NULL ," 
  46.   SYS_strSQL = SYS_strSQL & "[server] char(50) NULL," 
  47.   SYS_strSQL = SYS_strSQL & "[subject] char(50) NULL ," 
  48.   SYS_strSQL = SYS_strSQL & "[body] memo," 
  49.   SYS_strSQL = SYS_strSQL & "[username] char(50) NULL," 
  50.   SYS_strSQL = SYS_strSQL & "[password] char(50) NULL ," 
  51.   SYS_strSQL = SYS_strSQL & "[filenames] char(50) NULL)" 
  52.  
  53.   Set SYS_objRS = objConn.Execute(SYS_strSQL)  
  54.   '显示创建成功信息。  
  55.   Response.Write ("  
  56. <font color=""#ff0000"">" & SYS_strTableName & "</font> 表创建成功!  
  57. ")  
  58. %> 


mail.asp的源码:

  1. <!--#include file="inc_clsEmail.asp"-->  
  2. <%  
  3.   Dim sAction,objMail,strID,strConn,strSQL,objConn,objRS  
  4.   Dim sServer,bSMTPCheck,sSubject,sBody,sFrom,sFromName,sTo,sBCC,sCC,sSMTPCheck,sAddFile,sUsername,sPassword  
  5.  
  6.   sAction = Trim(Request.Form("action"))  
  7.  
  8.   If sAction = "发送" Then 
  9.       Sub DelFiles(filename)  
  10.        Dim objFSO  
  11.     On Error Resume Next 
  12.     Set objFSO = CreateObject("Scripting.FileSystemObject")  
  13.     objFSO.DeleteFile filename  
  14.     If Err.Number <> 0 Then On Error Goto 0  
  15.    End Sub 
  16.  
  17.       Dim MyMail,sReturn,aryTemp,i,sAttachmentPath  
  18.       Dim sFileName,sFilePath,intID  
  19.  
  20.       intID = Trim(Session("Attachment_ID"))  
  21.    If intID = "" THen  
  22.        '去除附件表中的相应附件记录  
  23.        strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.Mappath("attachment.mdb")  
  24.        strSQL = "DELETE FROM [attachment]" 
  25.  
  26.     Set objConn = CreateObject("Adodb.Connection")  
  27.        On Error Resume Next 
  28.        Set objRS = objConn.Execute(strSQL)  
  29.  
  30.     If err.Number <> 0 Then 
  31.         On Error Goto 0  
  32.     End If 
  33.  
  34.     Set objConn = Nothing 
  35.  
  36.        Session("Attachment_ID") = "" 
  37.        Session.Abandon  
  38.  
  39.  
  40.           sSubject  = Trim(Request.Form("subject"))  
  41.        sUsername = Trim(Request.Form("username"))  
  42.        sPassword = TriM(Request.Form("password"))  
  43.           sBody     = Trim(Request.Form("body"))  
  44.           sFrom     = Trim(Request.Form("from"))  
  45.           sFromName = Trim(Request.Form("fromname"))  
  46.           sTo       = Trim(Request.Form("to"))  
  47.           sBCC      = Trim(Request.Form("BCC"))  
  48.           sCC       = Trim(Request.Form("CC"))  
  49.  
  50.        '创建邮件Class  
  51.           Set MyMail = New SWEmail  
  52.  
  53.           '自已设定邮件组件创建字符串  
  54.           'MyMail.SetObject("CDONTS.NewMail")  
  55.           'MyMail.SetObject("JMail.Message")  
  56.           'MyMail.SetObject("JMail.SmtpMail")  
  57.  
  58.           If sBCC <> "" Then MyMail.BCC(sBCC)  '密送  
  59.           If sCC <> "" Then MyMail.CC(sCC)    '抄送  
  60.  
  61.           If sServer <> "" Then MyMail.Server(sServer)  
  62.           '发送的是纯文本邮件,默认为HTML邮件  
  63.           MyMail.IsHTML(False)    
  64.  
  65.           '组件测试  
  66.           MyMail.Check sFrom,sFromName,sTo,sSubject,sBody  
  67.  
  68.     '发送邮件  
  69.     'sReturn = MyMail.Send(sFrom,sFromname,sTo,sSubject,sBody)  
  70.     '释放class占用的资源  
  71.           MyMail.Close  
  72.  
  73.  
  74.     'If sReutrn = True Then  
  75.     '    Response.Write("  
  76. 呵呵,邮件发送成功啦!  
  77. ")  
  78.     'Else  
  79.     '    Response.Write(sReturn)  
  80.     'End If  
  81.     Response.End 
  82.    Else 
  83.        strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.Mappath("attachment.mdb")  
  84.        strSQL = "SELECT * FROM [attachment] WHERE id=" & intID  
  85.  
  86.     Set objConn = CreateObject("Adodb.Connection")  
  87.     objConn.Open strConn  
  88.  
  89.     Set objRS = objConn.Execute(strSQL)  
  90.  
  91.     sFrom      = objRS("From")  
  92.     sFromname  = objRS("Fromname")  
  93.     sSubject   = objRS("subject")  
  94.     sBody      = objRS("body")  
  95.     sTo        = objRS("to")  
  96.     sAddFile   = objRS("filenames")  
  97.     sBCC       = objRS("bcc")  
  98.     sCC        = objRS("cc")  
  99.     sServer    = objRS("server")  
  100.     sUsername  = objRS("username")  
  101.     sPassword  = objRS("password")  
  102.     bSMTPCheck = objRS("smtpcheck")  
  103.  
  104.        '去除附件表中的相应附件记录  
  105.        strSQL = "DELETE FROM [attachment] WHERE id=" & intID  
  106.        On Error Resume Next 
  107.        Set objRS = objConn.Execute(strSQL)  
  108.        If err.Number <> 0 Then 
  109.         On Error Goto 0  
  110.     End If 
  111.  
  112.     Session("Attachment_ID") = "" 
  113.        Session.Abandon  
  114.          
  115.     objConn.Close  
  116.        Set objConn = Nothing 
  117.  
  118.        '创建邮件Class  
  119.           Set MyMail = New SWEmail  
  120.  
  121.           '自已设定邮件组件创建字符串  
  122.           'MyMail.SetObject("CDONTS.NewMail")  
  123.           'MyMail.SetObject("JMail.Message")  
  124.           'MyMail.SetObject("JMail.SmtpMail")  
  125.  
  126.           If sBCC <> "" Then MyMail.BCC(sBCC)  '密送  
  127.           If sCC <> "" Then MyMail.CC(sCC)    '抄送  
  128.  
  129.           MyMail.AddFile(Replace(sAddFile,",","$"))   '添加附件  
  130.             
  131.     If sServer <> "" Then MyMail.Server(sServer)  
  132.  
  133.           '发送的是纯文本邮件,默认为HTML邮件  
  134.           MyMail.IsHTML(False)  
  135.             
  136.     '组件测试  
  137.           MyMail.Check sFrom,sFromName,sTo,sSubject,sBody  
  138.  
  139.     '发送邮件  
  140.     'sReturn = MyMail.Send(sFrom,sFromname,sTo,sSubject,sBody)  
  141.     '释放class占用的资源  
  142.           MyMail.Close  
  143.  
  144.     'If sReutrn = True Then  
  145.     '    Response.Write("  
  146. 呵呵,邮件发送成功啦!  
  147. ")  
  148.     'Else  
  149.     '    Response.Write(sReturn)  
  150.     'End If  
  151.  
  152.           '删除服务器上的附件  
  153.     sAttachmentPath = Server.Mappath("AttachmentFiles\")  
  154.     If Instr(sAddFile,",") <> 0 Then 
  155.         aryTemp = Split(sAddFile,",")  
  156.      For i = LBound(aryTemp) To UBound(aryTemp)  
  157.          Call DelFiles(sAttachmentPath & "\" & aryTemp(i))  
  158.      Next 
  159.     Else 
  160.         If Trim(sAddFile) <> "" Then 
  161.          Call DelFiles(sAttachmentPath & "\" & sAddFile)  
  162.      End If 
  163.     End If 
  164.  
  165.     Response.End 
  166.    End If 
  167.  
  168.   ElseIf sAction = "附件" Then 
  169.  
  170.       sServer   = Trim(Request.Form("smtpserver"))  
  171.       bSMTPCheck= Trim(Request.Form("smtpcheck"))  
  172.    If (bSMTPCheck = "True") or (bSMTPCheck=TrueThen 
  173.           bSMTPCheck = True 
  174.    Else 
  175.        bSMTPCheck = False 
  176.    End If 
  177.       sSubject  = Trim(Request.Form("subject"))  
  178.    sUsername = Trim(Request.Form("username"))  
  179.    sPassword = TriM(Request.Form("password"))  
  180.       sBody     = Trim(Request.Form("body"))  
  181.       sFrom     = Trim(Request.Form("from"))  
  182.       sFromName = Trim(Request.Form("fromname"))  
  183.       sTo       = Trim(Request.Form("to"))  
  184.       sBCC      = Trim(Request.Form("BCC"))  
  185.       sCC       = Trim(Request.Form("CC"))  
  186.      
  187.    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.Mappath("attachment.mdb")  
  188.      
  189.    Set objConn = CreateObject("Adodb.Connection")  
  190.    objConn.Open strConn  
  191.    Set objRS = CreateObject("Adodb.RecordSet")  
  192.  
  193.    If Session("Attachment_ID") <> "" Then 
  194.        strSQL = "SELECT * FROM [attachment] WHERE id=" & Session("Attachment_ID")  
  195.  
  196.        objRS.Open strSQL,objConn,1,2  
  197.    Else 
  198.        strSQL = "SELECT * FROM [attachment]" 
  199.  
  200.        objRS.Open strSQL,objConn,1,2  
  201.        objRS.Addnew  
  202.    End If 
  203.  
  204.    objRS("SmtpCheck") = bSMTPCheck  
  205.    objRS("username")  = sUsername  
  206.    objRS("password")  = sPassword  
  207.       objRS("Server")    = sServer  
  208.    objRS("Subject")   = sSubject  
  209.    objRS("body")      = sBody  
  210.       objRS("from")      = sFrom  
  211.    objRS("fromname")  = sFromname  
  212.    objRS("bcc")       = sBCC  
  213.       objRS("cc")        = sCC  
  214.    objRS("to")        = sTo  
  215.    objRS.Update  
  216.  
  217.    Session("Attachment_ID") = objRS("id")  
  218.  
  219.    objRS.Close  
  220.    Set objRS = Nothing 
  221.    objConn.Close  
  222.    Set objConn = Nothing 
  223.  
  224.    Response.Redirect "upload.asp" 
  225.  
  226.   Else 
  227.      strID = Trim(Session("Attachment_ID"))  
  228.  
  229.       If strID <> "" Then 
  230. '       strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.Mappath("attachment.mdb")  
  231.        strConn = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" & Server.Mappath("attachment.mdb")  
  232.  
  233.        strSQL = "SELECT * FROM [attachment] WHERE id=" & strID  
  234.      
  235.        Set objConn = Server.CreateObject("Adodb.Connection")  
  236.        objConn.Open strConn  
  237.      
  238.        On Error Resume Next 
  239.        Set objRS = objConn.Execute(strSQL)  
  240.        If err.Number <> 0 Then 
  241.            On Error Goto 0  
  242.         Response.Write("找不到相应的附件,程序将终止运行!")  
  243.         Response.End 
  244.        Else 
  245.            sServer    = objRS("server")  
  246.         bSMTPCheck = objRS("SMTPCheck")  
  247.         sSubject   = objRS("Subject")  
  248.         sBody      = objRS("body")  
  249.            sFrom      = objRS("from")  
  250.         sFromname  = objRS("fromname")  
  251.         sTo        = objRS("to")  
  252.         sBCC       = objRS("bcc")  
  253.            sCC        = objRS("cc")  
  254.         sUsername  = objRS("username")  
  255.            sPassword  = objRS("password")  
  256.      sAddFile   = objRS("filenames")  
  257.        End If 
  258.        objConn.Close  
  259.        Set objConn = Nothing 
  260.       End If 
  261. %>  
  262. <html>  
  263. <head>  
  264. <title>发送</title>  
  265. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">  
  266. <script>  
  267.     function scheck() {  
  268.      if (form1.smtpcheck.checked)  
  269.       form1.smtpcheck.value=true  
  270.   else  
  271.       form1.smtpcheck.value=false;  
  272.  }  
  273. </script>  
  274. </head>  
  275.  
  276. <body bgcolor="#FFFFFF" text="#000000">  
  277. <form name="form1" method="post" action="mail.asp"
  278. 邮件服务器    <input type="text" name="smtpserver" value="<%=sServer%>">
  279. 组件     <input type="text" name="mailobject">
  280. SMTP验证:<%If bSMTPCheck Then%>
  281.     <input type="checkbox" name="smtpcheck" value="true" onclick="scheck();" checked>
  282. <%Else%>
  283.     <input type="checkbox" name="smtpcheck" value="false" onclick="scheck();">
  284. <%End If%>
  285.   
    用户名:<input type="text" name="username" value="<%=sUsername%>">
  286. 密 码:<input type="text" name="password" value="<%=sPassword%>">
  287. 收信人地址 <input type="text" name="to" value="<%=sTo%>">
  288. 发信人地址 <input type="text" name="from" value="<%=sFrom%>">
  289. 发信人姓名 <input type="text" name="fromname" value="<%=sFromName%>">
  290. 抄 送       <input type="text" name="cc" value="<%=sCC%>">
  291. 密 送       <input type="text" name="bcc" value="<%=sBCC%>">
  292. 主 题       <input type="text" name="subject" value="<%=sSubject%>">
  293. 附 件:    <input type="text" name="addfile" value="<%=sAddFile%>">
  294. 内 容      <textarea name="body" rows="20" cols="100"><%=sBody%></textarea>
  295.     <input type="submit" name="action" value="发送">
  296.     <input type="submit" name="action" value="附件">
  297. </form>
  298. </body>
    </html>
  299. <%End If%>

 
inc_clsEmail.asp文件,主要实现了邮件发送的全过程。此类有如下几种方法:a)check,主要是检测服务器支持哪些发信组件,并且发送一封邮件,看看能否成功发送;b)mailerr,主要是返回发送邮件过程中的错误信息;c)server,设置SMTP服务器的地址;d)send,发送邮件;e)BCC,密送邮件;f)CC,抄送邮件;g)addfile,添加附件,可添加多个附件;h)close,释放数据。

inc_clsEmail.asp的代码:

  1. <%Option Explicit  
  2.   '#########声明变量########  
  3.        
  4.   '以下定义邮件组件类型常量  
  5.   Private Const SWEmail_JMail43     = 0  
  6.   Private Const SWEmail_JMail       = 1  
  7.   Private Const SWEmail_ASPEMail    = 2  
  8.   Private Const SWEmail_ASPMail     = 3  
  9.   Private Const SWEmail_EasyWebmail = 4  
  10.   Private Const SWEmail_CMailServer = 5  
  11.   Private Const SWEmail_CDO         = 6  
  12.         
  13.   '本类支持的组件数,由于数组的下标是从0开始的,所以实际是支持7个组件  
  14.   Private Const SWEmail_intMailobjects = 6  
  15.  
  16.   '邮件组件数组  
  17.   ReDim SWEmail_aryMailObject(SWEmail_intMailobjects,2)  
  18.   'JMail 4.3  
  19.   SWEmail_aryMailObject(0,0) = "JMail.Message"  '创建组件的字符串,此字符串固定  
  20.   SWEmail_aryMailObject(0,1) = SWEmail_JMail43  '组件的类型,自定义  
  21.  
  22.   'JMail 早期版本  
  23.   SWEmail_aryMailObject(1,0) = "JMail.SmtpMail" 
  24.   SWEmail_aryMailObject(1,1) = SWEmail_JMail  
  25.  
  26.   'ASP EMail  
  27.   SWEmail_aryMailObject(2,0) = "Persits.MailSender" 
  28.   SWEmail_aryMailObject(2,1) = SWEmail_ASPEMail  
  29.  
  30.   'ASP Mail  
  31.   SWEmail_aryMailObject(3,0) = "smtpsvg.mailer" 
  32.   SWEmail_aryMailObject(3,1) = SWEmail_ASPMail  
  33.     
  34.   'Easy Web Mail  
  35.   SWEmail_aryMailObject(4,0) = "easymail.MailSEnd" 
  36.   SWEmail_aryMailObject(4,1) = SWEmail_EasyWebmail  
  37.  
  38.   'CMail Server  
  39.   SWEmail_aryMailObject(5,0) = "CMailCOM.SMTP.1" 
  40.   SWEmail_aryMailObject(5,1) = SWEmail_CMailServer  
  41.  
  42.   '微软自带的组件  
  43.   SWEmail_aryMailObject(6,0) = "CDONTS.NewMail" 
  44.   SWEmail_aryMailObject(6,1) = SWEmail_CDO  
  45.  
  46.     
  47.   '记录邮件组件创建字符串  
  48.   Private SWEmail_strMailObject  
  49.   '邮件组件的类型  
  50.   Private SWEmail_intMailType  
  51.   '邮件组件的名称(描述)  
  52.   Private strMailName  
  53.   '邮件附件信息  
  54.   Private SWEmail_strFiles  
  55.  
  56.   Private SWEmail_strFrom           '发件人Email地址  
  57.   Private SWEmail_strFromName       '发件人姓名  
  58.   Private SWEmail_strTo             '收件人Email地址  
  59.   Private SWEmail_strSubject        '邮件主题  
  60.   Private SWEmail_strBody           '邮件内容  
  61.  
  62.   Private SWEmail_strBCC            '密送人Email地址  
  63.   Private SWEmail_strCC             '抄送人Email地址  
  64.     
  65.   Private SWEmail_strSMTPServer     '邮件服务器地址  
  66.   Private SWEmail_intSpeed          '邮件等级  
  67.   Private SWEmail_blnIsHTML         '是否HTML邮件,True为HTML邮件,FASLE为纯文本邮件  
  68.   Private SWEmail_strUserName       '身份验证时输入的用户名  
  69.   Private SWEmail_strPassword       '身份验证时输入的密码  
  70.   Private SWEmail_strAttachmentPath '附件路径  
  71.   Private SWEmail_strError          '错误信息  
  72.   '#########声明结束########  
  73.  
  74.  
  75.   '#########数据初始化########  
  76.     
  77.   '默认为普通  
  78.   SWEmail_intSpeed = 1  
  79.  
  80.   '默认为HTML邮件  
  81.   SWEmail_blnIsHTML = True 
  82.     
  83.   '设置默认发件服务器地址  
  84.   'SWEmail_strSMTPServr = "SMTP.163.com"  
  85.     
  86.   '设置默认组件字符串  
  87.   'SWEmail_strMailObject = "JMail.Message"  
  88.     
  89.   '设置附件文件的路径  
  90.   SWEmail_strAttachmentPath = Server.Mappath("attachmentfiles\")  
  91.  
  92.   '#########初始化结束########  
  93.     
  94.   Class SWEmail  
  95.       '检测服务支持的邮件组件  
  96.       Sub Check(sFrom,sFromName,sTo,sSubject,sBody)  
  97.           Dim i,objTest,sReturn  
  98.           Response.Write("<table border=""0"" cellspacing=""1"" cellpadding=""0"" bgcolor=""#000000"" align=""center"" width=""85%"">" & vbcrlf)  
  99.           Response.Write("  <tr align=""center"" height=""30"" bgcolor=""#FFFFFF"">" & vbcrlf)  
  100.           Response.Write("    <td width=""33%"">Name</td>" & vbcrlf &  "    <td>Enable</td>" & vbcrlf & "    <td>IsSent</td>" & vbcrlf)  
  101.           Response.Write("  </tr>" & vbcrlf)  
  102.           For i = 0 To SWEmail_intMailobjects  
  103.               On Error Resume Next 
  104.               Set objTest = CreateObject(CStr(SWEmail_aryMailObject(i,0)))  
  105.               Response.Write("  <tr align=""center"" height=""25"" bgcolor=""#FFFFFF"">" & vbcrlf)  
  106.               Response.Write("    <td>" & SWEmail_aryMailObject(i,0) & "</td>" & vbcrlf)  
  107.               If err.Number <> 0 Then   '查看错误原因  
  108.                   On Error Goto 0  
  109.                   Response.Write(    "    <td>No</td>" & vbcrlf)  
  110.                   Response.Write(    "    <td>No</td>" & vbcrlf)  
  111.               Else 
  112.                   SWEmail_strMailObject = SWEmail_aryMailObject(i,0)  
  113.                   SWEmail_intMailType = SWEmail_aryMailObject(i,1)  
  114.                   Response.Write(    "    <td>Yes</td>" & vbcrlf)  
  115.                   sReturn = Send(sFrom,sFromName,sTo,sSubject,sBody)  
  116.                   If (sReturn = TrueThen 
  117.                       Response.Write("    <td>Success</td>" & vbcrlf)  
  118.                   Else 
  119.                       If sReturn = False Then 
  120.                           Response.Write("    <td>Failed</td>" & vbcrlf)  
  121.                       Else 
  122.                           Response.Write("    <td>" & sReturn & "</td>" & vbcrlf)  
  123.                       End If 
  124.                   End If 
  125.               End If 
  126.               Response.Write("  </tr>" & vbcrlf)  
  127.           Next 
  128.           Response.Write("</table>" & vbcrlf)  
  129.       End Sub 
  130.  
  131.       '自动检测服务器支持的组件并设置,如果成功返回True,否则返回False  
  132.       Function AutoSet()  
  133.           Dim i,objTest  
  134.  
  135.           '没检测到发送邮件的组件  
  136.           AutoSet = False 
  137.  
  138.           SWEmail_strMailObject = "" 
  139.           SWEmail_intMailType = "" 
  140.           For i = 0 To SWEmail_intMailobjects  
  141.               On Error Resume Next 
  142.               Set objTest = CreateObject(SWEmail_aryMailObject(i,0))  
  143.               If err.Number = 0 Then 
  144.                   '只要检测到就退出,不继续检测!  
  145.                   AutoSet = True 
  146.                   SWEmail_strMailObject = SWEmail_aryMailObject(i,0)  
  147.                   SWEmail_intMailType = SWEmail_aryMailObject(i,1)  
  148.                   Exit Function 
  149.               End If 
  150.           Next 
  151.           Set objTest = Nothing 
  152.       End Function 
  153.  
  154.       Function MailErr()  
  155.           MailErr = SWEmail_strError            
  156.       End Function 
  157.         
  158.       '邮件等级设置  
  159.       Sub Speed(str)  
  160.           '0:最慢,1:默认,2,最快  
  161.           If Trim(str) = "" Then 
  162.               str = 1  
  163.           Else 
  164.               str = CInt(str)  
  165.           End If 
  166.  
  167.           Select Case SWEmail_intMailType  
  168.           Case SWEmail_JMail43  
  169.               If str = 0 Then 
  170.                   SWEmail_intSpeed = 5  
  171.               ElseIf str = 1 Then 
  172.                   SWEmail_intSpeed = 3  
  173.               ElseIf str = 2 Then 
  174.                   SWEmail_intSpeed = 1  
  175.               Else 
  176.                   SWEmail_intSpeed = 3  
  177.               End If 
  178.           Case SWEmail_JMail  
  179.               If str = 0 Then 
  180.                   SWEmail_intSpeed = 5  
  181.               ElseIf str = 1 Then 
  182.                   SWEmail_intSpeed = 3  
  183.               ElseIf str = 2 Then 
  184.                   SWEmail_intSpeed = 1  
  185.               Else 
  186.                   SWEmail_intSpeed = 3  
  187.               End If                
  188.           Case SWEmail_CDO  
  189.               SWEmail_intSpeed = str  
  190.           End Select 
  191.       End Sub 
  192.  
  193.       '是否发送HTML邮件  
  194.       Sub IsHTML(bln)  
  195.           SWEmail_blnIsHTML = bln  
  196.       End Sub 
  197.  
  198.       'SMTP服务器地址  
  199.       Sub Server(str)  
  200.           SWEmail_strSMTPServer = str  
  201.       End Sub 
  202.  
  203.       '发信  
  204.       Function Send(from,fromname,go,subject,body)  
  205.           Dim sReturn  
  206.           '发信人的Email地址  
  207.           SWEmail_strFrom     = from  
  208.           '发信人的名字  
  209.           SWEmail_strFromName = fromname  
  210.           '收信人Email地址  
  211.           SWEmail_strTo = go  
  212.           '邮件主题  
  213.           SWEmail_strSubject = subject  
  214.           '邮件内容  
  215.           SWEmail_strBody = body  
  216.  
  217.           sReturn = Execute()  
  218.           If sReturn = True Then 
  219.               Send = True 
  220.           Else 
  221.               Send = sReturn  
  222.           End If 
  223.       End Function 
  224.  
  225.       '密送  
  226.       Sub BCC(str)  
  227.           SWEmail_strBCC = str  
  228.       End Sub 
  229.  
  230.       '抄送  
  231.       Sub CC(str)  
  232.           SWEmail_strCC = str  
  233.       End Sub 
  234.  
  235.       '添加附件  
  236.       Sub AddFile(str)  
  237.           SWEmail_strFiles = str  
  238.       End Sub 
  239.  
  240.       'SMTP验证,只有JMail组件可用  
  241.       Sub SMTPCheck(username,password)  
  242.           SWEmail_strUsername = username  
  243.           SWEmail_strPassword = password  
  244.       End Sub 
  245.  
  246.       '设置邮件组件对象  
  247.       Sub SetObject(str)  
  248.           Dim i  
  249.           For i = 0 To SWEmail_intMailObjects  
  250.               If SWEmail_aryMailObject(i,0) = str Then 
  251.                   SWEmail_strMailObject = str  
  252.                   SWEmail_intMailType = SWEmail_aryMailObject(i,1)  
  253.                   Exit For 
  254.               End If 
  255.           Next 
  256.       End Sub 
  257.  
  258.       '发送邮件主体  
  259.       Function Execute()  
  260.           Dim i,sFilePath,strFileName,strTemp,aryTemp,intUpLimit  
  261.           Dim objMail  
  262.  
  263.           If Trim(SWEmail_strMailObject) = "" Then 
  264.               Execute = "It can't create a null string object." 
  265.               Exit Function 
  266.           End If 
  267.  
  268.           'On Error Resume Next  
  269.  
  270.           Set objMail = CreateObject(SWEmail_strMailObject)  
  271.           If Err.Number <> 0 Then 
  272.               Execute = "Can't create object <font color=""#ff0000"">" & SWEmail_strMailObject & "</font>." 
  273.               Exit Function 
  274.           End If 
  275.  
  276.           Select Case SWEmail_intMailType  
  277.               Case SWEmail_JMail43        'Jmail4.3 发信主体       
  278.                   '屏蔽例外错误  
  279.                   objMail.Silent = True 
  280.                   '启用邮件日志  
  281.                   'objMail.logging = True  
  282.                   objMail.Charset = "GB2312" 
  283.                   objMail.AddRecipient SWEmail_strTo  
  284.                   objMail.AddRecipientBCC SWEmail_strBCC  
  285.                   objMail.AddRecipientCC SWEmail_strCC  
  286.                   objMail.From = SWEmail_strFrom  
  287.                   objMail.MailServerUserName = SWEmail_strUserName  
  288.                   objMail.MailServerPassword = SWEmail_strPassword  
  289.                   objMail.Subject = SWEmail_strSubject  
  290.                   If SWEmail_blnIsHTML = True Then 
  291.                       objMail.ContentType = "text/html" 
  292.                       objMail.HtmlBody = SWEmail_strBody  
  293.                   Else 
  294.                       objMail.Body = SWEmail_strBody  
  295.                   End If 
  296.                   objMail.Priority = SWEmail_intSpeed  
  297.  
  298.                   '发送附件  
  299.                   If Trim(SWEmail_strFiles) <> "" Then 
  300.                       If Instr(SWEmail_strFiles,"$") <> 0 Then 
  301.                           aryTemp = Split(SWEmail_strFiles,"$")  
  302.                           intUpLimit = UBound(aryTemp)  
  303.                           For i = LBound(aryTemp) To intUpLimit  
  304.                               strFileName = Trim(aryTemp(i))  
  305.                               If strFileName <> "" Then 
  306.                                    objMail.AddAttachment (SWEmail_strAttachmentPath & "\" & strFileName)  
  307.                               End If 
  308.                          Next 
  309.                       Else 
  310.                           objMail.AddAttachment (SWEmail_strAttachmentPath & "\" & SWEmail_strFiles)  
  311.                       End If 
  312.                   End If 
  313.  
  314.                   objMail.Send(SWEmail_strSMTPServer)  
  315.                   objMail.Close()  
  316.               Case SWEmail_JMail  
  317.               'Jmail早期版本发信主体  
  318.                   objMail.Silent = True 
  319.                   objMail.logging = True 
  320.                   objMail.Charset = "GB2312" 
  321.                   objMail.ContentType = "text/html" 
  322.                   objMail.ServerAddress = SWEmail_strSMTPServer  
  323.                   objMail.AddRecipient SWEmail_strTo  
  324.                   objMail.AddRecipientBCC SWEmail_strBCC  
  325.                   objMail.AddRecipientCC SWEmail_strCC  
  326.                   objMail.SenderName = SWEmail_strFromName  
  327.                   objMail.Sender = SWEmail_strFrom  
  328.                   objMail.Priority = SWEmail_intSpeed  
  329.                   objMail.Subject = SWEmail_strSubject  
  330.                   objMail.Body = SWEmail_strBody  
  331.  
  332.                   '发送附件  
  333.                   If Trim(SWEmail_strFiles) <> "" Then 
  334.                       If Instr(SWEmail_strFiles,"$") <> 0 Then 
  335.                           aryTemp = Split(SWEmail_strFiles,"$")  
  336.                           intUpLimit = UBound(aryTemp)  
  337.                           For i = LBound(aryTemp) To intUpLimit  
  338.                               strFileName = Trim(aryTemp(i))  
  339.                               If strFileName <> "" Then 
  340.                                    objMail.AddAttachment (SWEmail_strAttachmentPath & "\" & strFileName)  
  341.                               End If 
  342.                          Next 
  343.                       Else 
  344.                           objMail.AddAttachment (SWEmail_strAttachmentPath & "\" & SWEmail_strFiles)  
  345.                       End If 
  346.                   End If 
  347.  
  348.                   objMail.Execute()  
  349.                   objMail.Close  
  350.               Case SWEmail_ASPEMail  
  351.                   'ASPMail组件  
  352.                   If Trim(SWEmail_strServer) <> "" Then objMail.Host = SWEmail_strServer  
  353.                   If Trim(SWEmail_strBCC) <> "" Then objMail.AddBcc SWEmail_strBCC   
  354.                   If Trim(SWEmail_strUsername) <>"" Then objMail.Username = SWEmail_strUsername  
  355.                   If Trim(SWEmail_strPassword) <>"" Then objMail.Password = SWEmail_strPassword  
  356.                   objMail.Subject = SWEmail_strSubject  
  357.                   objMail.From = SWEmail_strFrom  
  358.                   objMail.Body = SWEmail_strBody  
  359.                   objMail.AddAddress SWEmail_strTo  
  360.                   objMail.IsHTML = SWEmail_blnIsHTML   
  361.                   objMail.CharSet = "gb2312" 
  362.                   objMail.Priority = SWEmain_intSpeed  
  363.  
  364.                   '发送附件  
  365.                   If Trim(SWEmail_strFiles) <> "" Then 
  366.                       If Instr(SWEmail_strFiles,"$") <> 0 Then 
  367.                           aryTemp = Split(SWEmail_strFiles,"$")  
  368.                           intUpLimit = UBound(aryTemp)  
  369.                           For i = LBound(aryTemp) To intUpLimit  
  370.                               strFileName = Trim(aryTemp(i))  
  371.                               If strFileName <> "" Then 
  372.                                    objMail.AddAttachment (SWEmail_strAttachmentPath & "\" & strFileName)  
  373.                               End If 
  374.                          Next 
  375.                       Else 
  376.                           objMail.AddAttachment (SWEmail_strAttachmentPath & "\" & SWEmail_strFiles)  
  377.                       End If 
  378.                   End If 
  379.               Case SWEmail_ASPMail  
  380.                   objMail.CusTomCharSet  = "gb2312" 
  381.                   objMail.FromAddress = FromMail  
  382.                   objMail.FromName = FromName  
  383.                   objMail.AddRecipient ToMail, ToMail  
  384.                   If ToMailbcc <> "" Then objMail.AddBCC ToMailbcc, ToMailbcc  
  385.                   objMail.Subject = MailSubject  
  386.                   If MailFormat = "html" Then 
  387.                       objMail.ContentType = "text/html" 
  388.                       objMail.BodyText = MailBody  
  389.                   Else 
  390.                       objMail.BodyText = MailBody  
  391.                   End If 
  392.  
  393.                   '发送附件  
  394.                   If Trim(SWEmail_strFiles) <> "" Then 
  395.                       If Instr(SWEmail_strFiles,"$") <> 0 Then 
  396.                           aryTemp = Split(SWEmail_strFiles,"$")  
  397.                           intUpLimit = UBound(aryTemp)  
  398.                             objMail.ClearAttachments  
  399.                           For i = LBound(aryTemp) To intUpLimit  
  400.                               strFileName = Trim(aryTemp(i))  
  401.                               If strFileName <> "" Then 
  402.                                    objMail.AddAttachment (SWEmail_strAttachmentPath & "\" & strFileName)  
  403.                               End If 
  404.                          Next 
  405.                       Else 
  406.                           objMail.AddAttachment (SWEmail_strAttachmentPath & "\" & SWEmail_strFiles)  
  407.                       End If 
  408.                   End If 
  409.  
  410.                   objMail.Priority = SWEmail_intSpeed  
  411.                   objMail.RemoteHost = SWEmail_strServer  
  412.                   objMail.Timeout = 9999  
  413.                   objMail.SendMail  
  414.                   SWEmail_strError = objMail.Response  
  415.               Case SWEmail_EasyWebmail  
  416.                   objMail.CreateNew SWEmail_strFrom, "temp" 
  417.                   objMail.MailName = SWEmail_strFromName  
  418.                   objMail.EM_To = SWEmail_strTo  
  419.                   If Trim(SWEmail_strBCC) <> "" Then objMail.EM_BCC SWEmail_strBCC  
  420.                   objMail.EM_Subject = SWEmail_strSubject  
  421.                   If SWEmail_IsHTML = true Then 
  422.                       objMail.EM_HTML_Text = SWEmail_strBody  
  423.                       objMail.useRichEditer = true  
  424.                   Else 
  425.                       objMail.EM_Text = SWEmail_strBody  
  426.                   End If 
  427.  
  428.                   objMail.EM_Priority = SWEmail_intSpeed  
  429.                   'If TimeMail Then objMail.EM_TimerSEnd = webmailtime  
  430.                     
  431.                   '发送附件  
  432.                   If Trim(SWEmail_strFiles) <> "" Then 
  433.                       If Instr(SWEmail_strFiles,"$") <> 0 Then 
  434.                           aryTemp = Split(SWEmail_strFiles,"$")  
  435.                           intUpLimit = UBound(aryTemp)  
  436.                           For i = LBound(aryTemp) To intUpLimit  
  437.                               strFileName = Trim(aryTemp(i))  
  438.                               If strFileName <> "" Then 
  439.                                    objMail.AddFromAttFileString = SWEmail_strAttachmentPath & "\" & strFileName  
  440.                               End If 
  441.                          Next 
  442.                       Else 
  443.                           objMail.AddAttFileString = SWEmail_strAttachmentPath & "\" & SWEmail_strFiles  
  444.                       End If 
  445.                   End If 
  446.  
  447.                   If objMail.Send() = FALSE Then 
  448.                       SWEmail_strError= "有错误发生" 
  449.                   End If 
  450.               Case SWEmail_CMailServer  
  451.                   objMail.CreateUserPath("ASPMail")  
  452.                   objMail.Subject = SWEmail_strSubject  
  453.                   objMail.Body = SWEmail_strBody  
  454.                   objMail.To = SWEmail_strTo  
  455.                   objMail.From = SWEmail_strFrom  
  456.                   objMail.SendMail  
  457.                   If Left(objMail.LastResponse, 3) <> "+OK" Then 
  458.                       SWEmail_strError = "错误原因:" & objMail.LastResponse  
  459.                   End If 
  460.               Case SWEmail_CDO  
  461.               '微软自带发信主体  
  462.                   objMail.Subject = SWEmail_strSubject  
  463.                   objMail.From = SWEmail_strFrom  
  464.                   objMail.To = SWEmail_strTo  
  465.                     
  466.                   If SWEmail_blnIsHTML Then 
  467.                       objMail.BodyFormat = 0    '支持HTML  
  468.                   Else 
  469.                       objMail.BodyFormat = 1    '支持纯文本  
  470.                   End If 
  471.  
  472.                   '0 表示将采用 MIME 格式  
  473.                   '1 表示将采用连续的纯文本(默认值)  
  474.                   'objMail.MailFormat = 0  
  475.  
  476.                   objMail.Body = SWEmail_strBody  
  477.  
  478.                   '发送附件  
  479.                   If Trim(SWEmail_strFiles) <> "" Then 
  480.                       If Instr(SWEmail_strFiles,"$") <> 0 Then 
  481.                           aryTemp = Split(SWEmail_strFiles,"$")  
  482.                           intUpLimit = UBound(aryTemp)  
  483.                           For i = LBound(aryTemp) To intUpLimit  
  484.                               strFileName = Trim(aryTemp(i))  
  485.                               If strFileName <> "" Then 
  486.                                   objMail.AttachFile (SWEmail_strAttachmentPath & "\" & strFileName)  
  487.                               End If 
  488.                          Next 
  489.                       Else 
  490.                           objMail.AttachFile (SWEmail_strAttachmentPath & "\" & SWEmail_strFiles)  
  491.                       End If 
  492.                   End If 
  493.                     objMail.Send  
  494.           End Select 
  495.           If Err.Number <> 0 Then 
  496.               If Trim(err.Description) <> "" Then Execute = Err.Description & "  
  497. "  
  498.           Else 
  499.               Execute = True 
  500.           End If 
  501.           Set objMail = Nothing 
  502.       End Function 
  503.  
  504.       '清空内容  
  505.       Sub Close()  
  506.           SWEmail_strMailObject = "" 
  507.           SWEmail_intMailType = "" 
  508.           strMailName = "" 
  509.           SWEmail_strFiles = "" 
  510.     
  511.           SWEmail_intSpeed = "" 
  512.           '释放数组  
  513.             Erase SWEmail_aryMailObject  
  514.       End Sub 
  515.   End Class 
  516. %> 


upload.asp的源码:

  1. <%  
  2.   If Trim(Request.ServerVariables("HTTP_REFERER"))="" Then  
  3. 'Response.Write(Request.ServerVariables("HTTP_REFERER"))  
  4. 'Response.End  
  5.       Response.Redirect "mail.asp"  
  6.    Response.End  
  7.   End If  
  8. %> 
  9. <!--#include file="inc_set.asp"--> 
  10. <html> 
  11. <head> 
  12. <title>文件上传</title> 
  13. <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
  14. <style type="text/css"> 
  15. <!--  
  16. .tx {  height: 16px; width: 30px; border-color: black black #000000; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 1px; border-left-width: 0px; font-size: 9pt; background-color: <%=clrGeneralTR%>; color: #0000FF}  
  17. .tx1 { height: 20px; width: 30px; font-size: 9pt; border: 1px solid; border-color: black black #000000; color: #0000FF}  
  18. --> 
  19. </style> 
  20. </head> 
  21.  
  22. <body topmargin="0"> 
  23. <table border="1"> 
  24. <tr> 
  25. <td> 
  26.  
  27.       
  28. <form name="form1" method="post" action="uploadok.asp" enctype="multipart/form-data"> 
  29.   <table width="88%" border="0" cellspacing="1" cellpadding="0" align="center"> 
  30.       
  31.  <tr bgcolor="<%=clrTitleTR%>">   
  32.       <td height="28" align="center" valign="middle" bgcolor="<%=clrTitleTR%>"><b>文件上传</b></td> 
  33.     </tr> 
  34.     <tr align="left" valign="middle" bgcolor="<%=clrGeneralTR%>">   
  35.       <td height="92">   
  36.         <script language="javascript"> 
  37. <!--  
  38.    function setid()  
  39.    {  
  40.    str='  
  41. ';  
  42.    if(!window.form1.upcount.value)  
  43.     window.form1.upcount.value=1;  
  44.     for(i=1;i<=window.form1.upcount.value;i++)  
  45.       str+='文件'+i+':<input type="file" name="file'+i+'" style="width:350" class="tx1">    文件重命名:<input type="text" name="filename'+i+'" style="width:100" class="tx"> 
  46.  
  47. ';  
  48.    window.upid.innerHTML=str+'  
  49. ';  
  50.    }  
  51. file://--> 
  52.    </script> 
  53.                 <li> 需要上传的个数   
  54.           <input type="text" name="upcount" class="tx" value="2"> 
  55.           <input type="button" name="Button" class="button" onclick="setid();" value="设置"> 
  56.         </li> 
  57.       </td> 
  58.     </tr> 
  59.     <tr align="center" valign="middle" bgcolor="<%=clrGeneralTR%>">   
  60.       <td align="left" id="upid" height="122"> 文件1:   
  61.         <input type="file" name="file1" style="width:200" class="tx1" value="">    
  62. <input type="text" name="filename1" style="width:30" class="tx"> 
  63.       </td> 
  64.     </tr> 
  65.     <tr align="center" valign="middle" bgcolor="<%=clrTitleTR%>">   
  66.       <td height="28" bgcolor="<%=clrTitleTR%>"></td> 
  67.     </tr> 
  68.  <tr> 
  69.      <td> 
  70.       <input type="submit" name="action" value="上传" class="button"> 
  71.   </td> 
  72.  </tr> 
  73.   </table> 
  74. </form> 
  75.          
  76. </td> 
  77. </tr> 
  78. </table> 
  79. </body> 
  80. </html> 
  81. <script language="javascript"> 
  82. <!--  
  83. setid();  
  84. file://--> 
  85. </script> 

uploadok.asp的源码:

  1. <%Option Explicit  
  2.   Response.Expires = 0  
  3. %>  
  4. <!--#include file="inc_clsUpload.asp"-->  
  5. <%  
  6.   Private Function FormatStr(str)  
  7.       str = Trim(BinToStr(str))  
  8.       str = Replace(str,"'","''")   
  9.    str = Replace(str,vbcrlf,"")  
  10.       FormatStr = str  
  11.   End Function 
  12.  
  13.   '设置文件上传路径,此目录必须存在,否则会出错  
  14.   Private Const svrUploadFilePath = "attachmentfiles" 
  15.  
  16.   Dim strNewName,sNewname,strSQL,strNoPic,strInfo,strFileName,strFilePath  
  17.   Dim intFormSize,intFileCount,I  
  18.   Dim binFormData,binTextData,binFileData  
  19.   Dim aryFileName  
  20.   Dim objUpload  
  21.  
  22.   '获取表单数据的大小  
  23.   intFormSize = Request.TotalBytes  
  24.  
  25.   '获取所有的表单数据  
  26.   binFormData = Request.BinaryRead(intFormSize)  
  27.   '创建上传类  
  28.   Set objUpload = New Upload  
  29.     
  30.   '初始化表单提交的数据中  
  31.   objUpload.Init(binFormData)  
  32.  
  33.   '清空数据  
  34.   binFormData = "" 
  35.   strInfo = "" 
  36.  
  37.   intFileCount = objUpload.FileCount  
  38.     
  39.   '设置上传文件存放的路径  
  40.   objUpload.SetPath(svrUploadFilePath)  
  41.  
  42.   '获取上传文件的存放路径  
  43.   'strFilePath = objUpload.GetPath  
  44.  
  45.   '设置允许上传的文件格式,多种格式以|分隔  
  46.   objUpload.AllowFiles ("zip|rar|jpg|png|bmp|txt|htm|html")   
  47.  
  48.   '获取默认文件名列表  
  49.   strFileName = objUpload.FileName  
  50.   aryFileName = Split(strFileName,",")  
  51.  
  52.   If intFileCount > 1 Then 
  53.       For i = 1 To intFileCount  
  54.        sNewname = objUpload.FormName("filename" & i)  
  55.     If sNewname = "" Then sNewname = aryFileName(i-1)  
  56.        If strNewname = "" Then 
  57.               strNewname = strNewname & sNewname  
  58.           Else 
  59.         strNewname = strNewname & "," & sNewname  
  60.     End If 
  61.    Next 
  62.   Else 
  63.       strNewname = objUpload.FormName("filename1")  
  64.   End If 
  65.  
  66.   '清空文本内容  
  67.   binTextData = "" 
  68.   Dim strAttachmentFiles  
  69.  
  70.   If strInfo = "" Then 
  71.       If strNewName = "" Then strNewName = strFileName  
  72.       If objUpload.FileExist(strNewName) Then'如果文件不存在,则保存文件  
  73.           If objUpload.SaveFile(strNewName) Then 
  74.         strAttachmentFiles = strAttachmentFiles & strNewName & "," 
  75. '        strInfo = strInfo  & objUpload.ErrorInfo  
  76. '          Else  
  77. '        strInfo = strInfo &  objUpload.ErrorInfo  
  78.           End If 
  79. '   Else  
  80. '       strInfo = strInfo & objUpload.ErrorInfo  
  81.       End If 
  82.   End If 
  83.  
  84.   Dim oConn,oRS,sConn  
  85.  
  86.   strSQL = "UPDATE [attachment] SET filenames='" & Left(strAttachmentFiles,Len(strAttachmentFiles)-1) & "' WHERE id=" & Session("Attachment_ID")  
  87.  
  88.  
  89.   sConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.Mappath("attachment.mdb")  
  90. '   sConn = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" & Server.Mappath("attachment.mdb")  
  91.    Set oConn = CreateObject("Adodb.Connection")  
  92.  
  93.   oConn.Open sConn  
  94.   Set oRS = oConn.Execute(strSQL)  
  95.   Set oConn = Nothing 
  96.   Response.Redirect "mail.asp" 
  97.   Response.End 
  98. %> 

inc_clsUpload.asp的源码:

  1. <%  
  2.    '*****************************************  
  3.    ' 目的:    将Binary字符转成String。  
  4.    ' 输入:    str:   需要转换Binary。  
  5.    ' 返回:    转换后的String,并把string中的'替换成'',换行符去掉。  
  6.    '*****************************************  
  7.    Private Function BinToStr(str)  
  8.        Dim i,strTemp  
  9.        strTemp = "" 
  10.        For i=1 To LenB(str)  
  11.            If AscB(MidB(str, i, 1)) > 127 Then 
  12.                strTemp = strTemp & Chr(Ascb(MidB(str, i, 1))*256+Ascb(MidB(str, i+1, 1)))  
  13.                i = i + 1  
  14.            Else 
  15.                strTemp = strTemp & Chr(AscB(MidB(str, i, 1)))  
  16.            End If 
  17.        Next 
  18.        strTemp = Replace(Replace(Trim(strTemp),"'","''"),VBCRLF,"")  
  19.        BinToStr=strTemp  
  20.    End Function 
  21.  
  22.    '*****************************************  
  23.    ' 目的:    将String转成Binary。  
  24.    ' 输入:    str:   需要转换的String。  
  25.    ' 返回:    转换后的二进制字符串。  
  26.    '*****************************************  
  27.    Private Function StrToBin(str)  
  28.        Dim i, binTemp  
  29.        For i = 1 To Len(str)  
  30.            binTemp = binTemp & ChrB(Asc(Mid(str,I,1)))  
  31.        Next   
  32.        StrToBin = binTemp  
  33.    End Function 
  34.      
  35.    Class Upload  
  36.     '文件名、文件路径、错误信息、文件信息、允许上传的文件后缀名  
  37.        Dim strFileName,strFilePath,strErrorInfo,strFileInfo,strAllowed  
  38.     '文件开始位置、文件大小、文件个数  
  39.        Dim intFileStart,intFileSize,intFileCount  
  40.     'AdoStream对象objData和Dictionary对象objFiles  
  41.        Dim objData,objFiles  
  42.     '二进制数据  
  43.     Dim binTxtData  
  44.  
  45.        '以上变量均为Class级变量,可在此Class的所有过程函数中使用  
  46.  
  47.        '*****************************************  
  48.        ' 目的:    将文件与文本数据分离,保存文件到Dictionary对象  
  49.        ' 输入:    formdata:  为表单提交的所有数据           
  50.        ' 返回:    无  
  51.        '*****************************************  
  52.        Sub Init(formdata)  
  53.            Dim BnCrlf,binName,binFileName,binQuotation,binSpace,binFileContent  
  54.            Dim sStart,sInfo,sFileName,sFormName,sFormValue  
  55.            Dim iStart,iFormStart,iFormEnd,iInfoStart,iInfoEnd,iFindStart,iFindEnd,iValStart,iValEnd,iFileName   
  56.         
  57.         Set objFiles = Server.CreateObject("Scripting.Dictionary")  
  58.         Set objData = Server.CreateObject("Adodb.Stream")  
  59.            objData.Type = 1  
  60.            objData.Mode = 3  
  61.            objData.Open  
  62.            objData.Write formdata  
  63.       
  64.            BnCrlf = ChrB(13) & ChrB(10)  
  65.            binName = StrToBin("name=""")  
  66.            binFileName = StrToBin("filename=""")  
  67.            binQuotation = StrToBin("""")  
  68.            binSpace = StrToBin(" ")  
  69.            intFileCount = 0    '文件个数清零  
  70.  
  71.            iFormEnd = LenB(formdata)  
  72.            iFormStart = 1  
  73.            '-----------------------------7d320717017a  
  74.            sStart = MidB(formdata,1,InStrB(1,formdata,bnCrlf)-1)  
  75.       
  76.            iStart = LenB(sStart)  
  77.            iFormStart = iFormStart+iStart+1  
  78.            While iFormStart + 10 < iFormEnd  
  79.                iInfoEnd = InStrB(iFormStart,formdata,BnCrlf&BnCrlf)+1  
  80.          sInfo = MidB(formdata,iFormStart,iInfoEnd-iFormStart)  
  81.  
  82.          'Find form name  
  83.          iFormStart = InStrB(iInfoEnd,formdata,sStart)  
  84.                iFindStart = InStrB(11,sInfo,binName,1)  
  85.                iFindEnd = InStrB(iFindStart+6,sInfo,binQuotation,1)  
  86.  
  87.          sFormName = MidB(sInfo,iFindStart,iFindEnd-iFindStart)  
  88.                '取得表单值起始位置  
  89.                iValStart = iInfoEnd + 1  
  90.                '如果是文件  
  91.             If InStrB (22,sInfo,binFileName,0) > 0 Then 
  92.              '取得文件名  
  93.              iFindStart = InStrB(iFindEnd,sInfo,binFileName,0) + 10  
  94.             iFindEnd = InStrB(iFindStart,sInfo,binQuotation,1)  
  95.             sFileName = MidB(sInfo,iFindStart,iFindEnd-iFindStart)  
  96.       sFileName = BinToStr(sFileName)  
  97.                   iFileName = InstrRev(sFileName,"\",-1) + 1  
  98.                   sFileName = Mid(sFileName,iFileName,Len(sFileName)-iFileName + 1)  
  99.       If Trim(strFileName) <> "" Then 
  100.           strFileName = strFileName & "," & sFileName  
  101.       Else 
  102.           strFileName = sFileName  
  103.       End If 
  104.          '文件开始位置  
  105.          intFileStart = iInfoEnd  
  106.          '文件大小  
  107.          intFileSize = iFormStart -iInfoEnd  
  108.                   '文件内容  
  109.       'binFileContent = MidB(formdata,intFileStart,intFileSize)  
  110.                     
  111.       '添加文件,以文件名为关键字  
  112.       If Not objFiles.Exists(sFileName) Then 
  113.                 objFiles.Add sFileName,intFileStart & "," & intFileSize  
  114.       Else 
  115.           strErrorInfo = strErrorInfo & "  
  116. 文件 <b>" & sFileName & "</b> 已经存在!"  
  117.        Exit Sub 
  118.             End If 
  119.  
  120.       '统计文件个数  
  121.       intFileCount = intFileCount + 1  
  122.             Else  '如果是表单项目  
  123.           iValEnd = iFormStart-iInfoEnd-3  
  124.           If iValEnd> 0 Then 
  125.            sFormValue = MidB(formdata,iValStart,iValEnd)  
  126.           Else 
  127.              sFormValue = "" 
  128.           End If 
  129.           binTxtData = binTxtData & sFormname & StrToBin(":") & sFormValue & StrToBin("""")  
  130.             End If 
  131.          iFormStart=iFormStart + iStart + 1  
  132.         Wend  
  133.         formdata="" 
  134.        End Sub 
  135.  
  136.     '*****************************************  
  137.        ' 目的:    限制文件上传的类型,只能许sAllow格式的文件  
  138.        ' 输入:    strLimit,允许上传的文件格式,多种格式用|分开  
  139.     '            
  140.        ' 返回:    允许上传的文件格式(多种格式用|分开)  
  141.        '*****************************************  
  142.        Sub AllowFiles(sAllow)  
  143.         strAllowed = sAllow  
  144.     End Sub 
  145.  
  146.     '*****************************************  
  147.        ' 目的:    检查文件后缀是否为被允许的文件格式  
  148.        ' 输入:    filename  
  149.     '            
  150.        ' 返回:    如果是允许的文件格式返回True,否则返回False     
  151.        '*****************************************  
  152.        Function IsAllowed(filename)  
  153.         Dim intStart  
  154.         IsAllowed = False 
  155.      If strAllowed = "" Then 
  156.          IsAllowed = True 
  157.      Else 
  158.          filename=Trim(filename)  
  159.              If Trim(filename) <> "" Then          
  160.              intStart = InstrRev(filename,".")  
  161.        If intStart > 0 Then 
  162.               If Instr(strAllowed,Mid(filename,intStart+1,Len(filename)-intStart))>0 Then 
  163.             IsAllowed = True 
  164.         End If 
  165.           End IF  
  166.          End If 
  167.      End If 
  168.     End Function 
  169.      
  170.     '*****************************************  
  171.        ' 目的:    统计文件个数  
  172.        ' 输入:    无  
  173.        ' 返回:    返回上传的文件个数  
  174.     ' 说明:    intFileCount是一个Class级变量,在本Class内有效  
  175.     '          在函数PickData过程中,统计文件个数  
  176.        '*****************************************       
  177.        Function FileCount()  
  178.         FileCount = intFileCount  
  179.        End Function 
  180.  
  181.     '*****************************************  
  182.        ' 目的:    将二进制数据写入文件  
  183.        ' 输入:    FileName:  文件名  
  184.        ' 返回:    保存成功返回TRUE,失败则返回错误信息  
  185.        '*****************************************       
  186.        Function SaveFile(filename)  
  187.         Dim i,iFileCount  
  188.            Dim objSaveFile  
  189.      Dim sFileName,sNewpath,binFileCount  
  190.      Dim aryFileName,aryNewName,aryFileInfo  
  191.         SaveFile = True 
  192.            Set objSaveFile = Server.CreateObject("Adodb.Stream")   
  193.            objSaveFile.Mode=3 '3表示adModeReadWrite  
  194.            objSaveFile.Type=1 '1表示adTypeBinary  
  195.            objSaveFile.Open()  
  196.         'On Error Resume Next  
  197.        
  198.      If Trim(filename) = "" Then filename = strFileName  
  199.      If Instr(filename,",")>0 Then 
  200.          '多文件  
  201.          aryFileName = Split(strFileName,",")  
  202.       aryNewname = Split(filename,",")  
  203.                For i =LBound(aryNewName) To UBound(aryNewName)  
  204.              sFileName = aryFileName(i)  
  205.        If IsAllowed(sFileName) Then  '是否为允许的文件格式  
  206.            objSaveFile.Position = 0  
  207.            aryFileInfo = Split(objFiles.Item(sFileName),",")  
  208.            'objSaveFile.Write objFiles.Item(sFileName)  
  209.            objData.Position = aryFileInfo(0) + 2  
  210.            objData.CopyTo objSaveFile,aryFileInfo(1)  
  211.            sNewPath = Server.Mappath(strfilepath&sFileName)  
  212. '          strFileInfo = strFileInfo & FileName & "<Br>"  
  213.                strErrorInfo = strErrorInfo & "  
  214. 文件 <Font Color=""#FF0000"">" & sFileName & "</Font>上传成功"  
  215.            '存成文件,2表示adSaveCreateOverWrite  
  216.                        objSaveFile.SaveToFile sNewPath,2  
  217.        Else 
  218.            strErrorInfo = strErrorInfo & "  
  219. 文件 <font color=""#ff00000"">" & sFileName & "</font> 为不被允许上传的文件,请检查文件后缀  
  220. "  
  221.         SaveFile = False 
  222.         'Exit Function  
  223.        End If 
  224.       Next 
  225.      Else 
  226.          '单文件  
  227.       If IsAllowed(strFileName) Then  '是否为允许的文件格式  
  228.           aryFileInfo = Split(objFiles.Item(strFileName),",")  
  229.           objData.Position = aryFileInfo(0) + 2  
  230.           objData.CopyTo objSaveFile,aryFileInfo(1)  
  231.           sNewPath =  Server.Mappath(strFilePath&FileName)  
  232. '          strFileInfo = strFileInfo & FileName & "<Br>"  
  233.            strErrorInfo = strErrorInfo & "  
  234. 文件 <Font Color=""#FF0000"">" & FileName & "</Font>"  
  235.                    objSaveFile.SaveToFile sNewPath,2  
  236.          Else 
  237.           strErrorInfo = strErrorInfo & "  
  238. 文件 <Font Color=""#FF0000"">" & sFileName & "</font> 为不被允许上传的文件,请检查文件后缀!"  
  239.        SaveFile = False 
  240.        'Exit Function  
  241.       End If 
  242.      End If 
  243.        
  244.      objSaveFile.Close  
  245.            Set objSaveFile = Nothing 
  246.      objData.Close  
  247.      Set objData = Nothing 
  248.      Set objFiles = Nothing 
  249.      'If err.Number <> 0 Then SaveFile = False  
  250.        End Function 
  251.  
  252.        '*****************************************  
  253.        ' 目的:    获取表单项的值  
  254.        ' 输入:    name:  为要寻找的字段变量  
  255.        '          txtdata:   为已从图象中分离出来的的所有文本  
  256.        ' 返回:    表单项的值  
  257.        '*****************************************  
  258.        Function FindInput(fName,txtdata)  
  259.            Dim intStartPos,intEndPos,intNameLen,intValEnd,i,bReturn  
  260.            intStartPos = 1  
  261.            intNameLen = LenB(StrToBin("name=""" & fName & ":"))  
  262.            intStartPos = InstrB(intStartPos,txtdata,fName,1) + intNameLen  
  263.         If intStartPos > intNameLen Then 
  264.             intEndPos = InstrB(intStartPos-3,txtdata,StrToBin(""""))  
  265.          bReturn = bReturn & MidB(txtdata,intStartPos,intEndPos-intStartPos)  
  266.          intValEnd = intEndPos  
  267.                '表单中可能有多个同名变量(用在有主表与明细表中的数据更新中)  
  268.          Do   
  269.              intStartPos = Instr(intValEnd,txtdata,fName) + intNameLen  
  270.              If intStartPos > intNameLen Then 
  271.               intValEnd = Instr(intStartPos,txtdata,"""")  
  272.              bReturn = bReturn & "," & Mid(intStartPos,txtdata,intEndPos-intStartPos)  
  273.           End If 
  274.          Loop While (intStartPos > intNameLen)  
  275.            End If 
  276.      FindInput = bReturn  
  277.        End Function 
  278.  
  279.     '*****************************************  
  280.        ' 目的:    检测文件是否存在  
  281.        ' 输入:    filename:  文件名        
  282.        ' 返回:    文件存在返回False,文件不存在返回True  
  283.        '*****************************************  
  284.        Function FileExist(filename)  
  285.            Dim objFSO,objFile  
  286.      Dim sPath,sError  
  287.      Dim i  
  288.  
  289.      FileExist = False 
  290.        If Trim(filename) = "" Then 
  291.          strErrorInfo = strErrorInfo  & "<Br>文件名不能为空!" 
  292.          Exit Function 
  293.      End If 
  294.      Set objFSO = Server.CreateObject("Scripting.FileSystemObject")  
  295.              
  296.      If Instr(filename,",")>0 Then 
  297. 'Response.Write("  
  298. @" & filename & "@  
  299. ")  
  300.          aryFileName = Split(filename,",")  
  301.       For i = LBound(aryFileName) To UBound(aryFileName)  
  302. 'Response.Write("  
  303. file:" & strFilePath &"#" &  aryFileName(i) & " 
  304. ")  
  305.           sPath = Server.Mappath(strFilePath & aryFileName(i))  
  306.           If objFSO.FileExists(sPath) Then 
  307.            sError = sError & "  
  308. 文件 " & aryFileName(i) & " 已经存在!"  
  309.        End If 
  310.       Next 
  311.      Else 
  312.             sPath = Server.Mappath(strFilePath & filename)  
  313.             If objFSO.FileExists(sPath) Then 
  314.           sError = sError & "  
  315. 文件 " & filename & " 已经存在!"  
  316.             End If 
  317.      End If 
  318.         Set objFSO = Nothing 
  319.      If Trim(sError) <> "" Then 
  320.          strErrorInfo = strErrorInfo & sError  
  321.      Else 
  322.       FileExist = True 
  323.      End If 
  324.        End Function 
  325.    
  326.        '*****************************************  
  327.        ' 目的:    获取表单项的值  
  328.        ' 输入:    name:  为要寻找的字段变量  
  329.        ' 返回:    转成普通字符串后的表单项的值  
  330.        '*****************************************  
  331.        Function FormName(aName)  
  332.            Dim binFormName,binTest  
  333.      'binTxtData已经分离出来的文件数据  
  334.            binFormName = FindInput(aName,binTxtData)  
  335.         FormName = BinToStr(binFormName)  
  336.        End Function 
  337.  
  338.        '*****************************************  
  339.        ' 目的:    设置文件存放路径  
  340.        ' 输入:    str:  文件存放相对路径           
  341.        ' 说明:    将输入的str赋给Class级变量FilePath,记录文件相对路径     
  342.        '*****************************************  
  343.        Sub SetPath(str)  
  344.         strFilePath = str & "\" 
  345.        End Sub 
  346.  
  347.     '*****************************************  
  348.        ' 目的:    获取文件存放相对路径  
  349.        ' 输入:    无           
  350.        ' 返回:    返回文件存放相对路径     
  351.        '*****************************************  
  352.        Function GetPath()  
  353.         GetPath = strFilePath  
  354.     End Function 
  355.  
  356.     '*****************************************  
  357.        ' 目的:    获取错误信息  
  358.        ' 输入:    无  
  359.        ' 返回:    返回错误信息  
  360.        '*****************************************  
  361.        Function ErrorInfo()  
  362.         ErrorInfo = strErrorInfo  
  363.        End Function 
  364.  
  365.      '*****************************************  
  366.        ' 目的:    获取文件名或文件名列表  
  367.        ' 返回:    文件名或文件名列表  
  368.        '*****************************************  
  369.        Function FileName()  
  370.         FileName = strFileName  
  371.        End Function 
  372.   End Class 
  373. %> 

inc_set.asp的源码:

  1. <%  
  2.    Private Const HTMLTitle = "WEB内容管理系统" 
  3.    'TOP。htm中行的颜色  
  4.    Private Const ClrTopTR = "#D1A798" 
  5.  
  6.    '表格的颜色  
  7.    Private Const clrLeftTD = "#B57560" 
  8.    Private Const clrRightTD = "#A6624A" 
  9.    Private Const clrTitleTR = "#C18B79" 
  10.    Private Const clrGeneralTR = "#CEA293" 
  11.    Private Const clrBottmTR = "#C18B79" 
  12. %> 


四、商业应用中的问题

  优点:1.支持多种发送邮件组件;
      2.支持发送多附件。

  缺点:1.对附件大小没有限制;
      2.如果附件已经存在于服务器上,无法再上传;
      3.对填写的表单信息是否为空,没进行判断;

五、注意事项

  本程序主要目的是学习,不适合用于商业,因为在使用中还有问题存在,当然你可以对其进行完善再应用到商业上。大家,在使用过程中,如发现问题,可以到论坛问http://www.blueidea.com/bbs,也可以发email给我cjj8110@hotmail.com(也是我的MSN地址)。最后,感谢各位兄弟帮忙测试。Jmail部分代码已测试通过,用CDO发附件,及其它发信组件还没有测试,由于条件有限,只能到此为止了。

  还有一点,在存入程序文件的目录下,需要建一文件夹attachmentfiles(用于存放附件),此文件夹是必须的。

本日志由 flyinweb 于 2009-06-19 13:56:58 发表到 WEB应用开发 中,目前已经被浏览 177 次,评论 0 次;

作者添加了以下标签: asp发邮件

Active Server Pages 事件 
事件 ID 说明 
100 内存不足 - 无法分配所需的内存。 
101 意外错误 - 函数返回|。 
102 需要字符串输入 - 函数需要字符串输入。 
103 需要数字输入 - 函数需要数字输入。 
104 不允许操作。 
105 索引越界 - 数组索引越界。 
106 类型不匹配 - 遇到未处理的数据类型。 
107 堆栈溢出 - 处理中的数据超过允许的极限。 
108 创建对象失败。创建对象 '%s' 时出错。 
109 找不到成员。 
110 未知的名称。 
111 未知的界面。 
112 遗失参数。 
113 脚本超时 - 超过了脚本运行的最长时间。您可以通过指定 Server.ScriptTimeOut 属性值来修改此限制或用 IIS 管理工具来修改它。 
114 非自由线程的对象 - 应用程序对象只接受自由线程的对象;'%s' 不是自由线程的对象。 
115 意外错误 - 外部对象中发生一个可捕捉的错误 (%X)。脚本无法继续执行。 
116 缺少关闭脚本分隔符 - Script 块缺少脚本关闭标记 (%>)。 
117 缺少关闭脚本标记 - Script 块缺少脚本关闭标记 (</SCRIPT>) 或关闭标记符号 (>)。 
118 缺少关闭对象标记 - Object 块缺少关闭对象标记 (</OBJECT>) 或关闭标记符号 (>)。 
119 缺少 Classid 或 Progid 属性 - 对象实例 '|' 需要对象标记中有正确的 Classid 或 Progid。 
120 不正确的 Runat 属性 - Script 标记或 Object 标记的 Runat 属性只能有 'Server' 值。 
121 对象标记内的不正确作用域 - 对象范例 '|' 不能有 Application 或 Session 作用域。要创建有 Session 或 Application 作用域的对象范例,请将 Object 标记放在 Global.asa 文件中。 
122 对象标记中的无效作用域 - 对象范例 '|' 必须有 Application 或 Session 作用域。这适用于所有在 Global.asa 文件内创建的对象。 
123 缺少标识属性 - 缺少必需的 Object 标记的 Id 属性。 
124 缺少 Language 属性 - 缺少必需的 Script 标记中的 Language 属性。 
125 缺少属性的关闭符 - '|' 属性值没有关闭符。 
126 找不到包含文件 - 找不到包含文件 '|'。 
127 缺少 HTML 注解的关闭符 - HTML 注解或服务器端包含缺少关闭标记 (-->)。 
128 缺少 File 或 Virtual 属性 - 包含文件名必须用 File 或 Virtual 属性来指定。 
129 未知的脚本语言 - 服务器上找不到脚本语言 '|'。 
130 无效的 File 属性 - File 属性 '|' 不能以向前或向后的斜线打头。 
131 不允许的父路径 - 包含文件 '|' 不能包含 '..' 来指出父目录。 
132 编译错误 - 无法处理 Active Server Page '|' 。 
133 不正确的 ClassID 属性 - 对象标记有不正确的 '|' ClassID。 
134 不正确的 ProgID 属性 - 对象标记有不正确的 '|' ProgID。 
135 循环包括 - 文件 '|' 包括它本身 (可能非直接地) 。请检查包含文件中的其他 Include 语句。 
136 无效对象范例名 - 对象范例 '|' 正试着使用一个保留字。这个名称被 Active Server Pages 的本质对象使用。 
137 无效通用脚本 - Script 块必须是允许的 Global.asa 过程之一。Script 原语在<% ...%> 不允许在 global.asa 文件中。允许的过程只能是 Application_OnStart ,Application_OnEnd ,Session_OnStart ,或 Session_OnEnd。 
138 嵌套的 Script 块 - Script 块不能放在另一个 Script 块内。 
139 嵌套的 Object - Object 标记不能放在另一个 Object 标记内。 
140 Page 命令无序 - @ 命令必须是 Active Server Page 的第一个命令。 
141 Page 命令重复 - @ 命令只可以在 Active Server Page 中使用一次。 
142 线程令牌错 - 打开线程令牌失败。 
143 无效应用程序名 - 找不到有效的应用程序名。 
144 初始化错误 - 初始化时页级的对象列表失败。 
145 新建应用程序失败 - 不能添加新应用程序。 
146 新建会话失败 - 不能添加新会话。 
147 服务器错。 
148 服务器太忙。 
149 正重启动应用程序 - 当应用程序正重启动时不能处理请求。 
150 应用程序目录错 - 不能打开应用程序目录。 
151 更改通知错 - 不能创建更改通知事件。 
152 安全错误 - 处理用户安全凭据时发生错误。 
153 线程错 - 新线程请求失败。 
154 写 HTTP 头错 - HTTP 头不能写入到客户浏览器。 
155 写页内容错 - 页内容不能写入到客户浏览器。 
156 头部错 - HTTP 头已经写入到客户浏览器。任何 HTTP 头的修改必须在写入页内容之前。 
157 缓冲已开 - 缓冲打开后不能关闭。 
158 缺少 URL - 需要有 URL。 
159 缓冲已关闭 - 缓冲必须打开。 
160 日志失败 - 将项目写入日志失败。 
161 数据类型错 - 变量转换到字符串失败。 
162 不能修改 Cookie - cookie 的 'ASPSessionID' 不能修改。它是一个保留的 cookie 名。 
163 逗号的使用不正确 - 日志项目中不能使用逗号。请选择另一个分隔符。 
164 超时无效 - 指定了不正确的超时值。 
165 SessionID 错 - 无法创建 SessionID 字符串。 
166 未初始化的对象 - 试图访问未初始化的对象。 
167 会话初始化错 - 当初始化会话对象时发生错误。 
168 不允许的对象使用 - 本质对象不能存在会话对象中。 
169 缺少对象信息 - 缺少信息的对象不能存在会话对象中。需要对象的线程模型信息。 
170 删除会话错 - 会话没有被适当地删除。 
171 缺少路径 - 必须为 MapPath 方法指定路径参数。 
172 路径无效 - MapPath 方法的路径参数必须是一个虚拟路径。使用了一个实际的路径。 
173 无效路径字符 - MapPath 方法的路径参数中有无效字符。 
174 无效路径字符 - MapPath 方法的路径参数中有无效字符 '/' 或 '\\'。 
175 不允许的路径字符 - MapPath 方法的路径参数中不能有 '..' 字符。 
176 找不到路径 - MapPath 方法的路径参数不对应到已知路径。 
177 Server.CreateObject 失败。 
178 Server.CreateObject 访问错误 - 检查权限时 Server.CreateObject 的调用失败。对此对象的访问被拒绝。 
179 应用程序初始化错 - 初始化应用程序对象时发生错误。 
180 不允许的对象使用 - 实质对象不能存在应用程序对象中。 
181 无效线程模型 - 使用 apartment 线程的对象不能存在应用程序对象中。 
182 缺少对象信息 - 缺少信息的对象不能存在 Application 对象中。需要此对象的线程模型信息。 
183 空 Cookie 键 - 不能存储空键的 cookie。 
184 缺少 Cookie 名 - 必须为 cookie 指定一个名称。 
185 缺少默认属性 - 找不到对象的默认属性。 
186 解析证书错。 
187 对象添加冲突 - 不能添加对象到应用程序中。应用程序被另一个添加一个对象的请求锁定。 
188 不允许的对象使用 - 不能添加用 object 标记创建的对象到会话本质中。 
189 不允许的对象使用 - 不能添加用 object 标记创建的对象到应用程序本质中。 
190 意外错误 - 释放外部对象时发生可捕获错误。 
191 意外错误 - 外部对象的 OnStartPage 方法中发生可捕获错误。 
192 意外错误 - 外部对象的 OnEndPage 方法中发生可捕获错误。 
193 OnStartPage 失败 - 外部对象的 OnStartPage 方法中出错。 
194 OnEndPage 失败 - 外部对象的 OnEndPage 方法中出错。 
195 无效服务器方法调用 - 在 Session_OnEnd 及 Application_OnEnd 时不能调用此服务器对象的方法。 
197 不允许的对象使用 - 不能添加 apartment 型的对象到应用程序的实质对象中。 
198 服务器正关闭。不能处理请求。 
199 不允许的对象使用 - 不能添加 JScript 对象到会话中。 
200 'Expires' 属性越界 - 给 'Expires' 的日期早于 1980 年 1 月 1 日,或晚于 2038 年 1 月19 日,3:14:07 GMT。 
201 注册表中有未知脚本 - 注册表中指定的脚本语言 '|' 在服务器上找不到。 
202 缺少代码页 - 缺少代码页属性。 
203 无效代码页 - 指定的代码页属性无效。 
205 更改通知错 - 不能创建更改通知事件。 
206 不能调用 BinaryRead - 使用 Request.Form 后不能调用 BinaryRead。 
207 不能使用 Request.Form - 调用 BinaryRead 后不能使用 Request.Form 收集。 
208 不能使用一般 Request 收集 - 调用 BinaryRead 后不能使用一般 Request 收集。 
209 给TRANSACTION 属性的值非法 - TRANSACTION 属性只能是 REQUIRED,REQUIRES_NEW,SUPPORTED 或 NOT_SUPPORTED。 
210 没有执行方法 - 此方法还未执行。 
211 对象越界 - 内建的 ASP 对象已被参照,该参照不再有效。 
212 不能清除缓冲区 - 客户调试启用时,Response.Flush 之后不能有 Response.Clear。 
214 无效路径参数 - 路径参数超过最允许长度。 
215 给 SESSION 属性的值非法 - SESSION 属性只可以是TRUE 或 FALSE。 
216 MSDTC 服务不在运行 - 如果 MSDTC 服务不在运行就不能运行事务处理的网页。 
217 对象标记内的不正确作用域 - 对象域必须是 Page、Session 或 Application。 
218 缺少 LCID - 缺少 LCID 属性。 
219 无效 LCID - 没有指定的 LCID。 
220 不允许请求 GLOBAL.ASA - 不允许有 URL 指向 GLOBAL.ASA 的请求。 
221 无效 @ Command 原语 - 指定的 '|' 选项未知或无效。 
222 无效 TypeLib 规格 - METADATA 标签含有无效的类型库规格。 
223 未找到 TypeLib - METADATA 标签含有的类型库规格和注册表项不符。 
224 不能装载 TypeLib - 不能装载 METADATA 标签中指定的类型库。 
225 不能包装 TypeLibs - 不能通过 METADATA 标签中指定的类型库创建类型库包装对象。 
226 不能修改 StaticObjects - 运行时不能修改 StaticObjects 集。 
227 Server.Execute 失败 - 调用 Server.Execute 失败。 
228 Server.Execute 错误 - 装载此页时调用 Server.Execute 失败。 
229 Server.Transfer 失败 - 调用 Server.Transfer 失败。 
230 Server.Transfer 错误 - 装载此页时调用 Server.Transfer 失败。 
231 Server.Execute 错误 - 装载此页时调用 Server.Execute 失败。使用相关的 URL。 
232 无效的 Cookie 定义 - METADATA 标签中包含一个无效的 cookie 定义。 
233 无法装载 cookie 脚本源 - 无法装载定义在 METADATA 标签中的 cookie 脚本源文件。 
234 包含无效的指令 - 服务器端包含的指令不可以存在于脚本程序块中。请使用 SRC= <SCRIPT> 标签的属性。 
235 Server.Transfer 错误 - 无效的 URL 表单或是合格的 URL 已被使用。使用相关的 URL。 
236 无效的 Cookie 定义 - METADATA 标签中包含一个无效的 cookie 定义。 
237 无效的 Cookie 定义 - METADATA 标签包含一个无效或缺少的 NAME 参数。 
238 缺少属性值 - 没有为 '|' 属性指定值。 
239 无法运行文件 - UNICODE ASP 文件不被支持。 
240 Script Engine 异常 - 一个 ScriptEngine 超出了预期 '%X' 在 '%s',来自 '%s' 。 
241 CreateObject 异常 - '%s' 的 CreateObject 引起异常 %X。 
242 查询 OnStartPage 界面异常 - 查询对象 '%s' 的 OnStartPage 或 OnEndPage 方法时引起异常 %X。 

注意 当消息显示在事件日志或 Web 浏览器中时,出现在文档中的符号,如 %1、%2、| 等等,将被错误实际发生时的有关详细错误信息代替。

本日志由 flyinweb 于 2009-06-19 13:56:19 发表到 WEB应用开发 中,目前已经被浏览 241 次,评论 0 次;

作者添加了以下标签: ASP 事件

概要
本文列出了各种 80004005 错误信息、导致错误信息的最常见原因以及解决问题的疑难解答步骤。收到 80004005 错误的是 Active Server Pages 中的 Microsoft 数据访问组件 (MDAC),其中包括 Microsoft ActiveX 数据对象 (ADO)、OLE DB 以及远程数据服务 (RDS)。虽然本文假定您是在 Active Server Pages (ASP) 页中使用 ADO,但是导致错误的原因以及许多疑难解答步骤适用于任何使用 ODBC 进行数据访问的环境。 

错误信息列表
80004005 错误信息表示无法访问您的数据。此错误可以解释为“由于某种原因,我无法访问您的数据”。这部分列出了最常见的错误信息的内容和原因。有关可能有助于确定错误原因的其他相关文章,请参见“参考”部分。虽然本文试图提供尽可能多的信息,但可能还是有所遗漏。 

错误信息

Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC Microsoft Access 97 Driver]
The Microsoft Jet database engine cannot open the file '(unknown)'.It is already opened exclusively by another user, or you need permission to view its data. 
原因
出现此信息的原因有多种。有关其他信息,请单击下面的文章编号,查看 Microsoft 知识库中的相应文章: 
306269 PRB:Error 80004005 "The Microsoft Jet Database Engine Cannot Open the File '(Unknown)'" 

189408 FIX:ASP Fails to Access Network Files Under IIS 4.0 and IIS 5.0 

错误信息
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC Microsoft Access 97 Driver] Couldn't use '(unknown)'; file already in use. 
原因
无法为多个用户正确锁定数据库。有关其他信息,请单击下面的文章编号,查看 Microsoft 知识库中的相应文章: 
174943 PRB:80004005 "Couldn't Use '(unknown)'; File Already in Use" 

错误信息
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC Driver Manager]Data source name not found and no default driver specified. 
原因
此错误是比较常见的错误之一,有多种解决方案。有关其他信息,请单击下面的文章编号,查看 Microsoft 知识库中的相应文章: 
306345 PRB:ASP 错误 80004005“未找到数据源名称” 

请确保安装了最新的驱动程序。可从以下 Microsoft Web 站点下载 MDAC 的最新版本: 
http://msdn.microsoft.com/dataaccess

错误信息
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC Driver Manager] Data source name not ?? 
原因
出现此错误的原因是,计算机上安装和卸载软件的顺序有问题。如果 ODBC 核心文件变得不同步(它们的版本应该都相同),您就可能会收到此错误。

要更新所有的核心 ODBC 驱动程序,请从以下 Microsoft Web 站点安装 MDAC 的最新版本: 
http://msdn.microsoft.com/dataaccess

错误信息
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC Access 97 ODBC driver Driver]General error Unable to open registry key 'DriverId'. 
原因
当您从注册表中读取值时,会出现此错误。使用注册表编辑器 (Regedt32.exe) 检查注册表项的权限。还可以使用 Windows NT 注册表监视器 (NTRegMon) 检查注册表读取失败。可以从以下 Sysinternals Web 站点下载 NTRegMon: 
http://www.sysinternals.com

错误信息

Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC SQL Server Driver][dbnmpntw]ConnectionOpen (CreateFile()). 

原因
导致此错误的原因有两种,它们都与权限有关。当数据库驻留在非 Web 服务器的计算机上时,或者当您使用通用命名约定 (UNC) 路径 (\\Server\Share) 引用数据库时,会出现此错误。即使数据库和 Web 服务器在同一台计算机上,当您使用 UNC 路径时,Web 服务器也假定数据库驻留在网络上的不同计算机上。

有关其他信息,请单击下面的文章编号,查看 Microsoft 知识库中的相应文章: 
175671 PRB:80004005 ConnectionOpen (CreateFile()) Error Accessing SQL 

有关委派、Microsoft Internet Information Server (IIS) 如何使用身份验证保护 Web 站点,以及诸如此类的问题的更多信息,请参考以下 Microsoft Web 站点: 
Internet 开发人员的 IIS 身份验证和安全
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnauth/html/dnauth_security.asp

错误信息
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
Microsoft][ODBC Microsoft SQL Driver] Logon Failed() 
原因
如果 SQL Server 不接受或者不能识别提交的登录帐户和/或密码(如果您使用的是“标准”安全性),或者如果没有 Windows NT 帐户到 SQL 帐户的映射(如果您使用的是“集成”安全性),SQL Server 就会产生此错误。

有关其他信息,请单击下面的文章编号,查看 Microsoft 知识库中的相应文章: 
306586 PRB:ASP 中的错误 80004005“登录失败”的疑难解答 

错误信息
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC SQL Server Driver][SQL Server] Login failed- User:Reason:Not defined as a valid user of a trusted SQL Server connection. 

原因
出现此错误的原因是,SQL 企业管理器中打开了“集成”安全性,以及所用的 Windows NT 帐户没有映射为一个 SQL 帐户。要解决此问题,请使用以下方法之一: 
配置 SQL Server 以使用“标准”安全性。在 SQL 企业管理器中,右键单击“服务器”,然后单击 SQL Server。在 SQL Server 属性对话框中,单击安全选项选项卡。在身份验证下,单击以选中 SQL Server 和 Windows,然后单击确定。
如果您是在 IIS 4.0 下运行,请清除此项目的密码同步复选框。

错误信息
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC Microsoft Access 97 Driver] Couldn't lock file.
 
原因
有关其他信息,请单击下面的文章编号,查看 Microsoft 知识库中的相应文章: 
306441 PRB:Troubleshooting Error 80004005 "Couldn't Lock File" in ASP 

错误信息
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC Microsoft Access 97 Driver]
'(unknown)' isn't a valid path.Make sure that the path name is spelled correctly and that you are connected to the server on which the file resides.
 
原因
Web 服务器正在读取的路径不是有效路径。当使用 Global.asa 文件时,如果在一台非 Web 服务器的计算机上创建连接字符串,通常会出现此错误。如果路径是一个映射驱动器号,它可能仅对创建了连接字符串的客户端计算机有效。 

错误信息
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC SQL Server Driver][SQL Server]
The query and the views in it exceed the limit of 16 tables. 
原因
出现此错误的原因是查询过于复杂。对查询是有一些限制的。 


错误信息
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC SQL Server Driver][DBNMPNTW]
ConnectionWrite (GetOverLappedResult()). 

原因
当您关闭允许匿名用户上下文时,当首次请求完成后,Windows NT 将关闭 SQL Server 的管道。这是因为首次连接到 SQL Server 时用的是 IIS 匿名用户帐户。然后,IIS 或者模拟相同线程上的浏览器客户端,或者尝试访问在模拟用户上下文中运行的另一个线程上的连接。不论何种情况,Windows NT 都会发现使用在别的用户上下文中打开的网络命名管道句柄的企图,并根据安全规则强行关闭管道。当您使用网络监视器查看 SQL Server 上的连接时,Windows NT 会发出一个命名管道关闭请求,这将导致 Web 浏览器中的错误。 

错误信息
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC SQL Server Driver][DBMSSOCN]
General network error.Check your network document 
原因
当您重命名一台 SQL 服务器计算机时,会出现此错误。当无法找到计算机名时,引用原名称的域名系统 (DNS) 将失败。 

错误信息
Microsoft OLE DB Provider for ODBC Drivers error '80040e21'
Errors occurred 
- 或者 - 
80004005: ConnectionWrite(GetOverLappedResult) 

原因
当您试图在一个字段中插入超出允许数量的数据时(例如,在一个被格式化为仅接受 25 个字符的 Microsoft Access 字段中插入 26 个字符),会出现此错误。

有关其他信息,请单击下面的文章编号,查看 Microsoft 知识库中的相应文章: 
166659 PRB:Accessing SQL Database Fails on Second Attempt 

错误信息
Multiple-step OLE DB operation generated errors.Check each OLE DB status value, if available.No work was done. 
原因
导致此错误的原因有多种;请参见“参考”部分,查看与此错误信息有关的文章。

 
错误信息
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC Microsoft Access 97 Driver]
Syntax error in INSERT INTO statement. 
原因
出现此错误是因为某个列名可能是保留字(如“DATE”)。将列名更改为非保留字(如“SaleDate”)。 

错误信息
Microsoft OLE DB Provider for ODBC Drivers error '80040e10'
[Microsoft][ODBC Microsoft Access 97 Driver]
Too few parameters.Expected 1. 
原因
出现此错误是因为您在查询语法中使用了不存在的列名。通常,此错误只不过是一个拼写错误。将数据库中的列名与查询字符串进行对比检查。如果使用的是 Microsoft Access,请确保使用的是实际的列名,而不是列的“显示”名称。 
参考
与 Microsoft Access 有关的文章
163159 ACC97:How to Use ASP Files to Query a Secure Microsoft Access Database 
166029 PRB:Error "Cannot Open File Unknown" Using Access 
167452 PRB:'Not a valid path' Error when Using Access Data Source 
174943 PRB:80004005 "Couldn't Use '(unknown)'; File Already in Use" 
189408 FIX:ASP Fails to Access Network Files Under IIS 4.0 and IIS 5.0 
191566 PRB:Cannot Access Network Resource If Client Certificate Mapped 
207525 PRB:IIS4:ASP/ADO Do Not Work Across UNC Path 
234011 FPSE2000:Saving Form Results to Access Database ODBC Error 
306269 PRB:Error 80004005 "The Microsoft Jet Database Engine Cannot Open the File '(Unknown)'" 
306441 PRB:Troubleshooting Error 80004005 "Couldn't Lock File" in ASP 

与 Microsoft SQL Server 有关的文章
166659 PRB:Accessing SQL Database Fails on Second Attempt 
169377 INF:How to Access SQL Server Within Active Server Pages 
174638 PRB:ODBC Error When You Pass Date Parameters to SQL Stored Procedure 
175671 PRB:80004005 ConnectionOpen (CreateFile()) Error Accessing SQL 
178040 PRB:ConnectionWrite(GetOverLappedResult) on Update/Insert - SQL 
186726 Error 80004005 Occurs When Retrieving Data from SQL Server 
193997 HOWTO:Restart an ASP App to Enable Data Access with Named Pipes 
253500 PRB:"Client Unable to Establish Connection" Error Message When Connecting from ASP to SQL Server 
297035 FIX:Correlation Error Using Parameters.Refresh with SQLOLEDB 
306586 PRB:ASP 中的错误 80004005“登录失败”的疑难解答 

与用于 ODBC 驱动程序的 Microsoft OLE DB 提供程序有关的文章
172684 XL97:Cannot Undo Background in Text Box on a Chart Object 
173742 FIX:Global.asa Is Not Executed If Restricting Web Access 
173959 PRB:Permissions Needed for IDC/ASP Queries 
174640 PRB:ASP Error "The Query Is Not Updateable" When You Update Table Record 
175168 PRB:ASP Returns 'Operation Must Use an Updateable Query' Error 
178215 HOWTO:Configure Visual InterDev to Work with an Authenticated Web Project 
189206 PRB:"Couldn't Find File 'Unknown'" Error When You Set Default Language to JScript 
190006 "ODBC Drivers Error 80004005" When Browsing ASP Pages 
194800 PRB:'Invalid Use Of Default Parameter' Error in a Recordset DTC 
195951 HOWTO:Query and Update Excel Data Using ADO From ASP 
201004 PRB:Error 80004005 When You Use Data Range Header and Footer Controls 
234205 PRB:File '(unknown)' , Exception Occurred, or No Data Using Recordset DTCs 
238971 Error Message:Microsoft OLE DB Provider for ODBC Drivers Error '80004005' 
306345 PRB:ASP 错误 80004005“未找到数据源名称” 

与 Novell NetWare 有关的文章
178045 HOWTO:Configure ASP to Read Data File on a Novell Server 
271214 Unable to Access FoxPro Databases on Netware 5 Server from IIS 5.0 
271228 IIS 5.0:Unable to Obtain Data from Access Database Residing on Netware 5 Server Using ASP 
271459 IIS 4.0:Unable to Extract Data from Access Database on Netware 5 Server - Error Message:File Not Found 

与 Oracle 有关的文章
183345 FIX:ORA-00000 Error Message with ASP, MTS, and Connection Pooling 
222990 FIX:BUG:Error 0x80004005 Calling Certain Stored Procedures in Oracle 
255084 HOWTO:ASP-to-Oracle 连接问题疑难解答 

其他文章
156526 General Error=51 Connecting to an Access Datasource 
184572 PRB:Creating Application with PWS 4.0, Windows 95 and VID 
194397 Err Msg:Application Object Error 'ASP 0197 :80004005' Disallowed Object Use 
197323 HOWTO:Troubleshoot "ADODB.Connection" Error 800a0bb9 from Recordset DTC 
198531 FIX:RDS 2.0 Client Cannot SubmitChanges to RDS 1.5 Server 
222828 Err Msg:Microsoft OLE DB Provider for ODBC Drivers Error '80040e4d' 
225042 BUG:Error Message:Error '80004005' Unexpected Error 
228935 FIX:Uninitialized String Variables, Empty String Values, Jet Provider, and Errors Occurred 
229657 PRB:ASP 0156:80004005 Header Error 
237536 PRB:80004005 Unspecified Error When Passing Disconnected Recordset from MTS to ASP 
241456 TPU:Error Message:Server Could Not Validate User Credentials 
247931 INF:Authentication Methods for Connections to SQL Server in Active Server Pages 
250809 "Unexpected Error" Occurs When You Use RDS Through SSL 
253114 PRB:SQL_DRIVER_NOPROMPT Error When Using DEconnection in VB COM Object 
253157 BUG:Identity Field Remains Read-Only After Executing SET IDENTITY_INSERT ON Statement 
253696 PRB:Cannot Access URL with ADO 2.5 and Internet Publishing Provider (MSDAIPP) on IIS 4.0 
253779 HOWTO:Troubleshoot "80020009 Exception Occurred" for DE Commands 
257556 FIX:DB_E_ERRORSOCCURRED When ODBC Driver Returns TABLE_TYPE of More than 15 Characters 
259382 INFO:Microsoft Transaction Server (MTS) Knowledge Base 文章索引 
259383 INFO:ASP Knowledge Base Article Index 
265263 PRB:Cannot Open a Client-Side Cursor for a SQL Query to OLAP Server 
269495 PRB:"Multiple-step OLE DB operation generated errors" When Opening ADO Connection 
270119 PRB:7357/7320 Error While Performing UPDATE, INSERT, or DELETE on Remote Table Using OpenQuery Via Linked Server 
272583 MOD2000:"Multiple-Step OLE DB Operation Generated Errors" Error Message with Document Library Sample 
272693 0x80004005 ASP Error Message Occurs When You Connect to a Database After Crystal Reports 8 Installation 
273482 PRB:Error "Request Object, ASP 0107 (0x80004005)" When You Post a Form 
276020 INFO:Upgrading to Windows 2000 with Visual InterDev 
277381 Predictor Model Fails If the Model Name Is Longer than 128 Characters 
284067 SPS:Indexing Exchange 2000 or SharePoint Portal Server by Using Basic Authentication Does Not Work with Blank Password 
285081 INFO:XMLHTTPRequest Object Requires Internet Explorer 5.0 or Later 
286245 PRB:Error Updating Records Using DB2OLEDB and Server-Side ADO Cursor 
288785 INFO:Cursor Type Supported by DB2OLEDB Provider 
292644 FPSE2002:Error Message After You Change Password:ADO Error 80040E4D:Login Failed for User 'sa' 
294160 BUG:Update of Newly Inserted Row Causes DB_E_ERRORSOCCURRED 
296169 PRB:Error "Session Object, ASP 0168" When You Assign Session Variables in JavaScript 
306216 PRB:Error "Unable to Load Communication Module" in ASP/ADO/SQL Server 
307002 PRB:ASP/ODBC/SQL Server Error 0x80040E4D "Login Failed for User '(Null)'" 

这篇文章中的信息适用于:
Microsoft Active Server Pages 2.0
Microsoft Active Server Pages 3.0
Microsoft Internet Information Server 4.0
Microsoft Internet Information Server 5.0
Microsoft Data Access Components 2.0
Microsoft Data Access Components 2.1
Microsoft Data Access Components 2.5
Microsoft Data Access Components 2.6
Microsoft Data Access Components 2.7

本日志由 flyinweb 于 2009-06-19 12:55:35 发表到 WEB应用开发 中,目前已经被浏览 302 次,评论 0 次;

作者添加了以下标签: 80004005MDACMicrosoft 数据访问组件

概要
      本文介绍一种当使用 Microsoft VBScript 和 Microsoft JScript 编程时,在 Active Server Page (ASP) 中创建 ActiveX 数据对象 (ADO) 非连接记录集的方法。本文假定读者熟悉 ADO 和 ASP。 
更多信息
ASP 的原则之一是尽快释放 ADO 对象,从而释放这些对象所使用的系统资源。ADO 非连接记录集这一功能允许记录集在没有活动连接时也能存在;这可以节省数据库服务器资源并提高伸缩性。ADO 非连接记录集要求使用客户端游标,这可以通过将Connection 对象的 CursorLocation 属性设置为adUseClient 来实现。

下面的示例代码使用 Microsoft OLEDB Provider for SQL Server (SQLOLEDB) 连接到随 SQL Server 安装一起提供的 Northwind 示例数据库。要运行这些示例,需修改连接字符串和 SELECT 语句以适应您的环境。另外,还要为 ADO 常量的 Include 文件设置正确的路径。 
VBScript 中的非连接记录集

  1. <%@Language="VBScript"%>  
  2. <!-- Include file for VBScript ADO Constants -->  
  3. <!--#include File="adovbs.inc"-->  
  4. <%  
  5.     ' Connection string.  
  6.     strCon = "Provider=sqloledb;Data Source=myServer;Initial Catalog=Northwind;User Id=myUser;Password=myPassword" 
  7.  
  8.     ' Create the required ADO objects.  
  9.     Set conn = Server.CreateObject("ADODB.Connection")  
  10.     Set rs = Server.CreateObject("ADODB.recordset")  
  11.  
  12.     ' Open the connection.  
  13.     conn.Open strCon  
  14.  
  15.     ' Retrieve some records.  
  16.     strSQL = "Select * from Shippers" 
  17.     rs.CursorLocation = adUseClient  
  18.     rs.Open strSQL, conn, adOpenStatic, adLockOptimistic  
  19.  
  20.     ' Disconnect the recordset.  
  21.     Set rs.ActiveConnection = Nothing 
  22.  
  23.     ' Release the connection.  
  24.     conn.Close  
  25.  
  26.     ' Check the status of the connection.  
  27.     Response.Write("<BR> Connection.State = " & conn.State)  
  28.  
  29.     Set conn = Nothing 
  30.  
  31.     ' Use the diconnected recordset here.  
  32.  
  33.     ' Release the recordset.  
  34.     rs.Close  
  35.     Set rs = Nothing 
  36. %>  

                
注意,记录集是通过将ActiveConnection 属性设置为 Nothing 断开连接的。 
JScript 中的非连接记录集

  1. <%@Language="JScript"%>  
  2. <!-- Include file for JScript ADO Constants -->  
  3. <!--#include File="adojavas.inc"-->  
  4. <%  
  5.     // Connection string.  
  6.     var strCon = "Provider=sqloledb;Data Source=myServer;Initial Catalog=Northwind;User Id=myUser;Password=myPassword";  
  7.  
  8.     // Create the required ADO objects.  
  9.     conn = Server.CreateObject("ADODB.Connection");  
  10.     rs = Server.CreateObject("ADODB.recordset");  
  11.  
  12.     // Open the connection.  
  13.     conn.Open(strCon);  
  14.  
  15.     // Retrieve some records.  
  16.     var strSQL = "Select * from Shippers";  
  17.     rs.CursorLocation = adUseClient;  
  18.     rs.Open(strSQL, conn, adOpenStatic, adLockOptimistic);  
  19.  
  20.     // Disconnect the recordset.  
  21.     DisconnectRecordset(rs);  
  22.  
  23.     // Release the connection.  
  24.     conn.Close();  
  25.  
  26.     // Check the status of the connection.  
  27.     Response.Write("<BR> Connection.State = " + conn.State);  
  28.  
  29.     conn = null;  
  30.  
  31.     // Use the diconnected recordset here.  
  32.  
  33.     // Release the recordset.  
  34.     rs.Close();  
  35.     rs = null;  
  36. %>  


  1. <SCRIPT LANGUAGE="VBScript" RUNAT="SERVER">  
  2. Sub DisconnectRecordset(rs)  
  3.     Set rs.ActiveConnection = Nothing 
  4. End Sub 
  5. </SCRIPT>  

                
备注:在前面的代码中,不能将以下代码行     

  1. DisconnectRecordset(rs);  

               
替换为以下某个代码行来创建断开连接的记录集:    

  1. rs.ActiveConnection = null; 

                
- 或 - 

  1. delete(rs.ActiveConnection);  

                
有另外一种方法可以创建非连接记录集。JScript 中没有与 VBScript 中的Nothing 关键字(用来释放 ActiveX 对象)类似的关键字。要实现这一点,可以使用与下面的 Web 站点中提供的方法类似的方法: 
http://www.netspace.net.au/~torrboy/code/jargutil
在本例中,示例代码可能类似于下面这样:     

  1. var oUtil = Server.CreateObject("Torrboy.JArgUtility");  
  2.     rs.ActiveConnection = oUtil.Nothing;  

                
参考
有关其他信息,请单击下面的文章编号,查看 Microsoft 知识库文章: 
184397 HOWTO:Create ADO Disconnected Recordsets in VBA/C++/Java(HOWTO:在 VBA/C++/Java 中创建 ADO 断开连接的记录集) 
190717 INFO:Disconnected Recordsets with ADO or RDS(INFO:ADO 或 RDS 的断开连接的记录集) 
252482 BUG:ADO Disconnected Recordset That Uses Parameterized Query Is Not Disconnected by SQL Server(BUG:使用参数化查询的 ADO 断开连接的记录集没有被 SQL Server 断开连接)

本日志由 flyinweb 于 2009-06-19 12:49:10 发表到 WEB应用开发 中,目前已经被浏览 279 次,评论 0 次;

作者添加了以下标签: VBScriptJScriptADO 记录集

这些示例仅供示范之用。您必须将这些代码粘贴到 ASP 代码中才能建立到指定数据库的连接。注意,您必须更改诸如数据库名称、服务器名称、数据库位置和数据源名称 (DSN) 等元素。 

Microsoft Access 
无 DSN

  1. <%  
  2. Set Cnn = Server.CreateObject("ADODB.Connection")  
  3. Cnn.open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=c:\mydatabase.mdb" 
  4. %> 


OLE DB 

  1. <%  
  2. Set Cnn = Server.CreateObject("ADODB.Connection")  
  3. Cnn.open "PROVIDER=MICROSOFT.JET.OLEDB.4.0;DATA SOURCE=c:\mydatabase.mdb" 
  4. %> 


文件 DSN 

  1. <% Set Cnn = Server.CreateObject("ADODB.Connection")  
  2. Cnn.open "FILEDSN=ADSN" 
  3. %> 


有 DSN,无用户 ID/密码

  1. <%  
  2. Set Conn = Server.CreateObject("ADODB.Connection")  
  3. Conn.open "DSNname" 
  4. %> 


有 DSN,有用户 ID/密码

  1. <%  
  2. Set Conn = Server.CreateObject("ADODB.Connection")  
  3. Conn.open "DSNname","username","password" 
  4. %> 


无 DSN,使用物理路径作为引用 

  1. <%  
  2. Set Conn = Server.CreateObject("ADODB.Connection")  
  3. DSNtest="DRIVER={Microsoft Access Driver (*.mdb)}; " 
  4. DSNtest=dsntest & "DBQ=c:\mydatabase.mdb" 
  5. Conn.Open DSNtest  
  6. %> 


无 DSN,使用 Server.MapPath 

备注:Server.MapPath 是 Web 服务器根目录的路径。默认情况下,它是 C:\Inetpub\Wwwroot。

  1. <%  
  2. Set Conn = Server.CreateObject("ADODB.Connection")  
  3. DSNtest="DRIVER={Microsoft Access Driver (*.mdb)}; " 
  4. DSNtest=dsntest & "DBQ=" & Server.MapPath("/databases/mydatabase.mdb")  
  5. Conn.Open DSNtest  
  6. %>  



Microsoft SQL Server 
OLE DB 

  1. <%  
  2. Set cnn = Server.CreateObject("ADODB.Connection")  
  3. cnn.open "PROVIDER=SQLOLEDB;DATA SOURCE=sqlservername;UID=username;PWD=password;DATABASE=mydatabase " 
  4. %> 


有 DSN

  1. <%  
  2. Set Conn = Server.CreateObject("ADODB.Connection")  
  3. Conn.open "DSN=MyDSN;UID=user;PWD=password;DATABASE=mydatabase" 
  4. %> 


无 DSN 

  1. <%  
  2. Set Conn = Server.CreateObject("ADODB.Connection")  
  3. DSNtest="DRIVER={SQL Server};SERVER=ServerName;UID=USER;PWD=password;DATABASE=mydatabase" 
  4. Conn.open DSNtest  
  5. %> 


Microsoft Visual FoxPro 
无 DSN 

  1. <%  
  2. Set Conn = Server.CreateObject("ADODB.Connection")  
  3. ConnStr= "Driver=Microsoft Visual Foxpro Driver; UID=userID;SourceType=DBC;SourceDB=C:\databases\mydatabase.dbc" 
  4. Conn.Open ConnStr  
  5. %> 


Oracle 
有 DSN 的 ODBC 

  1. <%  
  2. Set Conn = Server.CreateObject("ADODB.Connection")  
  3. Conn.cursorlocation=adUseClient  
  4. ' requires use of adovbs.inc; numeric value is 3  
  5. Conn.open "DSN=test;UID=name;PWD=pass" 
  6. %> 


OLE DB 

  1. <%  
  2. Set Conn = Server.CreateObject("ADODB.Connection")  
  3. Conn.cursorlocation=adUseClient  
  4. ' requires use of adovbs.inc; numeric value is 3  
  5. DSNTest="Provider=MSDAORA.1;Password=pass;User ID=name;Data Source=data.world" 
  6. Conn.open DSNtest  
  7. %> 


mysql
无DSN

  1. <%  
  2. strConnection="DefaultDir=;Driver={myodbc driver};server=localhost;uid=root;pwd=;database=db" 
  3. 'strConnection="DRIVER={MySQL ODBC 3.51 Driver};SERVER=localhost;port=非默认商端口;DATABASE=dbname; UID=mysqluser;PASSWORD=Password;OPTION=3"  
  4. Set Conn = Server.CreateObject("ADODB.Connection")   
  5. Conn.Open strConnection  
  6. %> 


DNS
这里有两种方法,一种是在ODBC数据源中建立一个系统DSN。
打开控制面板/ODBD数据源,选择系统DSN,然后添加一个新的DSN,驱动程序选择myodbd driver,会出现一个对话框供输入mysql    相关信息。
Windows DSN name: 所要建立DSN的名称
Mysql Host (name or ip):Mysql服务器的名称或者是IP地址,通常填localhost
Mysql database name:需要使用数据库的名称,数据库在Mysql管理程序中建立。这里我们使用一个例子。数据库名:db
里面有数据表:user 数据表有两个字段分别是:username和password,随便插入几个数据。
user:链接数据库的用户名
password:链接数据库用户密码,如果没有,可以不填
Port(if not 3306):Mysql在服务器的端口,如果不填默认为3306
SQL command on connect:使用sql命令链接数据库,这项可以不填,填写完毕后选择OK保存。

  1. <%  
  2. strConnection = "dsn=mymsn;driver={myodbd driver};server=localhost;uid=root;pwd=;database=db"   
  3. Set Conn = Server.CreateObject("ADODB.Connection")   
  4. Conn.Open strConnection  
  5. %> 


参考 
有关数据类型、数据连接或 MDAC 组件的更多信息,请访问下面的 Microsoft Web 站点: 
http://www.microsoft.com/data

OLEDB vs ODBC -- Which should you use?
Given the option, it's a no brainer to use OLEDB over ODBC. ODBC has been 
around for years and is based on older and more bug laden technology. Therefore, ALWAYS use OLEDB if your server/host supports it. Microsoft even says it themselves:


When running Microsoft Jet in an IIS environment, it is recommended that you use the native Jet OLE DB Provider in place of the Microsoft Access ODBC driver. The Microsoft Access ODBC driver (Jet ODBC driver) can have stability issues due to the version of Visual Basic for Applications that is invoked because the version is not thread safe. As a result, when multiple concurrent users make requests of a Microsoft Access database, unpredictable results may occur. The native Jet OLE DB Provider includes fixes and enhancements for stability, performance, and thread pooling (including calling a thread-safe version of Visual Basic for Applications).

Now that you've picked which database method you will be using, here is a 
list of possible connection strings, based on whether you are using Microsoft Access or SQL Server and OLEDB or ODBC:

SQL Server

   ODBC:
 Standard Security:

  1. "Driver={SQL Server};Server=Aron1;Database=pubs;Uid=sa;Pwd=asdasd;"   


 Trusted connection:

  1. "Driver={SQL Server};Server=Aron1;Database=pubs;Trusted_Connection=yes;" 


 Prompt for username and password:

  1. oConn.Properties("Prompt") = adPromptAlways  
  2. oConn.Open "Driver={SQL Server};Server=Aron1;DataBase=pubs;" 


  OLEDB: 
 Standard Security:

  1. "Provider=sqloledb;Data Source=Aron1;Initial Catalog=pubs;User Id=sa;Password=asdasd;" 


 Trusted Connection:

  1. "Provider=sqloledb;Data Source=Aron1;Initial Catalog=pubs;Integrated Security=SSPI;" 


(use serverName\instanceName as Data Source to use a specific SQLServer instance, only SQLServer2000)

 Prompt for username and password:

  1. oConn.Provider = "sqloledb" 
  2. oConn.Properties("Prompt") = adPromptAlways  
  3. oConn.Open "Data Source=Aron1;Initial Catalog=pubs;"  


 Connect via an IP address:

  1. "Provider=sqloledb;Data Source=190.190.200.100,1433;Network Library=DBMSSOCN;Initial Catalog=pubs;User ID=sa;Password=asdasd;" 


    (DBMSSOCN=TCP/IP instead of Named Pipes, at the end of the Data Source is the port to use (1433 is the default))

Access:
     ODBC
Standard Security:

  1. "Driver={Microsoft Access Driver(*.mdb)};Dbq=\somepath\mydb.mdb;Uid=Admin;Pwd=asdasd;"  



 Workgroup:

  1. "Driver={Microsoft Access Driver *.mdb)};Dbq=\somepath\mydb.mdb;SystemDB=\somepath\mydb.mdw;","admin","" 



    OLEDB
 Standard security:

  1. "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\somepath\mydb.mdb;User Id=admin;Password=asdasd;" 


 Workgroup (system database):

  1. "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\somepath\mydb.mdb;Jet   
  2. OLEDB:System Database=system.mdw;","admin", ""   


 With password:

  1. "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\somepath\mydb.mdb;Jet   
  2. OLEDB:Database Password=MyDbPassword;","admin", "

本日志由 flyinweb 于 2009-06-19 12:41:22 发表到 WEB应用开发 中,目前已经被浏览 178 次,评论 0 次;

作者添加了以下标签: 数据库连接字符串

162/2