http://www.holygrace.cn/  

Download Other JS File

jQuery.js:jQuery框架文件。Version 1.2.1  源码  压缩版
HG.Core.js:HG Plugins核心文件。Version 1.0  源码  压缩版
jquery.dimensions.js:页面元素定位文件。Version 1.1.2  源码  压缩版
jqjquery.easing.js:弹性动画文件。Version 1.1.1  源码  压缩版
 
 

HG Plugins基于著名的jquery框架开发,包括对话框,层的拖拽,右键菜单等常用功能。跨多种浏览器,用户只需简单配置即可实现多种酷炫效果!

    • 1
    • 层的拖拽

    • HG.Drag
    • 2
    • 对话框

    • HG.Dialog
    • 3
    • 右键菜单

    • HG.ContextMenu
    一个简单的右键菜单,菜单是提前写好的对象,该控件仅仅控制菜单的右键显示。
    需要JS库:【jquery-1.2.js】、【HG.Core.js】、【HG.ContextMenu.js】
    参数解释:
    1. $(function(){  
    2.     $("#body").ContextMenu({ //可以触发右键菜单的对象,jquery选择器  
    3.         menu : "cm",    
    4.         //作为右键菜单的DOM对象id  
    5.         speed  : 200     
    6.         //菜单显示速度  
    7.     })  
    8. })  
    DEMO:  右键点击   其他DEMO
    • 4
    • 星级评分

    • HG.Star
posted @ 2007-11-07 12:04 S.Sams 阅读(250) | 评论 (1)编辑

// @copyright   S.Sams Lifexperience http://blog.8see.net/
using System;

namespace Theme.Services.Public
{
 /// <summary>
 /// SqlstrAny 的摘要说明。
 /// </summary>
 public class ProcessRequest
 {
  public ProcessRequest()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }

  #region SQL注入式攻击代码分析
  /// <summary>
  /// 处理用户提交的请求
  /// </summary>
  public void StartProcessRequest()
  {
   try
   {
    string getkeys = "";
    string sqlErrorPage = System.Configuration.ConfigurationSettings.AppSettings["CustomErrorPage"].ToString();
    if (System.Web.HttpContext.Current.Request.QueryString != null)
    {
    
     for(int i=0;i<System.Web.HttpContext.Current.Request.QueryString.Count;i++)
     {
      getkeys = System.Web.HttpContext.Current.Request.QueryString.Keys[i];
      if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.QueryString[getkeys]))
      {
       System.Web.HttpContext.Current.Response.Redirect (sqlErrorPage+"?errmsg=sqlserver&sqlprocess=true");
       System.Web.HttpContext.Current.Response.End();
      }
     }
    }
    if (System.Web.HttpContext.Current.Request.Form != null)
    {
     for(int i=0;i<System.Web.HttpContext.Current.Request.Form.Count;i++)
     {
      getkeys = System.Web.HttpContext.Current.Request.Form.Keys[i];
      if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys]))
      {
       System.Web.HttpContext.Current.Response.Redirect (sqlErrorPage+"?errmsg=sqlserver&sqlprocess=true");
       System.Web.HttpContext.Current.Response.End();
      }
     }
    }
   }
   catch
   {
    // 错误处理: 处理用户提交信息!
   }
  }
  /// <summary>
  /// 分析用户请求是否正常
  /// </summary>
  /// <param name="Str">传入用户提交数据</param>
  /// <returns>返回是否含有SQL注入式攻击代码</returns>
  private bool ProcessSqlStr(string Str)
  {
   bool ReturnValue = true;
   try
   {
    if (Str != "")
    {
     string SqlStr = "and |exec |insert |select |delete |update |count | * |chr |mid |master |truncate |char |declare ";
     string[] anySqlStr = SqlStr.Split('|');
     foreach (string ss in anySqlStr)
     {
      if (Str.IndexOf(ss)>=0)
      {
       ReturnValue = false;
      }
     }
    }
   }
   catch
   {
    ReturnValue = false;
   }
   return ReturnValue;
  }
  #endregion

 }
}

// System.Configuration.ConfigurationSettings.AppSettings["CustomErrorPage"].ToString(); 这个为用户自定义错误页面提示地址,
//在Web.Config文件时里面添加一个 CustomErrorPage 即可
//<!-- 防止SQL数据库注入攻击的出错页面自定义地址 -->
//    <add key="CustomErrorPage" value="../Error.html" />

posted @ 2006-04-17 22:24 S.Sams 阅读(2859) | 评论 (2)编辑

