#region 属性定义
/// <summary>
/// Smtp服务器
/// </summary>
public string AServer
{
get
{
return this._server;
}
set
{
this._server=value;
}
} /// <summary>
/// 端口
/// </summary>
public int APort
{
get
{
return this._port;
}
set
{
this._port=value;
}
} /// <summary>
/// 用户名
/// </summary>
public String AUsername
{
get
{
return this._username;
}
set
{
this._username=value;
}
} /// <summary>
/// 密码
/// </summary>
public String Apassword
{
get
{
return this._password;
}
set
{
this._password=value;
}
}
/// <summary>
/// 主题
/// </summary>
public String Asubject
{
get
{
return this._subject;
}
set
{
this._subject=value;
}
}
/// <summary>
/// 文本内容
/// </summary>
public String Abody
{
get
{
return this._body;
}
set
{
this._body=value;
}
}
/// <summary>
/// 超文本内容
/// </summary>
public string Ahtmlbody
{
get
{
return this._htmlbody;
}
set
{
this._htmlbody=value;
}
}
/// <summary>
/// 发件人地址
/// </summary>
public string Afrom
{
get
{
return this._from;
}
set
{
this._from=value;
}
}
/// <summary>
/// 收件人地址
/// </summary>
public string Ato
{
get
{
return this._to;
}
set
{
this._to=value;
}
}
/// <summary>
/// 发件人姓名
/// </summary>
public string Afromname
{
get
{
return this._fromname;
}
set
{
this._fromname=value;
}
}
/// <summary>
/// 收件人姓名
/// </summary>
public string Atoname
{
get
{
return this._toname;
}
set
{
this._toname=value;
}
}
/// <summary>
/// 语言编码
/// </summary>
public string Acharset
{
get
{
return this._charset;
}
set
{
this._charset=value;
}
}
/// <summary>
/// 附件列表
/// </summary>
public DataTable Afilelist
{
get
{
return this._filelist;
}
set
{
this._filelist=value;
}
}
/// <summary>
/// 邮件优先级
/// </summary>
public int Apriority
{
get
{
return this._priority;
}
set
{
this._priority=value;
}
} /// <summary>
/// 出错信息
/// </summary>
public string Aerrmessage
{
get
{
return this._errmessage;
}
} #endregion

