邮件管理系统C课程设计
邮件管理系统C课程设计
using System.Reflection;
using System.Runtime.CompilerServices;
//
// 有关程序集的常规信息是通过下列
// 属性集控制的。更改这些属性值可修改与程序集
// 关联的信息。
//
[assembly: AssemblyTitle("")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("")]
[assembly: AssemblyCopyright("")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
//
// 程序集的版本信息由下列 4 个值组成:
//
// 主版本
// 次版本
// 内部版本号
// 修订号
//
// 您可以指定所有这些值,也可以使用“修订号”和“内部版本号”的默认值,方法是按
// 如下所示使用 '*':
[assembly: AssemblyVersion("1.0.*")]
//
// 要对程序集进行签名,必须指定要使用的密钥。有关程序集签名的更多信息,请参考
// Microsoft .NET Framework 文档。
//
// 使用下面的属性控制用于签名的密钥。
//
// 注意:
// (*) 如果未指定密钥,则程序集不会被签名。
// (*) KeyName 是指已经安装在计算机上的
// 加密服务提供程序(CSP)中的密钥。KeyFile 是指包含
// 密钥的文件。
// (*) 如果 KeyFile 和 KeyName 值都已指定,则
// 发生下列处理:
// (1) 如果在 CSP 中可以找到 KeyName,则使用该密钥。
// (2) 如果 KeyName 不存在而 KeyFile 存在,则
// KeyFile 中的密钥安装到 CSP 中并且使用该密钥。
// (*) 要创建 KeyFile,可以使用 sn.exe(强名称)实用工具。
// 在指定 KeyFile 时,KeyFile 的位置应该相对于
// 项目输出目录,即
// %Project Directory%\obj\<configuration>。例如,如果 KeyFile 位于
// 该项目目录,应将 AssemblyKeyFile
// 属性指定为 [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
// (*) “延迟签名”是一个高级选项 - 有关它的更多信息,请参阅 Microsoft .NET Framework
// 文档。
//
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("")]
[assembly: AssemblyKeyName("")]
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Net.Sockets;
using System.Threading;
namespace MyMail.MailServer
{
public class MailServer : System.ServiceProcess.ServiceBase
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
public MailServer()
{
// 该调用是 Windows.Forms 组件设计器所必需的。
InitializeComponent();
// TODO: 在 InitComponent 调用后添加任何初始化
}
// 进程的主入口点
static void Main()
{
System.ServiceProcess.ServiceBase[] ServicesToRun;
ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MailServer() };
System.ServiceProcess.ServiceBase.Run(ServicesToRun);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器
/// 修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
this.ServiceName = "MailServer";
}
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
TcpListener tcplsn;
TcpClient client;
Thread lsnThread;
bool IsRunning = false;
/// <summary>
/// 设置具体的操作,以便服务可以执行它的工作。
/// </summary>
protected override void OnStart(string[] args)
{
// TODO: 在此处添加代码以启动服务。
System.Net.IPHostEntry host = System.Net.Dns.Resolve(System.Net.Dns.GetHostName());
tcplsn = new TcpListener(host.AddressList[0],5220);
tcplsn.Start();
IsRunning = true;
lsnThread = new Thread(new ThreadStart(RecvCommand));
lsnThread.Start();
}
/// <summary>
/// 停止此服务。
/// </summary>
protected override void OnStop()
{
// TODO: 在此处添加代码以执行停止服务所需的关闭操作。
this.tcplsn.Stop();
this.IsRunning = false;
try
{
this.lsnThread.Abort();
}
catch{}
}
private void RecvCommand()
{
while(IsRunning)
{
// 如果有网络连接在等待则开始进行数据交换
if(this.tcplsn.Pending())
{
this.client = this.tcplsn.AcceptTcpClient();
NetworkStream ns = client.GetStream();
while(ns.CanRead && ns.DataAvailable)
{
try
{
byte[] readBytes = new byte[client.ReceiveBufferSize];
ns.Read(readBytes,0,client.ReceiveBufferSize);
string strRecv = System.Text.ASCIIEncoding.ASCII.GetString(readBytes).Trim();
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "cmd.exe";
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.WindowStyle = ProcessWindowStyle.Hidden;
if(strRecv.IndexOf("Add") >= 0) // add mail user
{
string[] strs = strRecv.Split(new char[]{' '});
string username = strs[1];
string userpass = strs[2];
psi.Arguments = string.Format("/c winpop add {0} /createuser {1}",
username,userpass);
Process pro = Process.Start(psi);
pro.WaitForExit();
// 从pop3服务器获得响应
string strRet;
string strPop = pro.StandardOutput.ReadToEnd();
if(strPop.IndexOf("successfully") < 0)
{
strRet = "Create User Fail!";
}
else
{
strRet = "Create User OK!";
}
byte[] nBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(strRet);
ns.Write(nBytes,0,nBytes.Length);
}
else if(strRecv.IndexOf("Delete") >= 0) // delete mail user
{
string[] strs = strRecv.Split(new char[]{' '});
string username = strs[1];
psi.Arguments = string.Format("/c winpop del {0} /deleteuser",
username);
Process pro = Process.Start(psi);
pro.WaitForExit();
// 从pop3服务器获得响应
string strRet;
string strPop = pro.StandardOutput.ReadToEnd();
if(strPop.IndexOf("successfully") < 0)
{
strRet = "Delete User Fail!";
}
else
{
strRet = "Delete User OK!";
}
byte[] nBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(strRet);
ns.Write(nBytes,0,nBytes.Length);
}
else if(strRecv.IndexOf("ChangePwd") >= 0) // change password
{
string[] strs = strRecv.Split(new char[]{' '});
string username = strs[1];
string userpass = strs[2];
psi.Arguments = string.Format("/c winpop changepwd {0} {1}",
username,userpass);
Process pro = Process.Start(psi);
pro.WaitForExit();
// 从pop3服务器获得响应
string strRet;
string strPop = pro.StandardOutput.ReadToEnd();
if(strPop.IndexOf("problem") < 0)
{
strRet = "ChangePwd OK!";
}
else
{
strRet = "ChangePwd Fail!";
}
byte[] nBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(strRet);
ns.Write(nBytes,0,nBytes.Length);
}
else
{
}
}
catch(Exception ex)
{
byte[] nBytes = System.Text.ASCIIEncoding.ASCII.GetBytes("System Exception!" + ex.ToString());
ns.Write(nBytes,0,nBytes.Length);843