http://blog.csdn.net/hnwanghb/services/trackbacks/323869.aspx

           大家要有兴趣,可以一起来讨论一下 WebService数据交互安全问题,以下的这个代码,可以用于Dotnet环境下的任何托管方式的应用程序,在实际应用中有两个实例。其中,有一个挂在Internet上的,URL:http://www.tttsss.com/webservice/THRDataService.asmx , 有兴趣的可以看看其中的Soap信息。当然,要看里面的加密解密过程,就没办法了!否则,我呀太没面子了,是吧!

          前两年写的东西,现在整理一下发出来!以前公司需要做WebService,并且对WebService的SoapHeader进行加密,所以就写了这么个东东!使用这个类,需要密钥管理!为了保证数据的安全性往往要对数据进行加密,但是加密的缺点之一,就是影响程序的运行效率,所以,当时我的思路是只对用户的登录信息(用户名,密码)进行加密!数据用明文传输,用户信息验证没有通过的情况下, 不进行数据传输。

          实际在网络通讯中,使用密钥匙的方式并非无懈可击,如果黑客可以捕捉到用密钥加密的,用户验证信息,然后,做个模拟请求,向提供WebService的服务器发请求,还是可以获得请求数据!所以,我又使用了IP或者域名绑定的方式!毕竟,WebService不是直接对最终用户提供的!所以,加上以上这些手段后,就算有不良企图者想通过非法方式获得WebService提供的服务,就再费点劲吧!            

          还有一点安全建议,就是定期的更换密钥,在这个例子中,我用的是对称加密,加密方和解密方的密钥一致!定期的更换密钥可以让安全性提高一大截!

          大家要有更好的方法,或者建议,可以留言讨论一下!共同提高!

代码如下:

using System;
using System.Security.Cryptography ;
using System.Text;
using System.IO;


namespace SEDO
{
 /// <summary>
 /// SEDO 的摘要说明。
 /// SEDO 实现的是用一个封装了4种对称加密方法(Des,Rc2,Rijndael,TripleDes)的组件
 ///
 /// 注意事项:
 /// 1:TripleDes和Rijndael加密/解密对象使用16或者24位byte的Key
 /// 2:Rijndael只能使用16位的初始化向量IV
 /// 3:Des和Rc2均使用8位Byte的Key和IV
 /// 4:对需要加密/解密的数据流采用何种方法进行编码/解码,由调用组件的用户自己决定
 /// 5:密钥和初始化向量IV由使用者自己定义
 /// 程序员: 王海波 2003-05-19 hwnanghb@21cn.com
 /// </summary>
 
 //定义加密类型的枚举
 public enum EncryptionAlgorithm {Des = 1, Rc2, Rijndael, TripleDes};


 //定义加密类
 internal class EncryptTransformer
 {
  private EncryptionAlgorithm algorithmID;
  private byte[] initVec;
  private byte[] encKey;

  internal EncryptTransformer(EncryptionAlgorithm algId)
  {
   //Save the algorithm being used.
   algorithmID = algId;
  }

  internal ICryptoTransform GetCryptoServiceProvider(byte[] bytesKey)
  {
   //当数据密钥Key或者初始化向量IV为空的时候,将使用加密对象自动产生的密钥Key或者初始化向量IV
   switch (algorithmID)
   {
    case EncryptionAlgorithm.Des:
    {
     DES des = new DESCryptoServiceProvider();
     des.Mode = CipherMode.CBC;

     // See if a key was provided
     if (null == bytesKey)
     {
      encKey = des.Key;
     }
     else
     {
      des.Key = bytesKey;
      encKey = des.Key;
     }
     // See if the client provided an initialization vector
     if (null == initVec)
     { // Have the algorithm create one
      initVec = des.IV;
     }
     else
     { //No, give it to the algorithm
      des.IV = initVec;
     }
     return des.CreateEncryptor();
    }
    case EncryptionAlgorithm.TripleDes:
    {
     TripleDES des3 = new TripleDESCryptoServiceProvider();
     des3.Mode = CipherMode.CBC;
     // See if a key was provided
     if (null == bytesKey)
     {
      encKey = des3.Key;
     }
     else
     {
      des3.Key = bytesKey;
      encKey = des3.Key;
     }
     // See if the client provided an IV
     if (null == initVec)
     { //Yes, have the alg create one
      initVec = des3.IV;
     }
     else
     { //No, give it to the alg.
      des3.IV = initVec;
     }
     return des3.CreateEncryptor();
    }
    case EncryptionAlgorithm.Rc2:
    {
     RC2 rc2 = new RC2CryptoServiceProvider();
     rc2.Mode = CipherMode.CBC;
     // Test to see if a key was provided
     if (null == bytesKey)
     {
      encKey = rc2.Key;
     }
     else
     {
      rc2.Key = bytesKey;
      encKey = rc2.Key;
     }
     // See if the client provided an IV
     if (null == initVec)
     { //Yes, have the alg create one
      initVec = rc2.IV;
     }
     else
     { //No, give it to the alg.
      rc2.IV = initVec;
     }
     return rc2.CreateEncryptor();
    }
    case EncryptionAlgorithm.Rijndael:
    {
     Rijndael rijndael = new RijndaelManaged();
     rijndael.Mode = CipherMode.CBC;
     // Test to see if a key was provided
     if(null == bytesKey)
     {
      encKey = rijndael.Key;
     }
     else
     {
      rijndael.Key = bytesKey;
      encKey = rijndael.Key;
     }
     // See if the client provided an IV
     if(null == initVec)
     { //Yes, have the alg create one
      initVec = rijndael.IV;
     }
     else
     { //No, give it to the alg.
      rijndael.IV = initVec;
     }
     return rijndael.CreateEncryptor();
    }
    default:
    {
     throw new CryptographicException("Algorithm ID '" +
      algorithmID +
      "' not supported.");
    }
   }
  }

  //加密的偏移向量
  internal byte[] IV
  {
   get{return initVec;}
   set{initVec = value;}
  }
  //加密的密钥
  internal byte[] Key
  {
   get{return encKey;}
   set{encKey = value;}
  }

 }

