在互联网应用中,电子邮件一直占据着重要的位置。互联网上每天都有大量的电子邮件,我们每天都要花时间去收发邮件,而有时却收不到一封邮件,有时却很多。要是我们能做一个邮件通知程序就好了。本文就向大家介绍用C#做个邮件通知程序,同时也向大家展示一下C#编程的一些特性。
一. 简介:
这个邮件通知程序是一个用来通知用户的邮件服务器中是否有新邮件的TCP/IP程序。程序还带有一个精灵来通知用户具体的新邮件数,所以用户界面比较新奇。程序每隔5分钟就自动连接到邮件服务器进行新邮件的检查。用户还可以对程序进行配置:设置时间间隔,设置邮件服务器地址以及端口号,设置用户名以及密码。此程序还是居于系统托盘的,所以是在后台运行的。
二. 工程步骤:
1. 在VS.net下新建一个C#的Windows应用程序的工程,不妨命名为“EmailNotifier”。
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属性设置为一个图标文件;在上下文菜单下添加三个子项“配置参数”、“检查邮件”、“退出”。
这样主界面已经设计完毕,图示如下:
接着设计精灵界面。我们用到的精灵是用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,图示如下:
在新添加的窗体上我们要用到Microsoft Agent这个控件,于是就导入它到该工程中,图示如下:
现在,我们的工具箱里已经有了相应的控件,我们就可以直接使用了。(在程序运行时这个控件是不可见的)
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()
{
//新建一个TcpClient对象来建立连接
TcpClient tcpClient = new TcpClient();
try
{
tcpClient.Connect(ServerAdd.Text,Int32.Parse(ServerPort.Text));
}
catch
{
MessageBox.Show("不能连接到主机:"+ServerAdd.Text+"和端口:"+ServerPort.Text);
}
//从邮件服务器获得相应
netStream = tcpClient.GetStream();
if(netStream == null)
{
throw new Exception("获得的网络流为空值。");
}
string returnMsg=ReadFromNetStream(ref netStream);
checkForError(returnMsg);
//发送用户名信息
WriteToNetStream(ref netStream, "USER " + this.Username.Text);
returnMsg=ReadFromNetStream(ref netStream);
checkForError(returnMsg);
//发送密码信息
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);
//将总邮件数和邮件大小分离
string[] TotalStat= returnMsg.Split(new char[] {' '});
int count =Int32.Parse(TotalStat[1]);
int totalSize=Int32.Parse(TotalStat[2]);
//调用精灵,告知用户新邮件数
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 - . Received: " + 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 any constructor code after InitializeComponent call
//
//你可以从下面的地址下载
//http://www.microsoft.com/msagent/downloads.htm
//
axAgent1.Characters.Load("Genie","Genie.acs");//导入精灵吉尼(Genie)
AgentObjects.IAgentCtlCharacterEx genie=axAgent1.Characters["Genie"];
//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. 程序的运行测试:
运行程序后,配置参数界面如下:
若有新邮件,精灵吉尼就会冒出来向你报告。
相关视频
相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么
热门文章 360快剪辑怎么使用 36金山词霸如何屏幕取词百度收购PPS已敲定!3
最新文章
微信3.6.0测试版更新了微信支付漏洞会造成哪
360快剪辑怎么使用 360快剪辑软件使用方法介酷骑单车是什么 酷骑单车有什么用Apple pay与支付宝有什么区别 Apple pay与贝贝特卖是正品吗 贝贝特卖网可靠吗
人气排行 xp系统停止服务怎么办?xp系统升级win7系统方电脑闹钟怎么设置 win7电脑闹钟怎么设置office2013安装教程图解:手把手教你安装与qq影音闪退怎么办 QQ影音闪退解决方法VeryCD镜像网站逐个数,电驴资料库全集同步推是什么?同步推使用方法介绍QQ2012什么时候出 最新版下载EDiary——一款好用的电子日记本
支持( 0 ) 盖楼(回复)
查看所有0条评论>>