|
|
|
|
|
|
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: 在此处添加构造函数逻辑
//
}
}
}

发表于
2005-12-28 16:47
萝卜地
阅读( 264)
评论()
收藏
举报
|
|