 //定义解密类
 internal class DecryptTransformer
 {
  private EncryptionAlgorithm algorithmID;
  private byte[] initVec;
  private byte[] encKey;

  internal DecryptTransformer(EncryptionAlgorithm deCryptId)
  {
   algorithmID = deCryptId;
  }

  //加密的偏移向量
  internal byte[] IV
  {
   get{return initVec;}
   set{initVec = value;}
  }
 
  //加密的密钥
  internal byte[] Key
  {
   get{return encKey;}
   set{encKey = value;}
  }

  internal ICryptoTransform GetCryptoServiceProvider(byte[] bytesKey)
  {
   //当数据密钥Key或者初始化向量IV为空的时候,将使用加密对象自动产生的密钥Key或者初始化向量IV
   switch (algorithmID)
   {
    case EncryptionAlgorithm.Des:
    {
     DES des = new DESCryptoServiceProvider();
     des.Mode = CipherMode.CBC;
     des.Key = bytesKey;
     des.IV = initVec;
     return des.CreateDecryptor();
    }
    case EncryptionAlgorithm.TripleDes:
    {
     TripleDES des3 = new TripleDESCryptoServiceProvider();
     des3.Mode = CipherMode.CBC;
     return des3.CreateDecryptor(bytesKey, initVec);
    }
    case EncryptionAlgorithm.Rc2:
    {
     RC2 rc2 = new RC2CryptoServiceProvider();
     rc2.Mode = CipherMode.CBC;
     return rc2.CreateDecryptor(bytesKey, initVec);
    }
    case EncryptionAlgorithm.Rijndael:
    {
     Rijndael rijndael = new RijndaelManaged();
     rijndael.Mode = CipherMode.CBC;
     return rijndael.CreateDecryptor(bytesKey, initVec);
    }
    default:
    {
     throw new CryptographicException("Algorithm ID '" +
      algorithmID +
      "' not supported.");
    }
   }
  } //end GetCryptoServiceProvider
 
 }

 //定义加密者类
 public class Encryptor
 {
  private EncryptTransformer transformer;
  private byte[] initVec;
  private byte[] encKey;
 
  public Encryptor(EncryptionAlgorithm algId)
  {
   transformer = new EncryptTransformer(algId);
  }

  public byte[] Encrypt(byte[] bytesData, byte[] bytesKey,byte[] bytesIV)
  {
   //设置流对象用来保存加密数据字节流.
   MemoryStream memStreamEncryptedData = new MemoryStream();
  
   transformer.IV=bytesIV;
   transformer.Key=bytesKey;
 
   ICryptoTransform transform = transformer.GetCryptoServiceProvider(bytesKey);
   CryptoStream encStream = new CryptoStream(memStreamEncryptedData,transform,CryptoStreamMode.Write);

   try
   {
    //将加密数据写进流对象
    encStream.Write(bytesData, 0, bytesData.Length);
   }
   catch(Exception ex)
   {
    throw new Exception("在数据加密的时候出现错误!错误提示: \n"  + ex.Message);
   }
  
   //设置加密的Key和初始向量IV属性
   encKey = transformer.Key;
   initVec = transformer.IV;

   encStream.FlushFinalBlock();
   encStream.Close();

   //Send the data back.
   return memStreamEncryptedData.ToArray();
  }

  public byte[] IV
  {
   get{return initVec;}
   set{initVec = value;}
  }

  public byte[] Key
  {
   get{return encKey;}
   set{encKey = value;}
  }
 
 }


 //定义解密者类
 public class Decryptor
 {
  private DecryptTransformer transformer;
  private byte[] initVec;
  private byte[] encKey;

  public Decryptor(EncryptionAlgorithm algId)
  {
   transformer = new DecryptTransformer(algId);
  }

  public byte[] Decrypt(byte[] bytesData, byte[] bytesKey,byte[] bytesIV)
  {
   //设置流对象用来保存解密数据字节流.
   MemoryStream memStreamDecryptedData = new MemoryStream();

   //Pass in the initialization vector.
   transformer.IV = bytesIV;
   transformer.Key = bytesKey;

   ICryptoTransform transform = transformer.GetCryptoServiceProvider(bytesKey);
   CryptoStream decStream = new CryptoStream(memStreamDecryptedData,transform, CryptoStreamMode.Write);
  
   try
   {
    decStream.Write(bytesData, 0, bytesData.Length);
   }
   catch(Exception ex)
   {
    throw new Exception("在数据解密的时候出现错误!错误提示: \n" + ex.Message);
   }
   decStream.FlushFinalBlock();
   decStream.Close();
   // 返回解密数据.
   return memStreamDecryptedData.ToArray();
  }

  public byte[] IV
  {
   get{return initVec;}
   set{initVec = value;}
  }

  public byte[] Key
  {
   get{return encKey;}
   set{encKey = value;}
  }
 
 }

 //类描述:文件加密/解密类
 public class SecurityFile
 {
  private DecryptTransformer Dec_Transformer;    //解密转换器
  private EncryptTransformer Enc_Transformer;    //加密转换器
  private byte[] initVec;
  private byte[] encKey;

  public SecurityFile(EncryptionAlgorithm algId)
  {
   Dec_Transformer = new DecryptTransformer(algId);
   Enc_Transformer = new EncryptTransformer(algId);
  }

