科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件用C#做个带精灵的邮件通知程序

用C#做个带精灵的邮件通知程序

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Visual C#是微软公司推出的下一代程序开发语言,是微软.Net框架中的的一个重要组成部分。微软的.Net平台堪称为新一代的互联网平台。

作者:王凯明 来源:soft6 2008年5月15日

关键字: 通知 邮件 C# Windows

  • 评论
  • 分享微博
  • 分享邮件
Visual C#是微软公司推出的下一代程序开发语言,是微软.Net框架中的的一个重要组成部分。微软的.Net平台堪称为新一代的互联网平台。对于技术开发人员来说,.Net平台的两大特性是非常卓越的,首先是其所提供的公共语言运行时,也就是公用语言运行平台,另一方面就是其庞大而全面的统一编程类。Visual C#就是通过调用这些类、对象来实现许多比较强大的功能。

在互联网应用中,电子邮件一直占据着重要的位置。互联网上每天都有大量的电子邮件,我们每天都要花时间去收发邮件,而有时却收不到一封邮件,有时却很多。要是我们能做一个邮件通知程序就好了。本文就向大家介绍用C#做个邮件通知程序,同时也向大家展示一下C#编程的一些特性。

一. 简介:

这个邮件通知程序是一个用来通知用户的邮件服务器中是否有新邮件的TCP/IP程序。程序还带有一个精灵来通知用户具体的新邮件数,所以用户界面比较新奇。程序每隔5分钟就自动连接到邮件服务器进行新邮件的检查。用户还可以对程序进行配置:设置时间间隔,设置邮件服务器地址以及端口号,设置用户名以及密码。此程序还是居于系统托盘的,所以是在后台运行的。

二. 工程步骤:

1. 在VS.net下新建一个C#的Windows应用程序的工程,不妨命名为“EmailNotifier”。

图1


 

[下一页]


 

2. 设计主界面和精灵界面:

先将主窗体的ShowInTaskbar属性设置为false,FormBorderStyle属性设置为FixedDialog,Text属性设置为“配置参数”。

再在主窗体上添加五个标签控件(Label Control)、五个文本框控件(TextBox Control)、两个按钮控件(Button Control)、一个系统托盘控件(NotifyIcon Control)、一个上下文菜单控件(ContextMenu Control)以及一个时钟控件(Timer Control)。

对各个控件进行属性设置:将五个标签的Text属性分别设置为“邮件服务器地址:”、“服务器端口:”、“用户名:”、“密码:”、“时间间隔(毫秒):”;将五个文本框的Name属性分别设置为:“ServerAdd”、“ServerPort”、“Username”、“Password”、“TimeSpan”;将前四个文本框的Text属性均设置为空,将最后一个的设置为300000(因为我们默认的时间间隔为5分钟);还有把第四个文本框的PasswordChar属性设置为“*”,这样输入的时候就隐藏了密码;把按钮控件的Text属性设置为“隐藏”和“检查邮件”;将系统托盘的Icon属性设置为一个图标文件;在上下文菜单下添加三个子项“配置参数”、“检查邮件”、“退出”。

这样主界面已经设计完毕,图示如下:

图2

接着设计精灵界面。

我们用到的精灵是用Microsoft Agent创建的,它是完全居于COM的,所以我们可以很方便的利用它。有关它的详细信息,可以参考微软网站上的资料,网址为:http://www.microsoft.com/msagent/downloads.htm。先从那里下载以下一些东西:

(1)Microsoft Agent核心组建

(2) Microsoft Agent的精灵:吉尼(Genie)、么林(Merlin)、罗比(Robby)和皮蒂(Peedy)

(3)至少有一个英语的Text-to-Speech引擎(现在还找不到中文的)

(4)微软运行时发音API4.0a

有了这些,我们就可以在我们的任何程序中应用了,只要在程序中添加此ActiveX控件即可。

我们先添加一个新的窗体Form2,图示如下:

图3

在新添加的窗体上我们要用到Microsoft Agent这个控件,于是就导入它到该工程中,图示如下:

图4

现在,我们的工具箱里已经有了相应的控件,我们就可以直接使用了。(在程序运行时这个控件是不可见的)

