You are on page 1of 17

/* * Created by SharpDevelop.

* User: User * Date: 6/16/2012 * Time: 8:23 AM * * To change this template use Tools | Options | Coding | Edit Standard Headers. */ using using using using using using using using using using using using using using using using using using using using using System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Text; System.Windows.Forms; System.Threading; System.Collections; System.Data.SQLite; System.Net; System.Net.Sockets; System.IO; System.Net.Security; System.Security.Cryptography.X509Certificates; OpenPop.Common.Logging; OpenPop.Mime; OpenPop.Mime.Decode; OpenPop.Mime.Header; OpenPop.Pop3; Email_Tray_Tool_Config;

namespace Email_Tray_Tool { public partial class EmailTrayTool : Form { private string dbConnection = "Data Source=Config.s3db"; private string InfoText = "Email Tray Tool V.1"; private string TrayInfoText = "XXX Team Email Notification"; private string myServer; private string myPort; private string mySSL; private string myUsername; private string myPassword; private int MsgIndexNum; private int messageCount; private int emailMsgsUnread; private OpenPop.Mime.Message SelectedMsg; private frm_Config ConfigForm; private int triggerminutes; private DateTime IconSavedTime; private DateTime TimerSavedTime; public EmailTrayTool() { InitializeComponent(); } // based on tutorials in // http://www.dreamincode.net/forums/topic/116283-make-your-appl ication-minimize-to-system-tray-in-c%23/

// http://msdn.microsoft.com/en-us/library/3tt9e94f(VS.80).aspx // http://www.codeproject.com/Articles/1733/Retrieve-Mail-From-a -POP3-Server-Using-C // http://www.codeproject.com/Articles/20379/Disabling-Close-But ton-on-Forms // http://www.c-sharpcorner.com/uploadfile/rambab/outlookintegra tion10282006032802am/outlookintegration.aspx // http://aspsnippets.com/Articles/Fetch-and-Read-emails-from-PO P3-mail-server-using-C-and-VB.Net---Part-I.aspx // http://mongol-it.blogspot.com/2008/12/hiding-application-from -taskbar-in-c.html // http://social.msdn.microsoft.com/forums/en-US/winforms/thread /894d0814-dcf1-4cd6-9cca-2c6239794442/ // http://www.sqlite.org/lang.html // // Disable close button /* // POP3 Mail Ver. 1 public TcpClient Server; public NetworkStream NetStrm; public StreamReader RdStrm; public string Data; public byte[] szData; public string CRLF = "\r\n"; // Connect to POP3 private void ConnectToPop3() { string PopServer = "mail.server.com"; string UserName = "user"; string PassWord = "mypass"; // change cursor into wait cursor Cursor cr = Cursor.Current; Cursor.Current = Cursors.WaitCursor; // create server POP3 with port 110 Server = new TcpClient(PopServer, 110); myStatus.Items.Clear(); try { // initialization NetStrm = Server.GetStream(); RdStrm = new StreamReader(Server.GetStream()); myStatus.Items.Add(RdStrm.ReadLine()); // Login Process Data = "USER " + UserName + CRLF; szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray()) ; NetStrm.Write(szData, 0, szData.Length); myStatus.Items.Add(RdStrm.ReadLine()); Data = "PASS " + PassWord + CRLF; szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray()) ; NetStrm.Write(szData, 0, szData.Length); myStatus.Items.Add(RdStrm.ReadLine());

// Send STAT command to get information ie: number of mail and s ize Data = "STAT" + CRLF; szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray()) ; NetStrm.Write(szData, 0, szData.Length); myStatus.Items.Add(RdStrm.ReadLine()); // change enabled - disabled button ConnectBtn.Enabled = false; DisconnectBtn.Enabled = true; RetrieveBtn.Enabled = true; // back to normal cursor Cursor.Current = cr; } catch (InvalidOperationException err) { myStatus.Items.Add("Error: " + err.ToString()); } } private void DisconnectPop3() { // change cursor into wait cursor Cursor cr = Cursor.Current; Cursor.Current = Cursors.WaitCursor; // Send QUIT command to close session from POP server Data = "QUIT" + CRLF; szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray()); NetStrm.Write(szData, 0, szData.Length); myStatus.Items.Add(RdStrm.ReadLine()); //close connection NetStrm.Close(); RdStrm.Close(); // change enabled - disabled button ConnectBtn.Enabled = true; DisconnectBtn.Enabled = false; RetrieveBtn.Enabled = false; // back to normal cursor Cursor.Current = cr; myMessage.Clear(); } private void RetrievePop3() { string EmailNum = tbx_Num.Text; // change cursor into wait cursor Cursor cr = Cursor.Current; Cursor.Current = Cursors.WaitCursor; string szTemp; myMessage.Clear(); try { // retrieve mail with number mail parameter

Data = "RETR " + EmailNum + CRLF; szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray()) ; NetStrm.Write(szData, 0, szData.Length); szTemp = RdStrm.ReadLine(); if (szTemp[0] != '-') { while (szTemp != ".") { myMessage.Text += szTemp; szTemp = RdStrm.ReadLine(); } } else { myStatus.Items.Add(szTemp); } // back to normal cursor Cursor.Current = cr; } catch (InvalidOperationException err) { myStatus.Items.Add("Error: " + err.ToString()); } } private void ConnectBtn_Click(object sender, EventArgs e) { ConnectToPop3(); } private void DisconnectBtn_Click(object sender, EventArgs e) { DisconnectPop3(); } private void RetrieveBtn_Click(object sender, EventArgs e) { RetrievePop3(); } // end POP3 Mail V.1 */ private const int CP_NOCLOSE_BUTTON = 0x200; protected override CreateParams CreateParams { get { CreateParams myCp = base.CreateParams; myCp.ClassStyle = myCp.ClassStyle | CP_NOCLOSE_B UTTON ; return myCp;

} } // End Disable close button private void OnListBoxMouseMove ( object sender, MouseEventArgs e ) { ///string strTip = "To open, highlight email and double click, right click for other menu..."; //Get the item ///int nIdx = myMessage.IndexFromPoint(e.Location); /* * Display tip as mouse is moved over e-mail headers if ((nIdx >= 0) && (nIdx < myMessage.Items.Count)) strTip = strTip + ": " + myMessage.Items[nIdx].T oString(); */ ///tT_MsgListbox.SetToolTip(myMessage, strTip); } private void EmailTrayToolLoad(object sender, EventArgs e) { // TimerSavedTime = DateTime.Now; IconSavedTime = DateTime.Now; this.Text = InfoText; this.Width = (int)((Screen.PrimaryScreen.Bounds.Width)/2 .5); this.Height = (int)((Screen.PrimaryScreen.Bounds.Height) /4); this.WindowState = FormWindowState.Minimized; this.ShowInTaskbar = false; this.Hide(); LoadConfig(); DeleteUsedMsgFile(); Thread.Sleep(2000); // checks after 2 sec since startup CheckUnreadMsgs(); } private int MsgLimit() { int limit = 0; if (Convert.ToInt32(tST_MsgLimit.Text) <= 1) { tST_MsgLimit.Text = "1"; limit = 1; } else limit = Convert.ToInt32(tST_MsgLimit.Text); return limit; } private void LoadConfig() { tmr_CheckMsg.Stop(); try { string query = "select UserName \"User Name\", " ;

