200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 利用139 189 yahoo等邮箱短信提示来发短信提示

利用139 189 yahoo等邮箱短信提示来发短信提示

时间:2022-10-04 04:37:16

相关推荐

利用139 189 yahoo等邮箱短信提示来发短信提示

综合现在能查到的免费短信发送方式,在飞信今年未升级前,大多是利用分析出的飞信客户端协议来发送短信,

优点是速度快,使用简单!

后来由于飞信协议的升级,以及验证码问题,大多的此类发送方式已经挂掉了,

网上也有关于利用google日历来变相进行短信发送的方法,

还有就是利用139邮箱,实际上不仅仅是139邮箱,189,yahoo等很多邮箱服务商都提供短信通知功能!

今天在首页又看到一篇文章利用139邮箱来进行短消息发送,随后自己测试了下189邮箱,下面将封装一个类来实现此功能

首先,在用smtp 发信测试的时候,发现 139,189等邮箱的smtp服务器不兼容.net smtp类的邮件发送,但是outlook等一些软件可以正常使用

关于.net smtpclient类不能发送139,189邮件服务器的问题也有人抓包分析了,是因为这2个邮件服务器对于一个命令解析的不兼容,在此不多说了!有兴趣可以google查下!

言规正传,既然这种变相的短信发送方式,是利用邮件服务商提供的一个新邮件短信提示功能,那么就是说我的支持短信提示的邮箱只要收到信邮件,就会由邮件服务商向

我们事先设置的手机发送新邮件提示, 139,189邮箱非别是移动和电信的手机邮箱,所以默认是跟手机账号关联的,yahoo邮箱则可以自行设置手机账号,具体的邮箱接收短信

的设置需要根据邮箱支持的功能自行设定,这里不多解释了,贴下189的短信提示设置:

清楚了上面这层原理,那我们就直接来写代码了,这里说明下:为了简化操作,这里使用。net smtpclient来发信,

所以配置smtp发送的时候不支持的是无法使用的,其实配置一般的支持smtp发送邮件的就行,我会给出用QQ邮箱发信的测试用例!

以下简单的封装,通过SmtpClient来给能够进行短信提示的邮箱发送新邮件,已达到变相短信提示目的!

publicclassSmsAPI:IDisposable

{

#regionfields

///<summary>

///.Mail.SmtpClient对象

///</summary>

staticSmtpClient_smtp;

SmtpConfig_config;

///<summary>

///是否已释放过资源

///</summary>

booldisponsed=false;

///<summary>

///异步发送完成事件

///</summary>

eventEventHandler<SendInfo>_event;

///<summary>

///

///</summary>

objectobjectLock=newObject();

#endregion

#regiondelegates/events

///<summary>

///异步发送完后触发的事件

///</summary>

publiceventEventHandler<SendInfo>SendCompleted

{

add

{

lock(objectLock)

{

_event+=value;

}

}

remove

{

lock(objectLock)

{

_event-=value;

}

}

}

#endregion

#regionmethods

///<summary>

///构造函数

///</summary>

///<paramname="xmlpath">Smtp的xml配置文件</param>

publicSmsAPI(stringxmlpath)

{

if(!File.Exists(xmlpath))

thrownewFileNotFoundException("error:notfoundconfigxmlfile");

using(FileStreamfs=newFileStream(xmlpath,FileMode.Open,FileAccess.Read))

{

XmlSerializerxs=newXmlSerializer(typeof(SmtpConfig));

_config=xs.Deserialize(fs)asSmtpConfig;

InitSmtp(_config.Host,_config.Port,_config.Sll,_config.User,_config.Password);/*初始化SMTPCLIENT对象*/

fs.Close();

}

}

///<summary>

///构造函数

///</summary>

///<paramname="host">SMTP服务器</param>

///<paramname="user">SMTP用户名</param>

///<paramname="password">SMTP密码</param>

publicSmsAPI(stringhost,stringuser,stringpassword)

:this(host,25,false,user,password)

{

}

///<summary>

///构造函数

///</summary>

///<paramname="host">SMTP服务器</param>

///<paramname="port">SMTP端口</param>

///<paramname="ssl">是否使用SLL</param>

///<paramname="user">SMTP用户名</param>

///<paramname="password">SMTP密码</param>

publicSmsAPI(stringhost,intport,boolssl,stringuser,stringpassword)

{

InitSmtp(host,port,ssl,user,password);/*初始化SMTPCLIENT对象*/

}

///<summary>

///初始化SMTP对象

///</summary>

///<paramname="host">SMTP服务器</param>

///<paramname="port">SMTP端口</param>

///<paramname="ssl">是否使用SLL</param>

///<paramname="user">SMTP用户名</param>

///<paramname="password">SMTP密码</param>

privatevoidInitSmtp(stringhost,intport,boolssl,stringuser,stringpassword)

{

if(host==null||host.Length==0)

thrownewArgumentNullException("error:hostisnull");

if(port<0||port>65534)

thrownewArgumentException("error:port(0~65534)");

_smtp=newSmtpClient();

_smtp.SendCompleted+=newSendCompletedEventHandler(SendCompletedProc);//设置SmtpClient对象的SendCompleted事件

_smtp.Host=host;

_smtp.Port=port;

_smtp.EnableSsl=ssl;

_smtp.Credentials=newNetworkCredential(user,password);

_config=newSmtpConfig(host,port,ssl,user,password);//实例一个SmtpConfig对象

}

///<summary>

///SmtpClient.SendCompleted事件的绑定函数

///</summary>

///<paramname="sender"></param>

///<paramname="e"></param>

voidSendCompletedProc(objectsender,AsyncCompletedEventArgse)

{

SendInfoinfo=e.UserStateasSendInfo;

info.Ex=e.Error;//这里设置info对象的Ex属性

if(_event!=null)

_event(null,info);//事件投递给上层调用

}

///<summary>

///实现IDisponse接口Disponse方法

///</summary>

publicvoidDispose()

{

Disponse(true);

GC.SuppressFinalize(this);

}

///<summary>

///资源释放

///</summary>

///<paramname="disponseing"></param>

protectedvirtualvoidDisponse(booldisponseing)

{

if(!disponsed)

{

if(disponseing)

{

//释放受控资源

_smtp=null;

_config=null;

}

//释放非受控资源

}

disponsed=true;

}

///<summary>

///发送邮件

///</summary>

///<paramname="_mail">邮件对象</param>

publicvoidSend(MailMessage_mail)

{

try

{

_smtp.SendAsync(_mail,newSendInfo(_mail.To[0].ToString(),DateTime.Now,null));

}

catch(Exceptionex)

{

Console.WriteLine(ex.Message);

}

}

///<summary>

///发送邮件

///</summary>

///<paramname="from">发件人</param>

///<paramname="to"><收件人/param>

///<paramname="subject">主题</param>

///<paramname="body">正文</param>

publicvoidSend(stringfrom,stringto,stringsubject,stringbody)

{

try

{

MailMessage_mail=newMailMessage();

_mail.From=newMailAddress(from);

_mail.To.Add(newMailAddress(to));

_mail.Subject=subject;

_mail.IsBodyHtml=true;

_mail.Body=body;

_smtp.SendAsync(_mail,newSendInfo(to,DateTime.Now,null));

}

catch(Exceptionex)

{

Console.WriteLine(ex.Message);

}

}

///<summary>

///getappdomainbasedirectory

///</summary>

///<returns></returns>

publicstaticstringAppDirectory()

{

returnAppDomain.CurrentDomain.BaseDirectory;

}

///<summary>

///XML序列化SmtpConfig对象

///</summary>

///<paramname="fileName">文件名</param>

publicvoidSaveConfig(stringfileName)

{

if(fileName==null||fileName.Length==0)

fileName="smsapi.xml";

stringxmlpath=bine(AppDirectory(),fileName);

using(StreamWritersw=newStreamWriter(xmlpath,false,System.Text.Encoding.Default))

{

XmlSerializerxs=newXmlSerializer(typeof(SmtpConfig));

xs.Serialize(sw,_config);

sw.Close();

}

}

#endregion

}