  //加密的偏移向量
  internal byte[] IV
  {
   get{return initVec;}
   set{initVec = value;}
  }
  //加密的密钥
  internal byte[] Key
  {
   get{return encKey;}
   set{encKey = value;}
  }

  //功能描述:加密文件
  public void EncryptFile(string inFileName, string outFileName, byte[] bytesKey, byte[] bytesIV)
  {
   try
   {
    FileStream fin = new FileStream(inFileName, FileMode.Open, FileAccess.Read);
    FileStream fout = new FileStream(outFileName, FileMode.OpenOrCreate, FileAccess.Write);
    fout.SetLength(0);
      
    //Create variables to help with read and write.
    byte[] bin = new byte[100]; //This is intermediate storage for the encryption.
    long rdlen = 0;              //This is the total number of bytes written.
    long totlen = fin.Length;    //This is the total length of the input file.
    int len;                     //This is the number of bytes to be written at a time.
 
    Enc_Transformer.IV=bytesIV;
    Enc_Transformer.Key=bytesKey;

    ICryptoTransform transform = Enc_Transformer.GetCryptoServiceProvider(bytesKey);         
    CryptoStream encStream = new CryptoStream(fout, transform, CryptoStreamMode.Write);
                             
    //Read from the input file, then encrypt and write to the output file.
    while(rdlen < totlen)
    {
     len = fin.Read(bin, 0, 100);
     encStream.Write(bin, 0, len);
     rdlen = rdlen + len;    
    }
 
    encStream.Close(); 
    fout.Close();
    fin.Close();    
   }
   catch(Exception ex)
   {
    throw new Exception("在文件加密的时候出现错误!错误提示: \n" + ex.Message);
   }
  }

  //功能描述:解密文件
  public void DecryptFile(string inFileName, string outFileName, byte[] bytesKey, byte[] bytesIV)
  {
   try
   {
    FileStream fin = new FileStream(inFileName, FileMode.Open, FileAccess.Read);
    FileStream fout = new FileStream(outFileName, FileMode.OpenOrCreate, FileAccess.Write);
    fout.SetLength(0);
      
    //Create variables to help with read and write.
    byte[] bin = new byte[100]; //This is intermediate storage for the encryption.
    long rdlen = 0;              //This is the total number of bytes written.
    long totlen = fin.Length;    //This is the total length of the input file.
    int len;                     //This is the number of bytes to be written at a time.
 
    Dec_Transformer.IV=bytesIV;
    Dec_Transformer.Key=bytesKey;

    ICryptoTransform transform = Dec_Transformer.GetCryptoServiceProvider(bytesKey);         
    CryptoStream encStream = new CryptoStream(fout, transform, CryptoStreamMode.Write);
                             
    //Read from the input file, then encrypt and write to the output file.
    while(rdlen < totlen)
    {
     len = fin.Read(bin, 0, 100);
     encStream.Write(bin, 0, len);
     rdlen = rdlen + len;    
    }
 
    encStream.Close(); 
    fout.Close();
    fin.Close();    
   }
   catch(Exception ex)
   {
    throw new Exception("在文件加密的时候出现错误!错误提示: \n" + ex.Message);
   }
  }
 
 }

}

 

本文引用通告地址: http://blog.csdn.net/hnwanghb/services/trackbacks/323869.aspx

posted @ 2005-08-12 00:02 S.Sams 阅读(158) | 评论 (0)编辑

        private void CreateImage(string checkCode)
        {
            int iwidth = (int)(checkCode.Length * 15);
            System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 25);
            Graphics g = Graphics.FromImage(image);
            g.Clear(Color.White);
//定义颜色
            Color[] c = {Color.Black,Color.Red,Color.DarkBlue,Color.Green,Color.Orange,Color.Brown,Color.DarkCyan,Color.Purple};
//定义字体            string[] font = {"Verdana","Microsoft Sans Serif","Comic Sans MS","Arial","宋体"};
            Random rand = new Random();
//随机输出噪点
            for(int i=0;i<50;i++)
            {
                int x = rand.Next(image.Width);
                int y = rand.Next(image.Height);
                g.DrawRectangle(new Pen(Color.LightGray, 0),x,y,1,1);
            }

//输出不同字体和颜色的验证码字符
            for(int i=0;i<checkCode.Length;i++)
            {
                int cindex = rand.Next(7);
                int findex = rand.Next(5);
               
                Font f = new System.Drawing.Font(font[findex], 10, System.Drawing.FontStyle.Bold);
                Brush b = new System.Drawing.SolidBrush(c[cindex]);
                int ii=4;
                if((i+1)%2==0)
                {
                    ii=2;
                }
                g.DrawString(checkCode.Substring(i,1), f, b, 3+(i*12), ii);
            }
//画一个边框
            g.DrawRectangle(new Pen(Color.Black,0),0,0,image.Width-1,image.Height-1);

//输出到浏览器
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            image.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
            Response.ClearContent();
            Response.ContentType = "image/Jpeg";
            Response.BinaryWrite(ms.ToArray());
            g.Dispose();
            image.Dispose();
        }
 
http://www.5dblog.com/vip/allinhands/index.asp?id=33759

posted @ 2005-07-11 12:21 S.Sams 阅读(383) | 评论 (0)编辑
 
