using System;
using System.IO;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Collections;
using System.Data;
using System.Data.SqlClient;

namespace cnfeol_cs
{
    
/// <summary>
    
/// 通过GSM MODEM 发送短消息
    
/// </summary>

    public class SMSSender
    
{
        
private string enter="\r\n";
        
private TcpClient tc;
        
private NetworkStream ns;
        
private string _phonenumber="";
        
private string _msg="";
        
private string _server=System.Configuration.ConfigurationSettings.AppSettings["SMS.Server"];
        
private int _serverport=9518;
        
private string _username=System.Configuration.ConfigurationSettings.AppSettings["SMS.UserName"];
        
private string _password=System.Configuration.ConfigurationSettings.AppSettings["SMS.Password"];
        
private string errmsg;
        
private string logs="";
        
private string _smsvalidcode="";
        
private Hashtable Recipient=new Hashtable();
        
private int RecipientNum=0;
        
private SqlConnection _connection;

        
/// <summary>
        
/// 用于记录下行日志的数据库连接
        
/// </summary>

        public SqlConnection Connection
        
{
            
set
            
{
                
this._connection = value;
            }

        }


        
/// <summary>
        
/// 手机验证码
        
/// </summary>

        public string SMSValidCode
        
{
            
set
            
{
                
this._smsvalidcode = value;
            }

        }


        
/// <summary>
        
/// 接收方号码
        
/// </summary>

        public string PhoneNumber
        
{
            
get
            
{
                
return this._phonenumber;
            }

            
set
            
{
                
this._phonenumber = value;
            }

        }


        
/// <summary>
        
/// 发送信息主体
        
/// </summary>

        public string Msg
        
{
            
get
            
{
                
return this._msg;
            }

            
set
            
{
                
this._msg = value;
            }

        }


        
/// <summary>
        
/// 发送服务器
        
/// </summary>

        public string Server
        
{
            
set
            
{
                _server
=value;
            }

        }



        
/// <summary>
        
/// 发送服务器端口
        
/// </summary>

        public int ServerPort
        
{
            
set
            
{
                _serverport
=value;
            }

        }


        
/// <summary>
        
/// 发送服务器验证用户名
        
/// </summary>

        public string UserName
        
{
            
set
            
{
                _username
=value;
            }

        }


        
/// <summary>
        
/// 发送服务器验证密码
        
/// </summary>

        public string Password
        
{
            
set
            
{
                _password
=value;
            }

        }


        
/// <summary>
        
/// 错误信息
        
/// </summary>

        public string ErrorMessage
        
{
            
get
            
{
                
return errmsg;
            }

        }


        
/// <summary>
        
/// 发送日志
        
/// </summary>

        public string Logs
        
{
            
get
            
{
                
return logs;
            }

        }


        
/// <summary>
        
/// 发送方法
        
/// </summary>
        
/// <returns></returns>

        public bool Send()
        
{
            
return SendSMS();
        }


        
void Dispose()
        
{
            
if(ns!=null)ns.Close();
            
if(tc!=null)tc.Close();
        }


        
/// <summary>
        
/// 发送SMTP命令
        
/// </summary>    

        private bool SendCommand(string str)
        
{
            
byte[]  WriteBuffer;
            
if(str==null||str.Trim()==String.Empty)
            
{
                
return true;
            }

            logs
+=str+this.enter;
            WriteBuffer 
= Encoding.Default.GetBytes(str);
            
try
            
{
                ns.Write(WriteBuffer,
0,WriteBuffer.Length);
            }

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

            
return true;
        }


        
/// <summary>
        
/// 接收SMTP服务器回应
        
/// </summary>

        private bool RecvResponse()
        
{
            
int StreamSize;
            
string ReturnValue = String.Empty;
            
byte[]  ReadBuffer = new byte[1024] ;
            
try
            
{
                StreamSize
=ns.Read(ReadBuffer,0,ReadBuffer.Length);
            }

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


            
if (StreamSize==0)
            
{
                
return false;
            }

            
else
            
{
                ReturnValue 
= Encoding.Default.GetString(ReadBuffer).Substring(0,StreamSize);
                logs
+=ReturnValue+this.enter;
                
return true;
            }

        }


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

        private bool Dialog(string str,string errstr)
        
{
            
if(str==null||str.Trim()=="")
            
{
                
return true;
            }

            
if(SendCommand(str))
            
{
                RecvResponse();
                
return true;
            }

            
else
            
{
                
return false;
            }


        }


        
/// <summary>
        
/// 添加一组收件人和信息,参数为字符串数组
        
/// </summary>
        
/// <param name="Recipients">保存有收件人地址的字符串数组</param>    

