/// <summary> 
/// 服务器交互记录 
/// </summary> 
private string logs="";  /// <summary> 
/// 服务器交互记录,如发现本组件不能使用的SMTP服务器,请将出错时的Logs发给我([email protected]),我将尽快查明原因。 
/// </summary> 
public string Logs 

get 

return logs; 


         /// <summary> 
/// SMTP回应代码哈希表 
/// </summary> 
private void SMTPCodeAdd() 

ErrCodeHT.Add("500","邮箱地址错误"); 
ErrCodeHT.Add("501","参数格式错误"); 
ErrCodeHT.Add("502","命令不可实现"); 
ErrCodeHT.Add("503","服务器需要SMTP验证"); 
ErrCodeHT.Add("504","命令参数不可实现"); 
ErrCodeHT.Add("421","服务未就绪,关闭传输信道"); 
ErrCodeHT.Add("450","要求的邮件操作未完成,邮箱不可用(例如,邮箱忙)"); 
ErrCodeHT.Add("550","要求的邮件操作未完成,邮箱不可用(例如,邮箱未找到,或不可访问)"); 
ErrCodeHT.Add("451","放弃要求的操作;处理过程中出错"); 
ErrCodeHT.Add("551","用户非本地,请尝试<forward-path>"); 
ErrCodeHT.Add("452","系统存储不足,要求的操作未执行"); 
ErrCodeHT.Add("552","过量的存储分配,要求的操作未执行"); 
ErrCodeHT.Add("553","邮箱名不可用,要求的操作未执行(例如邮箱格式错误)"); 
ErrCodeHT.Add("432","需要一个密码转换"); 
ErrCodeHT.Add("534","认证机制过于简单"); 
ErrCodeHT.Add("538","当前请求的认证机制需要加密"); 
ErrCodeHT.Add("454","临时认证失败"); 
ErrCodeHT.Add("530","需要认证");  RightCodeHT.Add("220","服务就绪"); 
RightCodeHT.Add("250","要求的邮件操作完成"); 
RightCodeHT.Add("251","用户非本地,将转发向<forward-path>"); 
RightCodeHT.Add("354","开始邮件输入,以<enter>.<enter>结束"); 
RightCodeHT.Add("221","服务关闭传输信道"); 
RightCodeHT.Add("334","服务器响应验证Base64字符串"); 
RightCodeHT.Add("235","验证成功"); 

/// <summary> 
/// 将字符串编码为Base64字符串 
/// </summary> 
/// <param name="estr">要编码的字符串</param> 
private string Base64Encode(string str) 

byte[] barray; 
barray=Encoding.Default.GetBytes(str); 
return Convert.ToBase64String(barray); 

/// <summary> 
/// 将Base64字符串解码为普通字符串 
/// </summary> 
/// <param name="dstr">要解码的字符串</param> 
private string Base64Decode(string str) 

byte[] barray; 
barray=Convert.FromBase64String(str); 
return Encoding.Default.GetString(barray); 
}  /// <summary> 
/// 得到上传附件的文件流 
/// </summary> 
/// <param name="FilePath">附件的绝对路径</param> 
private string GetStream(string FilePath) 

//建立文件流对象 
System.IO.FileStream FileStr=new System.IO.FileStream(FilePath,System.IO.FileMode.Open); 
byte[] by=new byte[System.Convert.ToInt32(FileStr.Length)]; 
FileStr.Read(by,0,by.Length); 
FileStr.Close(); 
return(System.Convert.ToBase64String(by)); 

/// <summary> 
/// 添加邮件附件 
/// </summary> 
/// <param name="path">附件绝对路径</param> 
public void AddAttachment(string path) 

Attachments.Add(path); 

       
        /// <summary> 
/// 添加一个收件人 
/// </summary>    
/// <param name="str">收件人地址</param> 
public bool AddRecipient(string str) 

str=str.Trim(); 
if(str==null||str==""||str.IndexOf("@")==-1) 
return true; 
if(RecipientNum<recipientmaxnum) 

Recipient.Add(RecipientNum,str); 
RecipientNum++;             
return true; 

else 

errmsg+="收件人过多"; 
return false; 


/// <summary> 
/// 最多收件人数量 
/// </summary> 
public int RecipientMaxNum 

set 

recipientmaxnum = value; 