query += "Password \"Password\", "; query += "ServerName \"Server Name\", "; query += "Port \"Port\", "; query += "SSL \"SSL\" "; query += "from tbl_Settings "; query += "limit 1;"; DataTable savedConfig = GetDataTable(dbConnectio n, query); DataGrid savedConfigDataGrid = new DataGrid(); savedConfigDataGrid.DataSource = savedConfig; foreach (DataRow row in savedConfig.Rows) { myUsername = row["User Name"].ToString() ; myPassword = row["Password"].ToString(); myServer = row["Server Name"].ToString() ; myPort = row["Port"].ToString(); mySSL = row["SSL"].ToString(); } savedConfigDataGrid.Dispose(); savedConfig.Dispose(); // } catch(Exception fail) { string error = "Error in verifying database for POP3 E-mail Account:\n\n"; error += fail.Message.ToString() + "\n\n"; MessageBox.Show(error); } tmr_CheckMsg.Start(); } private DataTable GetDataTable(string dbConnection, string sql) { DataTable dt = new DataTable(); try { SQLiteConnection cnn = new SQLiteConnection(dbCo nnection); cnn.Open(); SQLiteCommand mycommand = new SQLiteCommand(cnn) ; mycommand.CommandText = sql; SQLiteDataReader reader = mycommand.ExecuteReade r(); dt.Load(reader); reader.Close(); cnn.Close(); } catch (Exception e) { throw new Exception(e.Message); } return dt; } private void MsgListbox_Resize() {