1、 使用outLook提供的发送
如:我见过的用友软件U8生产制造(演示版),其中的邮件功能就是通过调用outLook的ActiveX 组件
优点:开发简单
缺点:依赖outlook组件,SMTP 邮件服务
 
邮件发送的代码如下:
    Private Sub Send()
        Dim outObj As New Outlook.Application()
        Dim Item As Outlook.MailItemClass
        Item = outObj.CreateItem(0)
        Item.To = "lihonggen0@163.com "
        Item.Subject = "hello"
        Item.Body = "hell"
        Item.Attachments.Add("C:\abc.txt")
        Item.Send()
End Sub
 
参考:使用 Microsoft Outlook 2002 开发解决方案http://www.microsoft.com/china/msdn/library/dndotnetout2k2/html/odc_oldevsol.asp
 
2、 WEB开发,在ASP.NET中引用System.Web.Mail类
System.Web.Mail 命名空间包含使您可以使用 CDOSYS(Windows 2000 的协作数据对象)消息组件来构造和发送消息的类。邮件消息是通过内置在 Microsoft Windows 2000 中的 SMTP 邮件服务或任意的 SMTP 服务器来传送的。此命名空间中的类可以在 ASP.NET 或任何托管应用程序
MailAttachment提供用于构造电子邮件附件的属性和方法。
MailMessage提供用于构造电子邮件的属性和方法。
SmtpMail提供用于使用 Windows 2000 的协作数据对象 (CDOSYS) 消息组件来发送消息的属性和方法。
邮件可以通过 Microsoft Windows 2000 中内置的 SMTP 邮件服务或任意 SMTP 服务器来传送。System.Web.Mail 命名空间中的类型可以在 ASP.NET 或任何托管应用程序使用。
Smtp服务器的设置,现在一些免费邮件提供商是不再提供针对所有邮件提供Smtp服务,在发送邮件的时候,需要验证用户信息,考虑Smtp用户验证问题
如果Smtp服务器在本地计算机,发送速度很快的,基本上不用担心,如果不是本地服务器,那么发送的时候最好不要以此太多,一是速度问题,二是以此发送太多邮件,Smtp服务器可能认为是垃圾邮件而拒绝服务
代码如下:
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim mailObj As New MailMessage()
 
        Dim smtp As SmtpMail
 
        '定义SMTP服务器的名称
        smtp.SmtpServer = "smtp.163.com"
        '定义邮件的发送地址
        mailObj.From = "lihonggen@163.com"
 
        '定义邮件的接收地址
        mailObj.To = " lihonggen0@163.com"
 
        '定义邮件的暗送地址
        '    mailObj.Bcc "aa@sina.com"
 
        '定义邮件的抄送地址
        '      mailObj.Cc = "aaa@sina.com"
 
        '定义邮件的主题
        mailObj.Subject = "主题"
 
        '定义邮件的主体
        mailObj.Body = "邮件主体!"
 
        '邮件以 HTML的格式发送
        mailObj.BodyFormat = MailFormat.Html
 
        '定义邮件的有限级,在此设定为高
        mailObj.Priority = MailPriority.High
 
        '给发送的邮件附加上一个附件
        mailObj.Attachments.Add(New MailAttachment("c:\lihonggen.doc"))
        smTp.Send(mailObj)
    End Sub
 
3、 在VB.NET或C#开发Windows 应用程序中使用System.Net.Sockets
也是基于SMTP协议
一、SMTP协议简介
1、  客户端通过服务器的25端口建立TCP/IP连接
服务器端: 220 server.com Simple Mail Transfer Service Ready
2、  客户端使用“HELO”命令标识发件人
客户端:HELO server.com
服务器端:250 server.com
3、  客户端发送MAIL命令,服务器端以OK作为响应表明准备接收
客户端: MAIL FROM: <A@B.com>
服务器端: 250 OK
4、  客户端发送RCPT命令标识收件人,服务器端回应是否愿意为收件人接受邮件
客户端:RCPT TO: <d@e.com>
服务器端:250 OK
5、  协商结束后用命令DATA发送发送邮件
客户端:DATA
服务器端:354 Start mail input: end with <CRLF>.<CRLF>
6、  客户端以.表示结束输入内容一起发送出去
客户端:Subject:  <CRLF>
内容<CRLF>
.<CRLF>
7、客户端用QUIT命令退出。
              客户端:QUIT
服务器端:250 server.com closing transmission channel
 
 
 
优点:可以在此基础上开发出自己的组件,利用Sockets我们可以进行网络编程开发
缺点:程序量相对较多,
 