///<summary>

///发送信息

///</summary>

publicclassSendInfo:System.EventArgs

{

publicSendInfo(string_to,DateTime_time,Exception_ex)

{

this.To=_to;

this.Time=_time;

this.Ex=_ex;

}

///<summary>

///接收用户

///</summary>

publicstringTo

{

get;

set;

}

///<summary>

///发送时间

///</summary>

publicDateTimeTime

{

get;

set;

}

///<summary>

///发送产生的异常

///</summary>

publicExceptionEx

{

get;

set;

}

}SmtpConfig[Serializable]

publicclassSmtpConfig

{

publicSmtpConfig()

{

}

///<summary>

///构造函数

///</summary>

///<paramname="host">SMTP服务器</param>

///<paramname="port">SMTP端口</param>

///<paramname="ssl">是否启用SSL</param>

///<paramname="user">用户名</param>

///<paramname="password">密码</param>

publicSmtpConfig(stringhost,intport,boolssl,stringuser,stringpassword)

{

this.Host=host;

this.Port=port;

this.Sll=ssl;

this.User=user;

this.Password=password;

}

string_host="";

///<summary>

///SMTP服务器

///</summary>

publicstringHost

{

get{return_host;}

set

{

if(value==null||value.Length==0)

thrownewArgumentNullException("error:hostisnull");

_host=value;

}

}

int_port=25;

///<summary>

///SMTP端口

///</summary>

publicintPort

{

get{return_port;}

set

{

if(value<0||value>65534)

thrownewArgumentException("error:port(0~65534)");

_port=value;

}

}

///<summary>

///是否启用SSL

///</summary>

publicboolSll

{

get;

set;

}

///<summary>

///用户名

///</summary>

publicstringUser

{

get;

set;

}

///<summary>

///用户密码

///</summary>

publicstringPassword

{

get;

set;

}

}

上面是封装的SmsApi 代码,很简单,大家都能看的懂,下面贴下示例代码,然后我根据示例代码稍微解释下

SmsAPIapi=newSmsAPI("","发送账号","发送账号的密码");

{

api.SendCompleted+=newEventHandler<SendInfo>((obj,e)=>

{

Console.WriteLine("to:{0}time={1}",e.To,e.Time);

if(e.Ex!=null)//如果发送出了异常,是在事件的绑定函数里可以体现出来的,

{

Console.WriteLine("exception:{0}",e.Ex);

}

});

api.SaveConfig("sms.xml"); //xml序列化保存Smtp配置

api.Send("****@","1533651****@","测试邮件","这是一封测试邮件");

}

需要解释的有3部分,

1,对象的创建:重载了3个构造函数,分别需要传递的参数在代码中写的很明白, 大家可以看下,

在构造参数传递后进行 SmtpClient对象的初始化

2,发送邮件: 重载了2个函数,都是最简单的邮件发送,也是。net SmtpClient 最基本的操作,但是这里使用了异步操作,这样做的原因下一点说

3, 邮件发送完成的事件:这里是在SmsApi类自定义一个事件SendCompleted,当SmtpClient对象异步发送邮件后触发给上层调用的,这样我们上层调用的时候只管发送邮件,最后发 送成功还是发送异常都可以在事件绑定的方法里反映出来

以上代码经测试,完全OK, 只是189邮箱的短信提示稍有延迟! 接下来有时间,在试试其他邮箱,写的比较不自信,如有问题 希望大家多指教!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。