解决方案 »

  1.   


    /// <summary>
    /// 向服务器写入命令
    /// </summary>
    /// <param name="strCmd">需要输入的命令或数据的字符串</param>
    /// <param name="charset">数据的字符语言编码,一般可以设置为GB2312 </param>
    private void WriteStream(string strCmd,string charset)
    {
    Stream TcpStream;//定义操作对象 strCmd+="\r\n";//加入换行符 TcpStream=this.GetStream();//获取数据流 //将命令行转化为byte[] 
    byte[] bWrite=Encoding.GetEncoding(charset).GetBytes(strCmd.ToCharArray()); int start=0;    
       
    int length=bWrite.Length;    
       
    int page=0;    
       
    int size=75;   
       
    int count=size; 
      
    try
    {
    if(length>75)
    {
    //数据分页 if(length%size>0)
    page=length/size+1;
    else
    page=length/size; for(int i=0;i<page;i++)
    {
    start=i*size;

    if(i==page-1)
    count=length-(i*size); TcpStream.Write(bWrite,start,count);
    }
    }
    else
    TcpStream.Write(bWrite,0,bWrite.Length);
    }
    catch(Exception ex)
    {
    this._errmessage+=this._errmessage.Length==0?ex.Message:ex.Message+";";
    }
    }
    /// <summary>
    /// 获取服务器的返回信息
    /// </summary>
    private string ReceiveStream()
    {
    string sp=null; byte[] by=new byte[1024]; NetworkStream ns=this.GetStream(); int size=ns.Read(by,0,by.Length); if(size>0)
    sp=Encoding.Default.GetString(by); return sp;
    }
    /// <summary>
    /// 发出命令并判断返回信息是否正确
    /// 我们进行每一步操作时,都是通过状态码来确定是否成功的,那么如果操作成功,就会返回正确的状态码,
    /// 根据这个原理,我们在这个方法中,同时输入命令和表明操作成功的状态码,通过获取的数据判断返回的是不是正确的状态
    /// 以此来决定是否继续进行下一步操作。在这里我要告诉大家一些基本的状态码表示的含义。
    ///  211 帮助返回系统状态     
    ///  214 帮助信息      
    ///  220 服务准备就绪     
    ///  221 关闭连接     
    ///  250 请求操作就绪     
    ///  251 用户不在本地,转寄到     
    ///  354 开始邮件输入      
    ///  421 服务不可用      
    ///  450 操作未执行,邮箱忙      
    ///  451 操作中止,本地错误      
    ///  452 操作未执行,存储空间不足      
    ///  500 命令不可识别或语法错      
    ///  501 参数语法错      
    ///  502 命令不支持      
    ///  503 命令顺序错      
    ///  504 命令参数不支持      
    ///  550 操作未执行,邮箱不可用      
    ///  551 非本地用户      
    ///  552 中止,存储空间不足      
    ///  553 操作未执行,邮箱名不正确      
    ///  554 传输失败 
    /// </summary>
    /// <param name="strCmd">需要输入的命令或数据的字符串</param>
    /// <param name="state">返回的表明操作成功的状态码 </param>
    private bool OperaStream(string strCmd,string state)
    {
    string sp=null; bool success=false; try
    {
    WriteStream(strCmd,this.Acharset);//写入命令

    sp = ReceiveStream();//接受返回信息 success=sp.IndexOf(state)!=-1; //判断状态码是否正确
    }
    catch(Exception ex)
    {
    this._errmessage+=this._errmessage.Length==0?ex.Message:ex.Message+";";
    } return success;
    }
    /// <summary>
    /// 获取服务器的连接
    /// </summary>
    public bool getMailServer() 
    {
    try
    {
    //域名解析
    IPAddress ipaddress;
    try
    {
    ipaddress=(IPAddress)System.Net.Dns.Resolve(this.AServer).AddressList.GetValue(0);
    }
    catch
    {
    ipaddress=IPAddress.Parse(this.AServer);
    } //将网络端点表示为 IP 地址和端口号
    IPEndPoint endpoint=new IPEndPoint(ipaddress,25); Connect(endpoint);//连接Smtp服务器 ReceiveStream();//获取连接信息 if (this.AUsername!=null) 
    {
    //开始进行服务器认证    
       
    //如果状态码是250则表示操作成功 
       
    if (!OperaStream("EHLO Localhost","250"))    
    {    
    this.Close();    
       
    return false;    
    } // if (!OperaStream("AUTH LOGIN","334")) 
    // { 
    // this.Close(); 
    //
    // return false;   
    // }  this.WriteStream("AUTH LOGIN",this.Acharset); AUsername=AuthStream(AUsername);//此处将username转换为Base64码 
       
    // if (!OperaStream(this.AUsername,"334")) 
    // { 
    // this.Close(); 
    //   
    // return false; 
    // }  this.WriteStream(this.AUsername,this.Acharset);
       
    Apassword=AuthStream(Apassword);//此处将password转换为Base64码 
       
    // if (!OperaStream(this.Apassword,"235")) 
    // { 
    // this.Close(); 
    //   
    // return false; 
    // }  this.WriteStream(this.Apassword,this.Acharset); return true; 
    }
    else//不需要验证
    return OperaStream("HELO Localhost","250"); 
    }
    catch
    {return false;}
    }
    /// <summary>
    /// 转换为Base64编码
    /// </summary>
    private string AuthStream(String strCmd) 

    try 

    byte[] by=Encoding.Default.GetBytes(strCmd.ToCharArray()); 
    strCmd=Convert.ToBase64String(by); 
    }    
    catch(Exception ex)   
    {
    return ex.Message;
    }  return strCmd; 
    }
    /// <summary>
    /// 发送Mail
    /// </summary>
    public void Send()
    {
    try
    {
    int sect;
    int span;
    int concount=0;
    while(!this.getMailServer())
    {
    if(concount>=3)
    {//联接3次无效退出
    this._errmessage="连接邮件服务器失败,发送失败!";
    return;
    }
    else
    {
    concount++;
    //等待3秒从新联接
    sect=DateTime.Now.Second;
    while(true)
    {
    span=DateTime.Now.Second-sect<0?DateTime.Now.Second-sect+60:DateTime.Now.Second-sect;
    if(span>=3)
    break;
    }
    } } //------发送邮件-----
    WriteStream("Mail From:"+this.Afrom,this.Acharset);//发件人 WriteStream("RCPT TO:"+this.Ato,this.Acharset);//收件人 WriteStream("DATA",this.Acharset);//发送数据 WriteStream("Date: "+DateTime.Now,this.Acharset);//时间     WriteStream("From: "+this.Afromname+"<"+this.Afrom+">",this.Acharset);//发件人 WriteStream("Subject: "+this.Asubject,this.Acharset);//主题     WriteStream("To:"+this.Atoname,this.Acharset);//收件人 //邮件格式    

    WriteStream("MIME-Version:1.0",this.Acharset);//MIME版本 WriteStream("Content-Type: text/html",this.Acharset);    

    WriteStream("Reply-To:"+this.Afrom,this.Acharset);//回复地址    

    WriteStream("X-Priority:"+this.Apriority,this.Acharset);//优先级    

    WriteStream("",this.Acharset);//里面的变量是事先定义好的,在头信息结束的时候,在写入一段空信息,这样Smtp服务器才会认为你已经写完了
    //从此处开始进行分隔输入    
    WriteStream("",Acharset);  WriteStream(Ahtmlbody,this.Acharset);    

    WriteStream("",Acharset);  //增加附件    
       
    // Attachment();//这个方法是我们在上面讲过的,实际上他放在这       
    // WriteStream("");    
       
    OperaStream(".","250");//最后写完了,输入"."     this._errmessage="发送成功!"; 
    }
    catch(Exception ex)
    {
    this._errmessage+=this._errmessage.Length==0?ex.Message:ex.Message+";";
    this._errmessage+="发送失败!";
    }
    finally
    {
    if(this.Active )
    {
    this.Dispose(true);
    }
    }
    }
    //--end
    }
    }
      

  2.   

    太长了,只好分开回复,将以上的两段和在一起就行,可以生成一个SmtpMail.cs文件,调用即可。
    顺便提供一个SmtpMail.xml文件供参考:
    <?xml version="1.0"?>
    <doc>
        <assembly>
            <name>SendMail</name>
        </assembly>
        <members>
            <member name="T:SendMail.SmtpMail">
                <summary>
                SmtpMail 邮件发送            </summary>
            </member>
            <member name="M:SendMail.SmtpMail.#ctor">
                <summary>
                构造函数            </summary>
            </member>
            <member name="M:SendMail.SmtpMail.WriteStream(System.String,System.String)">
                <summary>
                向服务器写入命令
                </summary>
                <param name="strCmd">需要输入的命令或数据的字符串</param>
                <param name="charset">数据的字符语言编码,一般可以设置为GB2312 </param>
            </member>
            <member name="M:SendMail.SmtpMail.ReceiveStream">
                <summary>
                获取服务器的返回信息
                </summary>
            </member>
            <member name="M:SendMail.SmtpMail.OperaStream(System.String,System.String)">
                <summary>
                发出命令并判断返回信息是否正确            我们进行每一步操作时,都是通过状态码来确定是否成功的,那么如果操作成功,就会返回正确的状态码,            根据这个原理,我们在这个方法中,同时输入命令和表明操作成功的状态码,通过获取的数据判断返回的是不是正确的状态            以此来决定是否继续进行下一步操作。在这里我要告诉大家一些基本的状态码表示的含义。             211 帮助返回系统状态     
                 214 帮助信息      
                 220 服务准备就绪     
                 221 关闭连接     
                 250 请求操作就绪     
                 251 用户不在本地,转寄到     
                 354 开始邮件输入      
                 421 服务不可用      
                 450 操作未执行,邮箱忙      
                 451 操作中止,本地错误      
                 452 操作未执行,存储空间不足      
                 500 命令不可识别或语法错      
                 501 参数语法错      
                 502 命令不支持      
                 503 命令顺序错      
                 504 命令参数不支持      
                 550 操作未执行,邮箱不可用      
                 551 非本地用户      
                 552 中止,存储空间不足      
                 553 操作未执行,邮箱名不正确      
                 554 传输失败 
                </summary>
                <param name="strCmd">需要输入的命令或数据的字符串</param>
                <param name="state">返回的表明操作成功的状态码 </param>
            </member>
            <member name="M:SendMail.SmtpMail.getMailServer">
                <summary>
                获取服务器的连接
                </summary>
            </member>
            <member name="M:SendMail.SmtpMail.AuthStream(System.String)">
                <summary>
                转换为Base64编码
                </summary>
            </member>
            <member name="M:SendMail.SmtpMail.Send">
                <summary>
                发送Mail
                </summary>
            </member>
            <member name="P:SendMail.SmtpMail.AServer">
                <summary>
                Smtp服务器            </summary>
            </member>
            <member name="P:SendMail.SmtpMail.APort">
                <summary>
                端口
                </summary>
            </member>
            <member name="P:SendMail.SmtpMail.AUsername">
                <summary>
                用户名            </summary>
            </member>
            <member name="P:SendMail.SmtpMail.Apassword">
                <summary>
                密码
                </summary>
            </member>
            <member name="P:SendMail.SmtpMail.Asubject">
                <summary>
                主题
                </summary>
            </member>
            <member name="P:SendMail.SmtpMail.Abody">
                <summary>
                文本内容
                </summary>
            </member>
            <member name="P:SendMail.SmtpMail.Ahtmlbody">
                <summary>
                超文本内容            </summary>
            </member>
            <member name="P:SendMail.SmtpMail.Afrom">
                <summary>
                发件人地址
                </summary>
            </member>
            <member name="P:SendMail.SmtpMail.Ato">
                <summary>
                收件人地址
                </summary>
            </member>
            <member name="P:SendMail.SmtpMail.Afromname">
                <summary>
                发件人姓名            </summary>
            </member>
            <member name="P:SendMail.SmtpMail.Atoname">
                <summary>
                收件人姓名            </summary>
            </member>
            <member name="P:SendMail.SmtpMail.Acharset">
                <summary>
                语言编码
                </summary>
            </member>
            <member name="P:SendMail.SmtpMail.Afilelist">
                <summary>
                附件列表
                </summary>
            </member>
            <member name="P:SendMail.SmtpMail.Apriority">
                <summary>
                邮件优先级            </summary>
            </member>
            <member name="P:SendMail.SmtpMail.Aerrmessage">
                <summary>
                出错信息
                </summary>
            </member>
        </members>
    </doc>
    《注:这个类我用过了,可以用,就算是需要身份验证的Smtp服务器也可以,但是相关信息一定要传入》
      

  3.   

    非常感谢paladinfang(哲别)老兄,不知道用.net怎么最简单的实现?
      

  4.   

    将最上面的两段合成一个SmtpMail.cs文件,在其他页面中可以调用,调用的示例代码如下:
    SendMail.SmtpMail sm=new SendMail.SmtpMail(); \\实例化
    sm.Abody="Hello";//没用
    sm.Acharset="GB2312";//编码
    sm.Afrom=ConfigurationSettings.AppSettings["HRAPPS.SendMailFromAddr"].ToString();//发件人mail地址
    sm.Afromname="阿猫阿狗";//发件人
    sm.Ahtmlbody="<html><head></head><body bgcolor=#ffaa40 >"+BodyMsg+"</body></html>";//邮件内容
    sm.APort=25;
    sm.AServer=ConfigurationSettings.AppSettings["SmtpServer_String"].ToString();//邮件服务器
    if(ConfigurationSettings.AppSettings["HRAPPS.cdoSendUserName"].ToString().Length>0)
    { sm.AUsername=ConfigurationSettings.AppSettings["HRAPPS.cdoSendUserName"].ToString();//身份验证的用户名 sm.Apassword=ConfigurationSettings.AppSettings["HRAPPS.cdoSendPassword"].ToString();//身份验证的密码
    }
    sm.Asubject=EmailSubject_Text.Text.ToString();//主题
    sm.Ato=Tostr.Trim();//收件人的邮件地址
    sm.Atoname=Results["AppName"].ToString();//收件人姓名
    sm.Apriority=1;//邮件重要程度(1、普通;2、急;3、特急)
    sm.Send();