发送邮件的代码如下:
        Dim sendData As String
        Dim szData As Byte()
        Dim CRLF As String
        CRLF = "\r\n"
 
        '创建与服务器25端口的连接
        Dim SmtpServ As New TcpClient(txtsmtp.Text, 25)
        lstlog.Items.Clear()
 
        '显示服务器初始信息
        Dim NetStrm As NetworkStream
        NetStrm = SmtpServ.GetStream()
 
        Dim RdStrm As New StreamReader(SmtpServ.GetStream())
        If RdStrm.ReadLine() <> "" Then lstlog.Items.Add(RdStrm.ReadLine())
        '
        sendData = "HELO server " + CRLF
        szData = System.Text.Encoding.ASCII.GetBytes(sendData.ToCharArray())
        NetStrm.Write(szData, 0, szData.Length)
        lstlog.Items.Add(RdStrm.ReadLine())
 
        '标志发件人
        sendData = "MAIL FROM: " + "<" + txtfrom.Text + ">" + CRLF
        szData = System.Text.Encoding.ASCII.GetBytes(sendData.ToCharArray())
        NetStrm.Write(szData, 0, szData.Length)
        lstlog.Items.Add(RdStrm.ReadLine())
 
        '标志收件人
        sendData = "RCPT TO: " + "<" + txtTo.Text + ">" + CRLF
        szData = System.Text.Encoding.ASCII.GetBytes(sendData.ToCharArray())
        NetStrm.Write(szData, 0, szData.Length)
        lstlog.Items.Add(RdStrm.ReadLine())
 
        '准备发送内容
        sendData = "DATA " + CRLF
        szData = System.Text.Encoding.ASCII.GetBytes(sendData.ToCharArray())
        NetStrm.Write(szData, 0, szData.Length)
        lstlog.Items.Add(RdStrm.ReadLine())
 
        '发送主题
        sendData = "SUBJECT: " + txtsub.Text + CRLF
        '发送内容
        sendData = sendData + txtmsg.Text + CRLF
 
        '结束发送
        sendData = sendData + "." + CRLF
        szData = System.Text.Encoding.ASCII.GetBytes(sendData.ToCharArray())
        NetStrm.Write(szData, 0, szData.Length)
        lstlog.Items.Add(RdStrm.ReadLine())
 
 
        '退出
        sendData = "QUIT " + CRLF
        szData = System.Text.Encoding.ASCII.GetBytes(sendData.ToCharArray())
        NetStrm.Write(szData, 0, szData.Length)
        lstlog.Items.Add(RdStrm.ReadLine())
 
 
        '关闭连接
        NetStrm.Close()
        RdStrm.Close()
        lstlog.Items.Add("连接关闭")
        lstlog.Items.Add("发送成功")
 
大家还可以参考:使用C# 创建邮件发送组件(SMTP)
 
4、 IIS SMTP自带的基本的发信组件CDONTS
你不必专门下载,微软已经提供了这个组件,只要安装了2000,NT的SMTP就会有的。
优点:组件由操作系统自带
缺点:功能比较差,可扩展性不强
        Mymail = CreateObject("CDONTS.NewMail")
        Mymail.From = *** '信件发送者信箱
        Mymail.To = *** ‘信件接收者信箱
        Mymail.CC = *** '抄送
        Mymail.BCC = *** ’密件发送
        Mymail.Subject = *** ‘信件主题
        Mymail.Body = *** ’信件正文
        '设置优先级,0-不重要,1-一般,2-重要。
        Mymail.Importance = 2
        Mymail.Send()
        Mymail = Nothing
 
5、 使用JMail组件
Jmail具有以下特点:
1)可以发送附件;
(2)详细日志能力,便于你查看问题所在;
(3)设置邮件发送的优先级;
(4)支持多种格式的邮件发送,比如说以HTML或者TXT的方式发送邮件。这是个免费的组件。
(5)密件发送/(CC)抄送/紧急信件发送能力;
(6)最关键的就是--免费的组件,不必发钱,所以非常值得使用。
网站:http://www.dimac.net/,目前版本是4.3
 
JMail组件的常用属性:
Body   邮件正文
Logging   调用Log记录,供Debug用
Priority   邮件的优先程度,从1到5
Sender   发件人
ServerAddress   SMTP服务器的IP地址或名称
Subject   邮件标题
 
JMail组件的常用方法:
AddAttachment   指定附件文件
AddRecipient   加入一个收件人
AddRecipientBCC   隐藏的副本抄送,只有发件人和BCC收件人知道。
AddRecipientCC   副本抄送
Execute   送出邮件
 
了解必要的属性及方法后,余下的部分接收使用者输入的Email,当成参数传给AddRecipient方法,然后根据需要填上其余属性,最后以Execute方法寄出。例如:
        Dim JMail
        JMail = Server.CreateObject("JMail.SMTPMail")
        JMail.Logging = True
        JMail.ServerAddress = "202.96.144.48"
        JMail.Sender = "lihonggen0@163.com"
        JMail.Subject = "subject."
        JMail.Body = "body."
        JMail.AddRecipient("bbbb@163.com")
        JMail.AddAttachment("c:\go.gif")
        JMail.Priority = 3
        JMail.Execute()
        JMail = Nothing
 
总结:选择何种方案,视程序的用途和需求而定,本文例出的几种方案,供大家参考。例如用友软件U8,调用outlook组件,一样整合到自己的软件中。我编写的管理系统,自己写组件(SMTP),功能同样强大,不过Coding的时间就长了!
posted @ 2005-06-06 00:34 S.Sams 阅读(260) | 评论 (0)编辑
 

利用vs.net2003来制作一个安装程序是非常的方便的,既使是制作一个web应用程序的安装程序也是如此。仅仅简单的几个步骤就可以完成。