myMessage.Width = (int)(this.ClientSize.Width); myMessage.Height = (int)(this.ClientSize.Height); if (this.Height < (int)(Screen.PrimaryScreen.Bounds.Heig ht / 6)) this.Height = (int)(Screen.PrimaryScreen.Bounds. Height / 6); if (this.Width < (int)(Screen.PrimaryScreen.Bounds.Width / 4)) this.Width = (int)(Screen.PrimaryScreen.Bounds.W idth /4); } private void EmailTrayToolWindow_Resize(object sender, EventArgs e) { MsgListbox_Resize(); } private void EmailTrayTool_Resize(object sender, EventArgs e) { if (this.WindowState == FormWindowState.Minimized) { tmr_CheckMsg.Start(); this.Hide(); ShowTrayToolTip(true, 2000);; } } private void ntIcon_techteam_DoubleClick(object sender, EventArg s e) { this.Show(); this.WindowState = FormWindowState.Normal; MsgListbox_Resize(); UpdateFromEmailServer(); } private void tSM_CloseApp_Click(object sender, EventArgs e) { if (MessageBox.Show("Are you sure you want to end monito ring new e-mails?", "E-mail Tray Tool Closing Verificati on Note", MessageBoxButtons.YesNo, MessageBoxI con.Warning) == DialogResult.Yes) { tmr_CheckMsg.Stop(); tmr_CheckMsg.Dispose(); DeleteUsedMsgFile(); Application.Exit(); } } private void tSM_ConfigEmail_Click(object sender, EventArgs e) { this.Hide(); ConfigForm = new frm_Config(); ConfigForm.Visible = true; ConfigForm.ShowVerifyPWMenu();

} private void tSM_ConfigAdmin_Click(object sender, EventArgs e) { this.Hide(); ConfigForm = new frm_Config(); ConfigForm.Visible = true; ConfigForm.ShowAdminMenu(); } private void tSM_HideMenu_Click(object sender, EventArgs e) { this.WindowState = FormWindowState.Minimized; this.Hide(); tmr_CheckMsg.Start(); } private void tSM_ReadEmail_Click(object sender, EventArgs e) { this.Show(); this.WindowState = FormWindowState.Normal; MsgListbox_Resize(); UpdateFromEmailServer(); } private void tSM_EmailTimer_Click(object sender, EventArgs e) { this.Hide(); ConfigForm = new frm_Config(); ConfigForm.Visible = true; ConfigForm.ShowTimerSetting(); } private void numMsg_Click(object sender, EventArgs e) { UpdateFromEmailServer(); } private void TS_RefreshClick(object sender, EventArgs e) { UpdateFromEmailServer(); } // POP3 Mail V.2 private void UpdateFromEmailServer() { // LoadConfig(); ShowHeaders(myServer, myPort, mySSL, myUsername, myPassw ord, MsgLimit()); } private void ShowHeaders(string hostname, string port, string us eSsl, string username, string password, int limit) { tmr_CheckMsg.Stop(); myMessage.Items.Clear(); this.Text = InfoText + " - Updating from Email Server, p lease wait..."; int portnum = Convert.ToInt32(port);