/// <summary> 
/// 添加一组收件人(不超过recipientmaxnum个),参数为字符串数组 
/// </summary> 
/// <param name="str">保存有收件人地址的字符串数组(不超过recipientmaxnum个)</param>    
public bool AddRecipient(string[] str) 

for(int i=0;i<str.Length;i++) 

if(!AddRecipient(str[i])) 

return false; 


return true; 
}  /// <summary> 
/// 发送SMTP命令 
/// </summary>    
private bool SendCommand(string str) 

byte[]  WriteBuffer; 
if(str==null||str.Trim()=="") 

return true; 

logs+=str; 
WriteBuffer = Encoding.Default.GetBytes(str); 
try 

ns.Write(WriteBuffer,0,WriteBuffer.Length); 

catch 

errmsg="网络连接错误"; 
return false; 

return true; 
}  /// <summary> 
/// 接收SMTP服务器回应 
/// </summary> 
private string RecvResponse() 

int StreamSize; 
string Returnvalue = ""; 
byte[]  ReadBuffer = new byte[1024] ; 
try 

StreamSize=ns.Read(ReadBuffer,0,ReadBuffer.Length); 

catch 

errmsg="网络连接错误"; 
return "false"; 
}  if (StreamSize==0) 

return Returnvalue ; 

else 

Returnvalue = Encoding.Default.GetString(ReadBuffer).Substring(0,StreamSize); 
logs+=Returnvalue; 
return  Returnvalue; 


/// <summary> 
/// 与服务器交互,发送一条命令并接收回应。 
/// </summary> 
/// <param name="Command">一个要发送的命令</param> 
/// <param name="errstr">如果错误,要反馈的信息</param> 
private bool Dialog(string str,string errstr) 

if(str==null||str.Trim()=="") 

return true; 

if(SendCommand(str)) 

string RR=RecvResponse(); 
if(RR=="false") 

return false; 

string RRCode=RR.Substring(0,3); 
if(RightCodeHT[RRCode]!=null) 

return true; 

else 

if(ErrCodeHT[RRCode]!=null) 

errmsg+=(RRCode+ErrCodeHT[RRCode].ToString()); 
errmsg+=enter; 

else 

errmsg+=RR; 

errmsg+=errstr; 
return false; 


else 

return false; 
}  } 
/// <summary> 
/// 与服务器交互,发送一组命令并接收回应。 
/// </summary>  private bool Dialog(string[] str,string errstr) 

for(int i=0;i<str.Length;i++) 

if(!Dialog(str[i],"")) 

errmsg+=enter; 
errmsg+=errstr; 
return false; 

}  return true; 

解决方案 »

  1.   

    JS
    “/SmtpMail”应用程序中的服务器错误。
    --------------------------------------------------------------------------------索引和长度必须引用该字符串内的位置。参数名: length 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。参数名: length源错误: 
    行 478: return false; 
    行 479: } 
    行 480: string RRCode=RR.Substring(0,3); 
    行 481: if(RightCodeHT[RRCode]!=null) 
    行 482: { 
     源文件: e:\hgoffice\smtpmail\esmtpmail.cs    行: 480 堆栈跟踪: 
    [ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。
    参数名: length]
       System.String.Substring(Int32 startIndex, Int32 length) +226
       SmtpMail.ESmtpMail.Dialog(String str, String errstr) in e:\hgoffice\smtpmail\esmtpmail.cs:480
       SmtpMail.ESmtpMail.SendEmail() in e:\hgoffice\smtpmail\esmtpmail.cs:670
       SmtpMail.ESmtpMail.Send() in e:\hgoffice\smtpmail\esmtpmail.cs:697
       SmtpMail.ESmtp.btnSend_Click(Object sender, EventArgs e) in e:\hgoffice\smtpmail\esmsamples.aspx.cs:121
       System.Web.UI.WebControls.Button.OnClick(EventArgs e) +108
       System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +57
       System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +18
       System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
       System.Web.UI.Page.ProcessRequestMain() +1277 
    --------------------------------------------------------------------------------
    版本信息: Microsoft .NET Framework 版本:1.1.4322.573; ASP.NET 版本:1.1.4322.573
      

  2.   

    http://www.microsoft.com/China/Community/program/originalarticles/TechDoc/sendmail.mspx