首先,创建一个安装和部署项目。步骤如下:
1.在"解决方案资源管理器"中的解决方案中添加一个新项目。
用鼠标右键单击解决方案,在弹出的菜单中选择"添加"->"新建项目"。在打开的对话框中选择"安装和部署项目",并选择"Web安装项目"模板。在输入项目名称后,点击"确定"按钮,将新项目添加到解决方案中。
2.将项目的输出添加到安装和部署项目中。
 添加完安装和部署项目后,vs.net2003 IDE会自动打开一个名为"文件系统"的管理器。用鼠标右键单击此管理器右边树型结构中的"Web应用程序文件夹",在弹出的菜单中选择"添加"->"项目输出"。在弹出的对话框中,选择"项目"(这时只有一个,就是你的web应用程序项目),然后在下面的列表中选择"主输出"和"内容文件"两项(可以复选),接着在"配置"中选择"Release .NET",点击"确定"按钮。

经过上面两个步骤,一个基本的安装和部署程序就制作完成了,将此项目编译后就得到了一个Web安装程序包。

然而,在很多的情况下,我们做的Web应用程序都要使用到数据库,能不能在安装程序的同时也将数据库一起安装呢?答案是肯定的。那该怎么做呢?这个问题李洪根先生已经解决了,具体内容可以参看下面的文章
http://blog.csdn.net/lihonggen0/archive/2004/05/17/13654.aspx
在李洪根先生的这篇文章中详尽的介绍了安装程序的制作和如何同时安装数据库。在此大致叙述如下:
1.新建一个类库项目,删除自动生成的Class.cs,重新添加一个新项。鼠标右键此项目,在弹出的菜单中选择"添加"->"添加新项",在弹出的对话框中选择"安装程序类"。
2.创建一个自定义的安装对话框。鼠标右键点击"解决方案资源管理器"中的安装和部署项目,在弹出的菜单中选择"视图"->"用户界面"。在打开的"用户界面"管理器中,鼠标右键点击"启动",在弹出的菜单中选择"添加对话框"。在打开的对话框中选择"文本框(A)"。选择"文本框(A)",在属性中,依次设置含Property属性为CUSTOMTEXT1,CUSTOMTEXT2,CUSTOMTEXT3,CUSTOMTEXT4。
3.创建自定义操作。鼠标右键点击"解决方案资源管理器"中的安装和部署项目,在弹出的菜单中选择"视图"->"自定义操作"。在打开的"自定义操作"管理器中,鼠标右键点击"安装",在弹出的菜单中选择"添加自定义操作"。在打开的对话框中,在"查找范围"中选择"Web应用程序文件夹",选择下面列表中的"主输出来自Install1(活动)"(Install1是"安装程序类"所在的项目名。如果列表中没有,可以用上面提到的"将项目的输出添加到安装和部署项目中"的方法添加)。然后在"自定义操作"管理器中选择刚添加的内容,在属性窗口中设置CustomActionData属性/dbname=[CUSTOMTEXT1] /server=[CUSTOMTEXT2] /user=[CUSTOMTEXT3] /pwd==[CUSTOMTEXT4] /targetdir="[TARGETDIR]\"
注意:每个设置内容以/分隔,且以空格分开。
4.在此类中重写Install方法,并添加下面的代码
string strConn=String.Format("data source={0};user id={1};password={2};",this.Context.Parameters["server"],this.Context.Parameters["user"],this.Context.Parameters["pwd"]);
this.ExecuteSQL(strConn,"master","CREATE DATABASE "+this.Context.Parameters["dbname"]);

System.Diagnostics.Process pSQL=new System.Diagnostics.Process();
pSQL.StartInfo.FileName="osql.exe";
pSQL.StartInfo.Arguments=String.Format(" -U {0} -P {1} -d{2} -i {3}db.sql",this.Context.Parameters["user"],this.Context.Parameters["pwd"], this.Context.Parameters["dbname"],this.Context.Parameters["targetdir"]);
pSQL.StartInfo.WindowStyle=System.Diagnostics.ProcessWindowStyle.Hidden;
pSQL.Start();
pSQL.WaitForExit();
pSQL.Close();
这样,编译后的安装程序就可以连数据库一起安装了。

安装数据库的问题解决了,还有一个问题,那就是要使ASP.NET程序运行,一个重要的条件就是目标计算机上必须有.NET框架,那能不能在安装程序时也一同将.NET框架一块安装了呢?答案还是肯定的。具体可以参看
http://www.microsoft.com/china/MSDN/library/netFramework/netframework/Nfdnnetdepvsredistdeploy1_1.mspx
在这篇文章中提到了几种不同的方法重新分发.NET框架,其中最简单的一种应该算是使用VS.NET2003了。大致的步骤如下:
1.安装VS.NET框架引导程序插件。这个插件可以从微软的网站上下载,下载地址如下:
http://www.microsoft.com/downloads/details.aspx?familyid=627921a0-d9e7-43d6-a293-72f9c370bd19&displaylang=en
2.在"解决方案资源管理器"中,用鼠标右键单击安装和部署项目,在弹出的菜单中选择"视图"->"启动条件",打开"启动条件"管理器。
3.在"启动条件"管理器中,右键点击"目标计算机上的要求",在弹出的的菜单中选择"添加注册表启动条件"。你会发现在"搜索目标计算机"中多了一项"搜索 RegistryEntry1",在"启动条件"中多了一项"Condition1"。
4.选择"搜索 RegistryEntry1",在"属性"对话框中填写如下内容:
Property:MDACSEARCH
RegKey:Software\Microsoft\DataAccess
Root:vsdrrHKLM
Value:FullInstallVer
选择"Condition1" ,在"属性"对话框中填写如下内容:
Condition:MDACSEARCH>="2.6"
进行这一步是因为在安装.NET框架的时候需要MDAC。