        public bool AddRecipient(string msg,params string[] Recipients)
        
{
            
if(Recipient==null)
            
{
                Dispose();
                
throw(new ArgumentNullException("Recipients"));
            }

            
for(int i=0;i<Recipients.Length;i++)
            
{
                
string recipient = Recipients[i].Trim();
                
if(recipient==String.Empty)
                
{
                    Dispose();
                    
throw(new ArgumentNullException("Recipients["+ i +"]"));
                }

                AddRecipient(recipient,msg);
            }

            
return true;
        }

        

        
/// <summary>
        
/// 添加一个收件人和信息
        
/// </summary>    
        
/// <param name="Recipients">收件人地址</param>

        private void AddRecipient(string Recipients,string msg)
        
{
            Recipient.Add(RecipientNum.ToString()
+"."+Recipients,msg);
            RecipientNum
++;
        }


        
/// <summary>
        
/// 发送短信
        
/// </summary>
        
/// <returns></returns>

        private bool SendSMS()
        
{
            
try
            
{
                tc
=new TcpClient(_server,_serverport);
            }

            
catch(Exception e)
            
{
                errmsg
=e.ToString();
                
return false;
            }


            ns 
= tc.GetStream();

            
string SendBufferstr;
            SqlCommand  sqlCommand 
= null;

            SendBufferstr
="<登陆>" + _username + "#" + _password + "#";
            
if(!Dialog(SendBufferstr,"登陆错误"))
                
return false;
            
if(Recipient==null||Recipient.Count==0)
            
{
                Recipient.Add(RecipientNum.ToString()
+"."+_phonenumber,_msg);
            }

            IDictionaryEnumerator myEnumerator 
= Recipient.GetEnumerator();
            
while(myEnumerator.MoveNext())
            
{
                
string id=myEnumerator.Key.ToString().Substring(0,myEnumerator.Key.ToString().IndexOf("."));
                
string pnum=myEnumerator.Key.ToString().Substring(myEnumerator.Key.ToString().IndexOf(".")+1);
                
string msg=myEnumerator.Value.ToString();
                
string newmsg=msg;
                
string[] msgarr;
                
int lenlimit=70;
                
int j=1,i=0,k=0;
                
if(msg.Length>lenlimit)
                
{
                    newmsg
=msg="("+j+"/`)"+msg; //`表示页数
                    for(i=0;i<msg.Length;i++)
                    
{
                        
if(k==lenlimit)
                        
{
                            j
++;
                            newmsg
=newmsg.Substring(0,i)+"#("+j+"/`)"+newmsg.Substring(i);
                            k
=-1;
                        }

                        k
++;
                    }

                }

                newmsg
=newmsg.Replace("`",j.ToString());
                msgarr
=newmsg.Split('#');
                
for(i=0;i<msgarr.Length;i++)
                
{
                    SendBufferstr
="<发短信>" + id + "." + (i+1).ToString() + "#" + pnum + "#" + msgarr[i] + "#";
                    
//记录日志
                    try
                    
{
                        SqlDataProvider sqlDataProvider
=new SqlDataProvider();
                        sqlCommand 
= sqlDataProvider.CreateStoredProcedureCommand("spInsertSMSDownLog",
                            SqlDataProvider.BuildParameter(
null,"@phonenumber",SqlDbType.VarChar,50,pnum),
                            SqlDataProvider.BuildParameter(
null,"@msg",SqlDbType.VarChar,200,msgarr[i]),
                            SqlDataProvider.BuildParameter(
null,"@validcode",SqlDbType.VarChar,100,_smsvalidcode)
                            );                        
                        sqlDataProvider.ExecuteNonQuery(sqlCommand);
                    }

                    
catch(Exception ex)
                    
{
                        PublicTools.RaiseError(ex.ToString());
                    }

                    
if(System.Configuration.ConfigurationSettings.AppSettings["IsDebug"]=="true")
                    
{
                        logs
+=SendBufferstr+this.enter;
                    }

                    
else
                    
{
                        
if(SendCommand(SendBufferstr))
                        
{
                            RecvResponse();
                        }

                    }

                }

            }


            Dispose();
            
return true;
        }


        
public SMSSender()
        
{
            
//
            
// TODO: 在此处添加构造函数逻辑
            
//
        }

    }

}