(如果读者有兴趣的话,可以到我的另一篇有关Microsoft Agent控件的文章:http://www.computerworld.com.cn/htm/app/aprog/01_12_29_2.asp看看)


 

[下一页]


 

3. 重要的代码部分:

在主窗体的代码部分,因为我们要用到网络以及网络流等类的对象,所以首先得添加以下几个重要的名字空间(Namespace):

using System.Net;

using System.Net.Sockets;

using System.IO;

using System.Text;

接着,给我们的类添加一个NetworkStream对象来控制网络中的流。

private NetworkStream netStream;

给该类的构造函数添加如下代码,设置时钟的时间间隔以及使程序一开始就不可见而只有系统托盘。

timer1.Interval=Int32.Parse(TimeSpan.Text);//设定时间间隔

this.Opacity=0;//使窗体不可见

我们用到一个重要的函数EmailCheck()。这个函数先新建一个TcpClient对象进行网络连接,用一个try-catch设法连接到用户输入的邮件服务器。如果连接成功,则用netStream对象取得网络流:netStream = tcpClient.GetStream();最后完成信息的发送和获取。函数如下:

private void EmailCheck()

{

file://新建一个TcpClient对象来建立连接

TcpClient tcpClient = new TcpClient();

try

{

tcpClient.Connect(ServerAdd.Text,Int32.Parse(ServerPort.Text));

}

catch

{

MessageBox.Show("不能连接到主机:"+ServerAdd.Text+"和端口:"+ServerPort.Text);

}

file://从邮件服务器获得相应

netStream = tcpClient.GetStream();

if(netStream == null)

{

throw new Exception("获得的网络流为空值。");

}

string returnMsg=ReadFromNetStream(ref netStream);

checkForError(returnMsg);

file://发送用户名信息

WriteToNetStream(ref netStream, "USER " + this.Username.Text);

returnMsg=ReadFromNetStream(ref netStream);

checkForError(returnMsg);

file://发送密码信息

WriteToNetStream(ref netStream, "PASS " + this.Password.Text);

returnMsg=ReadFromNetStream(ref netStream);

checkForError(returnMsg);

Stat();

netStream.Close();

tcpClient.Close();

}


 

[下一页]


 

上面的函数中用到了ReadFromNetStream()、WriteToNetStream()、Stat()、checkForError()等函数。ReadFromNetStream()是用来从网络流中读取信息的,带一个类型为ref NetworkStream的参数;WriteToNetStream()是向网络流中写入信息的,带两个类型为ref NetworkStream,string的参数;Stat()是当检查到新邮件后用来向用户报告信息的函数;checkForError()是进行查错的,带一个String类型的参数。四个函数如下:

///

/// 这个函数用来显示新邮件数信息

///

public void Stat()

{

WriteToNetStream(ref netStream, "STAT");

string returnMsg=ReadFromNetStream(ref netStream);

checkForError(returnMsg);

file://将总邮件数和邮件大小分离

string[] TotalStat= returnMsg.Split(new char[] {'' ''});

int count =Int32.Parse(TotalStat[1]);

int totalSize=Int32.Parse(TotalStat[2]);

file://调用精灵,告知用户新邮件数

Form2 agent= new Form2(count);

}

///

/// 这个函数用来向网络流写入数据

///

///

///

private void WriteToNetStream(ref NetworkStream NetStream, string Command)

{

string stringToSend = Command + "\r\n";

Byte[] arrayToSend = Encoding.ASCII.GetBytes(stringToSend.ToCharArray());

NetStream.Write(arrayToSend, 0, arrayToSend.Length);

}

///

/// 这个函数用来从网络流中读取数据

///

///

///

private String ReadFromNetStream(ref NetworkStream NetStream)

{

StringBuilder strReceived= new StringBuilder();

StreamReader sr= new StreamReader(NetStream);

String strLine = sr.ReadLine();

while(strLine==null || strLine.Length==0)

{

strLine = sr.ReadLine();

}

strReceived.Append(strLine);

if(sr.Peek()!=-1)

{

while ((strLine=sr.ReadLine())!=null)

{

strReceived.Append(strLine);

}

}

return strReceived.ToString();

}

///

/// 这个函数用来检测网络流中的错误

///

///

private void checkForError(String strMessage)

{

if (strMessage.IndexOf("+OK") == -1)

throw new Exception("ERROR - . Recieved: " + strMessage);

}

对于主窗体,我们还要添加各类事件处理函数,这样程序就可以工作了。各函数如下:

private void menuItem1_Click(object sender, System.EventArgs e)

{

this.Opacity=100;//使窗体可见

}

private void menuItem2_Click(object sender, System.EventArgs e)

{

this.EmailCheck();//检查是否有新邮件

}

private void menuItem3_Click(object sender, System.EventArgs e)

{

this.Close();//退出程序

}

private void button1_Click(object sender, System.EventArgs e)

{

this.Opacity=0;//使窗体不可见

}

private void button2_Click(object sender, System.EventArgs e)

{

this.EmailCheck();//检查是否有新邮件

}

private void timer1_Tick(object sender, System.EventArgs e)

{

this.EmailCheck();//检查是否有新邮件

}


 

[下一页]


 

在新建窗体的代码部分,主要是导入精灵并运用精灵向用户报告新邮件数等的处理问题。程序中,只要修改该类的构造函数即可:

public Form2(int EmailNumber)

{

//

// Required for Windows Form Designer support

//

InitializeComponent();

//

// TODO: Add anyconstructor code after InitializeComponent call

//

file://你可以从下面的地址下载

file://http://www.microsoft.com/msagent/downloads.htm

//

axAgent1.Characters.Load("Genie","Genie.acs");//导入精灵吉尼(Genie)

AgentObjects.IAgentCtlCharacterEx genie=axAgent1.Characters["Genie"];

file://genie的语言ID =1033,为英语

genie.Show(false);

genie.Speak("You Have "+ EmailNumber.ToString()+" emails","");

genie.Think("Should I Leave or Stay, Himmm!!!!");

genie.Hide(true);

}

注意:genie的语言ID为1033,对应于英语,现在还不支持中文。

4. 程序的运行测试:

运行程序后,配置参数界面如下:

图5

若有新邮件,精灵吉尼就会冒出来向你报告。

图6

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章