bool SSL = false; if (useSsl.ToLower() == "yes") SSL = true; else SSL = false; using (Pop3Client client = new Pop3Client()) { client.Connect(hostname, portnum, SSL); client.Authenticate(username, password); messageCount = client.GetMessageCount(); int diff = (messageCount - limit) + 1; int unreadmsgs = 0; int readmsgs = 0; string emailCount = messageCount.ToString(); string MsgInfo = ""; string date = ""; string subject = ""; string sender = ""; if (diff >= 1) { for (int i = messageCount; i >= diff; i-) { MessageHeader headers = client.G etMessageHeaders(i); date = headers.DateSent.ToString (); subject = headers.Subject.ToStri ng(); sender = headers.From.ToString() ; if (MsgHeaderDB_NewMsg(date, sub ject, sender)) { unreadmsgs++; MsgInfo = "Message Unrea d => Date: " + date + " || Subject: " + subject + " || From:" + sender; } else //e-mail previously read { readmsgs++; MsgInfo = "Already Read => Date: " + date + " || Subject: " + subject + " || From:" + sender; } myMessage.Items.Add (MsgInfo); } } else { for (int i = messageCount; i >= 1 ; i--) { MessageHeader headers = client.G etMessageHeaders(i); date = headers.DateSent.ToString (); subject = headers.Subject.ToStri ng(); sender = headers.From.ToString() ;

if (MsgHeaderDB_NewMsg(date, sub ject, sender)) { unreadmsgs++; MsgInfo = "Message Unrea d => Date: " + date + " || Subject: " + subject + " || From:" + sender; } else //e-mail previously read { readmsgs++; MsgInfo = "Already Read => Date: " + date + " || Subject: " + subject + " || From:" + sender; } myMessage.Items.Add (MsgInfo); } } // myMessage.Items.Add (""); myMessage.Items.Add ("Summary: " + readmsgs.ToSt ring() + " read e-mails, " + unreadmsgs.ToString() + " u nread. " + "A total of " + (readmsgs + unreadmsgs).ToString() + " emails shown out of " + e mailCount + " total received messages (of which "+ emailMsgsUnread + " are unr ead)."); myMessage.Items.Add (""); myMessage.Items.Add ("Retrieving e-mail list fro m server may take long time to complete."); myMessage.Items.Add ("To open, highlight email a nd double click, right click for other menus."); myMessage.Items.Add ("E-mails with photos/graphi cs or attachments may take longer time to open..."); myMessage.Items.Add (""); myMessage.Items.Add ("To show the other e-mails, right-click to change setting for the number " + "of shown messages (default of 5 e-mails). "); myMessage.Items.Add ("E-mail messages shown from most recent (top most) downwards."); client.Dispose(); this.Text = InfoText; } tmr_CheckMsg.Start(); } private int MsgsUnread(string hostname, string port, string useS sl, string username, string password) { int newmsgs = 0; int portnum = Convert.ToInt32(port); bool SSL = false; if (useSsl.ToLower() == "yes") SSL = true; else SSL = false; using (Pop3Client client = new Pop3Client())

{ client.Connect(hostname, portnum, SSL); client.Authenticate(username, password); messageCount = client.GetMessageCount(); string date = ""; string subject = ""; string sender = ""; for (int i = messageCount; i > 1; i--) { MessageHeader headers = client.GetMessag eHeaders(i); date = headers.DateSent.ToString(); subject = headers.Subject.ToString().Rep lace("'","''"); // avoid single quote errors sender = headers.From.ToString(); if (MsgHeaderDB_NewMsg(date, subject, se nder)) { newmsgs++; } } // client.Dispose(); } return newmsgs; } private bool LoadedSelectedMsg(string hostname, string port, str ing useSsl, string username, string password) { tmr_CheckMsg.Stop(); bool loaded = false; int portnum = Convert.ToInt32(port); bool SSL = false; if (useSsl.ToLower() == "yes") SSL = true; else SSL = false; using (Pop3Client client = new Pop3Client()) { client.Connect(hostname, portnum, SSL); client.Authenticate(username, password); messageCount = client.GetMessageCount(); int index = messageCount - MsgIndexNum; if (index > 0 && index > (messageCount - Convert .ToInt32(tST_MsgLimit.Text))) { SelectedMsg = client.GetMessage(index); loaded = true; } else { loaded = false; } client.Dispose(); } tmr_CheckMsg.Start(); return loaded; }

private void MyMessageMouseDoubleClick(object sender, MouseEvent Args e) { if (myMessage.SelectedItem != null) { MsgIndexNum = myMessage.SelectedIndex; LoadConfig(); if (LoadedSelectedMsg(myServer, myPort, mySSL, m yUsername, myPassword)) { this.Text = InfoText + " - Opening Selec ted Message from Email Server, please wait..."; StoreAndOpenMsg(SelectedMsg); UpdateFromEmailServer(); this.Text = InfoText; } } } private bool MsgHeadrDB_Inserted() { tmr_CheckMsg.Stop(); bool inserted = false; string date = SelectedMsg.Headers.DateSent.ToString(); string subject = SelectedMsg.Headers.Subject.ToString(). Replace("'","''"); string from = SelectedMsg.Headers.From.ToString(); try { SQLiteConnection cnn = new SQLiteConnection(dbCo nnection); cnn.Open(); SQLiteCommand mycommand = new SQLiteCommand(cnn) ; string cmd = "insert into tbl_MessageHeader "; cmd += "values (null, '" + date + "', '" + subje ct + "', '" + from + "');"; mycommand.CommandText = cmd; SQLiteDataReader reader = mycommand.ExecuteReade r(); reader.Dispose(); cnn.Close(); inserted = true; } catch(Exception fail) { inserted = false; string error = "Error in saving e-mail header to database:\n\n"; error += fail.Message.ToString() + "\n\n"; MessageBox.Show(error); } tmr_CheckMsg.Start(); return inserted; } private bool MsgHeaderDB_NewMsg(string date, string subject, str ing sender) {

bool newmsg = true; string myquery = ""; string subject2 = subject.Replace("'","''"); // avoid si ngle quote errors myquery myquery myquery myquery myquery try { DataTable savedhdr = GetDataTable(dbConnection, myquery); DataGrid savedhdrDataGrid = new DataGrid(); savedhdrDataGrid.DataSource = savedhdr; foreach (DataRow row in savedhdr.Rows) { if (Convert.ToInt32(row["MsgID"].ToStrin g()) > 0) // header exists means not new newmsg = false; else newmsg = true; } savedhdrDataGrid.Dispose(); savedhdr.Dispose(); // } catch(Exception err) { string error = "Error in comparing e-mail header with database:\n\n"; error += err.Message.ToString() + "\n\n"; MessageBox.Show(error); } return newmsg; } private void SaveSelectedMsgHeader() { if (MsgHeadrDB_Inserted()) { //MessageBox.Show("Viewed e-mail headers saved.. ."); } else MessageBox.Show("Error saving headers of viewed e-mails..."); } private void ShowToolTrayTip(object sender, MouseEventArgs e) { ShowTrayToolTip(false, 500); } private void ChangeIcon() { DateTime GetTime = DateTime.Now; TimeSpan timediff = GetTime - IconSavedTime; if (timediff.Seconds > 1) // change tray icon every 2 se = "select MsgID "; += "from tbl_MessageHeader "; += "where Date = '"+ date + "' "; += "and MsgSubject = '" + subject2 + "' "; += "and Sender = '" + sender + "';";

c { ntIcon_techteam.Icon = new Icon("techteam2_msg.i co"); if (timediff.Seconds > 2) IconSavedTime = DateTime.Now; } else // 2 sec normal icon { ntIcon_techteam.Icon = new Icon("techteam2.ico") ; } } private void ShowTrayToolMsgIcon() { if (emailMsgsUnread > 0) ChangeIcon(); } private void ShowTrayToolTip(bool startup, int msec) { string unreadmsgPrompt; if (startup) { unreadmsgPrompt = "Note: Notification for new emails active..."; ntIcon_techteam.Icon = new Icon("techteam2.ico") ; } else { unreadmsgPrompt = "Note: " + emailMsgsUnread.ToS tring() + " messages unread!...Click here or the tray icon to view.."; if (emailMsgsUnread > 0) ChangeIcon(); } ntIcon_techteam.ShowBalloonTip(msec, "XXX Technical Team ", unreadmsgPrompt, ToolTipIcon.Info); } private void CheckUnreadMsgs() { // Check unread messages // Only if minimized to tray tmr_CheckMsg.Start(); if (this.WindowState == FormWindowState.Minimized) { this.Hide(); emailMsgsUnread = MsgsUnread(myServer, myPort, m ySSL, myUsername, myPassword); if (emailMsgsUnread > 0) { LoadConfig(); ShowTrayToolTip(false, 3000); ntIcon_techteam.Text = "XXX Tech. Team: "+ emailMsgsUnread + " E-mails unread, double click icon to show."; } else {

ntIcon_techteam.Text = TrayInfoText; } } else //normal window state { UpdateFromEmailServer(); } } private void DeleteMsgFile(string filepath) { try { File.Delete(filepath); } catch (IOException) { // Error in deletion } // } private void DeleteUsedMsgFile() { FileInfo file = new FileInfo("TempMsg.eml"); DeleteMsgFile(file.ToString()); // } private void StoreAndOpenMsg(OpenPop.Mime.Message message) { // Save/load message FileInfo file = new FileInfo("TempMsg.eml"); // Delete existing file first DeleteMsgFile(file.ToString()); // try { message.Save(file); System.Diagnostics.Process.Start(@"TempMsg.eml") ; SaveSelectedMsgHeader(); } catch(Exception fail) { string error = "Unable to read selected e-mail:\ n\n"; error += fail.Message.ToString() + "\n\n"; MessageBox.Show(error); } } private int TimerSettingValue() { int timer = 30; try { string query = "select Timer \"Timer\" ";

query += "from tbl_Password "; query += "where UserName = \"admin\" limit 1;"; DataTable tmr = GetDataTable(dbConnection, query ); DataGrid tmrDataGrid = new DataGrid(); tmrDataGrid.DataSource = tmr; foreach (DataRow row in tmr.Rows) { timer = Convert.ToInt32(row["Timer"].ToS tring()); } tmrDataGrid.Dispose(); tmr.Dispose(); } catch(Exception fail) { string error = "Error in getting database value of timer:\n\n"; error += fail.Message.ToString() + "\n\n"; MessageBox.Show(error); } return timer; } private int ElapsedTime() { int elapsed = 0; DateTime GetTime = DateTime.Now; TimeSpan timediff = GetTime - TimerSavedTime; elapsed = timediff.Minutes; TimerSavedTime = DateTime.Now; return elapsed; } private void timer_Count_Tick(object sender, EventArgs e) { ShowTrayToolMsgIcon(); // if (triggerminutes != TimerSettingValue()) { triggerminutes = TimerSettingValue(); } if (ElapsedTime() >= triggerminutes) { CheckUnreadMsgs(); } } // End POP3 Mail V.2 void TS_AboutClick(object sender, EventArgs e) { string msg = "E-mail Tray Tool V.1 software developed by JG Paramo "; msg += "for xxx (c) xxxx. Development and SDK tools "; msg += "include SharpDevelop (C# language), SQLite, .Net 2.0 Framework, and OpenPop.Net. "; msg += "System requirements: Windows XP or later, .Net 2 .0"; MessageBox.Show(msg, "", MessageBoxButtons.OK, MessageBo

xIcon.Information); } } }

You might also like