OK,现在编译安装和部署项目,就得到了一个可以同时安装.NET框架的安装程序。

posted @ 2005-06-06 00:31 S.Sams 阅读(172) | 评论 (0)编辑
显示用户可以单击以执行操作的标准按钮。
CheckBox 控件(Windows 窗体)
指示条件是打开还是关闭。
CheckedListBox 控件(Windows 窗体)
显示项的列表,每个项旁边都有一个复选框。
ColorDialog 组件(Windows 窗体)
允许用户在预先配置的对话框中从调色板选择颜色以及将自定义颜色添加到该调色板。
ComboBox 控件(Windows 窗体)
在下拉式组合框中显示数据。
ContextMenu 组件(Windows 窗体)
向用户提供易于访问的菜单,该菜单包含与选定对象关联的常用命令。
DataGrid 控件(Windows 窗体)
显示数据集中的表格数据,并允许对数据源进行更新。
DateTimePicker 控件(Windows 窗体)
允许用户从日期或时间列表中选择单个项。
对话框控件和组件(Windows 窗体)
描述一组控件,这些控件允许用户执行与应用程序或系统的标准交互操作。
DomainUpDown 控件(Windows 窗体)
显示用户可以浏览并从中进行选择的文本字符串。
ErrorProvider 组件(Windows 窗体)
以非打扰方式向用户显示错误信息。
FolderBrowserDialog 组件(Windows 窗体)
显示一个界面,用户通过它可以浏览和选择目录或者创建新目录。
FontDialog 组件(Windows 窗体)
公开系统上当前安装的字体。
GroupBox 控件(Windows 窗体)
为其他控件提供可识别分组。
HelpProvider 组件(Windows 窗体)
将 HTML 帮助文件与 Windows 应用程序相关联。
HScrollBar 和 VScrollBar 控件(Windows 窗体)
通过在应用程序或控件中水平或垂直滚动,提供在项列表或大量信息中导航的功能。
ImageList 组件(Windows 窗体)
在其他控件上显示图像。
Label 控件(Windows 窗体)
显示用户无法编辑的文本。
LinkLabel 控件(Windows 窗体)
使您可以将 Web 样式的链接添加到 Windows 窗体应用程序中。
ListBox 控件(Windows 窗体)
允许用户从预定义的列表中选择一项或多项。
ListView 控件(Windows 窗体)
按照 Windows 资源管理器的方式显示带图标的项列表。
MainMenu 组件(Windows 窗体)
在运行时显示菜单。
MonthCalendar 控件(Windows 窗体)
显示直观的图形界面,供用户查看和设置日期信息。
NotifyIcon 组件(Windows 窗体)
显示在后台运行且在其他情况下不具有用户界面的进程的图标。
NumericUpDown 控件(Windows 窗体)
显示用户可以浏览并从中进行选择的数字。
OpenFileDialog 组件(Windows 窗体)
允许用户通过预先配置的对话框打开文件。
PageSetupDialog 组件(Windows 窗体)
通过预先配置的对话框设置供打印的页详细信息。
Panel 控件(Windows 窗体)
为其他控件提供可识别分组,并允许滚动。
PictureBox 控件(Windows 窗体)
以位图、GIF、JPEG、图元文件或图标格式显示图形。
PrintDialog 组件(Windows 窗体)
选择打印机,选择要打印的页,并确定其他与打印相关的设置。
PrintDocument 组件(Windows 窗体)
设置对打印内容进行描述的属性,并在 Windows 应用程序中打印文档。
PrintPreviewControl 控件(Windows 窗体)
允许您创建自己的 PrintPreview 组件或对话框,而不是使用预先配置的版本。
PrintPreviewDialog 控件(Windows 窗体)
按文档打印时的样式显示文档。
ProgressBar 控件(Windows 窗体)
以图形方式指示操作的完成进度。
RadioButton 控件(Windows 窗体)
向用户显示由两个或更多个互斥选项组成的选项组。
RichTextBox 控件(Windows 窗体)
允许用户通过格式设置来输入、显示和操作文本。
SaveFileDialog 组件(Windows 窗体)
选择要保存的文件和该文件的保存位置。
Splitter 控件(Windows 窗体)
允许用户调整停靠控件的大小。
StatusBar 控件(Windows 窗体)
显示与具有焦点的控件相关的状态信息。
TabControl 控件(Windows 窗体)
显示多个可以包含图片或其他控件的选项卡。
TextBox 控件(Windows 窗体)
允许来自用户的可编辑多行输入。
Timer 组件(Windows 窗体)
按定时间隔引发事件。
ToolBar 控件(Windows 窗体)
显示激活命令的菜单和位图化按钮。
ToolTip 组件(Windows 窗体)
在用户指向其他控件时显示文本。
TrackBar 控件(Windows 窗体)
允许在大量信息中导航,或直观地调整数字设置。
TreeView 控件(Windows 窗体)
显示可以展开或折叠的节点层次结构。
用于列出选项的 Windows 窗体控件
描述一组用于为用户提供可从中选择的选项列表的控件。
posted @ 2005-06-01 23:59 S.Sams 阅读(292) | 评论 (0)编辑