Source Code

namespace Mail2SMS
{
    using FreebieSMS.SendSMS;   
    using Microsoft.VisualBasic;
    using Microsoft.VisualBasic.CompilerServices;
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Configuration;
    using System.Diagnostics;
    using System.Net;
    using System.Net.Mail;
    using System.Net.Sockets;
    using System.Runtime.CompilerServices;
    using System.ServiceProcess;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Threading;
    using System.Timers;
    using System.Web.Mail;
    using System.Xml;
    using ReadyPOP3;

    [DesignerGenerated]
    public class Srvc_Mail2SMS : ServiceBase
    {
        private static ArrayList __ENCList = new ArrayList();
        [AccessedThroughProperty("EventLog1")]
        private EventLog _EventLog1;
        private IContainer components;
        private string Country;
        private System.Timers.Timer Timer1;
        private sendSms Webservices4sendingSMS;
        private string website;

        public Srvc_Mail2SMS()
        {
            ArrayList list = __ENCList;
            lock (list)
            {
                __ENCList.Add(new WeakReference(this));
            }
            this.Timer1 = new System.Timers.Timer();
            this.Webservices4sendingSMS = new sendSms();
            this.InitializeComponent();
            if (!EventLog.SourceExists("Email2SMSSource"))
            {
                EventLog.CreateEventSource("Email2SMSSource", "Email2SMSLog");
            }
            this.EventLog1.Source = "Email2SMSSource";
            this.EventLog1.Log = "Email2SMSLog";
            this.Timer1.Elapsed += new ElapsedEventHandler(this.OnElapsedTime);
            this.Timer1.Interval = 60 * Conversions.ToInteger(Conversions.ToString(1) + ConfigurationSettings.AppSettings["RecursiveOnce"]);
            this.Timer1.AutoReset = true;
            this.Timer1.Enabled = true;
        }

        protected void ConvertMail2SMS(int IterationCount)
        {
           
            if (IterationCount != 1)
            {
                string strLog = "Transaction Summary : \r\nProcess Initiated \r\n ";
                POP3Client pop = new POP3Client();
                pop.Host = ConfigurationSettings.AppSettings["POP3_Host"];
                pop.Username = ConfigurationSettings.AppSettings["POP3_UserName"];
                pop.Password = ConfigurationSettings.AppSettings["POP3_Password"];               
                try
                {
                    pop.Connect();
                    strLog +=  "Login successfull \r\n ";
                    pop.Stat();
                    ReadyPOP3.Message[] messageArray = new ReadyPOP3.Message[pop.MessageCount + 1];
                    strLog +=  Conversions.ToString(pop.MessageCount) + " messages detected \r\n ";
                    int messageCount = pop.MessageCount;
                    for (int i = 1; i <= messageCount; i++)
                    {
                        strLog +=  "Screening Message " + Conversions.ToString(i) + " \r\n ";
                        string strEmailContents = pop.Retr(i);
                        messageArray[i] = new ReadyPOP3.Message(strEmailContents,false);
                       
                        if (!String.IsNullOrEmpty(messageArray[i].SentTo) ||
                            !String.IsNullOrEmpty(messageArray[i].From))
                        {
                            string strFromName = this.GetFromName(messageArray[i].From.Trim());                           
                            strFromName = strFromName.Replace("\"", "");
                            strFromName = strFromName.Substring(0, 10); // Maximum length
                            strLog +=  "From Name " + strFromName + " \r\n ";
                            string strTrimmedRecipients = messageArray[i].SentTo.Trim().Replace(",", ";");
                            string[] strRecipients = strTrimmedRecipients.Split(new char[] { Convert.ToChar(";") });
                            foreach (string strRecipient in strRecipients)
                            {
                                string strFormattedRecipient = this.getMailFormat(strRecipient);
                                strLog +=  "To  " + strFormattedRecipient + " \r\n";
                                string strMailDomain = ConfigurationSettings.AppSettings["MailDomain2Process"];
                                string strThisMailDomain = strFormattedRecipient.Split(new char[] { Convert.ToChar("@") })[1];
                                if (strThisMailDomain.Trim().ToUpper() == strMailDomain.ToUpper())
                                {
                                    strLog +=  "To number contains  " + ConfigurationSettings.AppSettings["MailDomain2Process"] + " \r\n ";
                                    string strRecipientNumber = strFormattedRecipient.Split(new char[] { Convert.ToChar("@") })[0].Trim();
                                    string strNumberLength = Conversions.ToString(Strings.Len(strRecipientNumber));
                                    string strToNumber = strRecipientNumber;
                                    strToNumber = strToNumber.ToString().Substring(0, 4);
                                    strLog = (strLog + "Mobile length " + strNumberLength + " \r\n ") + "Prefix " + strToNumber + " \r\n ";
                                    bool blnFailedToDiscoverPrefix = false;
                                    try
                                    {
                                        this.Webservices4sendingSMS.Url = "http://www.freebiesms.co.uk/sendsms.asmx";
                                        strLog +=  "Web Service triggered " + this.ParseXML(Conversions.ToInteger(strNumberLength), strToNumber, 2) + "/sendsms.asmx\r\n";
                                    }
                                    catch (Exception exPrefixDiscovery)
                                    {
                                        ProjectData.SetProjectError(exPrefixDiscovery);                                       
                                        blnFailedToDiscoverPrefix = true;
                                        strLog += "No URL found for " + strRecipientNumber;
                                        strLog += "(Length : " + strNumberLength + ")";
                                        strLog += " Exception : " + exPrefixDiscovery.Message.ToString() + " \r\n";
                                        ProjectData.ClearProjectError();
                                    }
                                    try
                                    {
                                        if (!blnFailedToDiscoverPrefix)
                                        {
                                            string strFromNumber = ConfigurationSettings.AppSettings["DefaultFromNumber"];
                                            string strLocale = this.ParseXML(Conversions.ToInteger(strNumberLength), strToNumber, 1);
                                            if (String.IsNullOrEmpty(strLocale))
                                            {
                                                throw new Exception(strToNumber + " is not a valid number format, or an unsupported destination");
                                            }
                                                                                       
                                            this.Webservices4sendingSMS.SendSms(strFromName,
                                                                                strFromNumber,
                                                                                strRecipientNumber,
                                                                                messageArray[i].Subject,
                                                                                strLocale);
                                            strLog += "From : " + messageArray[i].From;
                                            strLog += " To :   " + strRecipientNumber;
                                            strLog += " Subject : " + messageArray[i].Subject;
                                            strLog += " Locale : " + strLocale;
                                            strLog +=  "Successfully sent message to " + strRecipientNumber + " \r\n ";
                                            pop.Delete(i);
                                            try
                                            {
                                                string strSMTPUserName = ConfigurationSettings.AppSettings["SMTP_UserName"];
                                                string strToEmailAddress = this.GetMailAddress(messageArray[i].From.Trim());

                                                this.SendMail(strSMTPUserName,
                                                              strToEmailAddress,
                                                              "Message sent",
                                                              "Successfully sent message to " + strRecipientNumber);
                                            }
                                            catch (Exception exFailedToEmailSender)
                                            {
                                                ProjectData.SetProjectError(exFailedToEmailSender);                                               
                                                strLog +=  "Error sending mail notification Exception : ";
                                                strLog += exFailedToEmailSender.Message.ToString() + " \r\n";
                                                ProjectData.ClearProjectError();
                                            }
                                        }
                                        pop.Delete(i);
                                    }
                                    catch (Exception exErrorSendingMessage)
                                    {
                                        ProjectData.SetProjectError(exErrorSendingMessage);                                       
                                        strLog +=  " Error sending Message: ";
                                        strLog +=  exErrorSendingMessage.Message.ToString() + " \r\n ";
                                        string strSMTPUserName = ConfigurationSettings.AppSettings["SMTP_UserName"];
                                        string strEmailRecipient = this.GetMailAddress(messageArray[i].From.Trim());
                                        this.SendMail(strSMTPUserName, 
                                                        strEmailRecipient,
                                                        "Message sending failed",
                                                        " Error sending Message- " + exErrorSendingMessage.Message.ToString());
                                        ProjectData.ClearProjectError();
                                        pop.Delete(i);
                                    }
                                }
                                else
                                {
                                    string strEMailDomain = ConfigurationSettings.AppSettings["MailDomain2Process"];
                                    strLog += "To number doesn't contain " + strEMailDomain + " \r\n ";
                                    pop.Delete(i);
                                }
                            }
                        }
                        else
                        {
                            // TO or FROM is empty.
                            strLog += " Invalid Email #" + i.ToString() + "\r\n";
                            pop.Delete(i);
                        }
                    }                   
                }
                catch(Exception exPopLogin)
                {
                    strLog +=  "Login Failed. Please check the server name,username,password and Incoming port. \r\n";
                    strLog += exPopLogin.ToString();
                }
                pop.Quit();
                pop.Disconnect();
                this.EventLog1.WriteEntry(strLog + "Process completed");
            }
        }

        [DebuggerNonUserCode]
        protected override void Dispose(bool disposing)
        {
            try
            {
                if (((disposing && (this.components != null)) ? 1 : 0) != 0)
                {
                    this.components.Dispose();
                }
            }
            finally
            {
                base.Dispose(disposing);
            }
        }

        public string GetFromName(string FromAddress)
        {
            if (FromAddress.Contains("<"))
            {
                return FromAddress.Substring(0, FromAddress.IndexOf("<"));
            }
            return FromAddress;
        }

        public string GetMailAddress(string FromAddress)
        {
            if (FromAddress.Contains("<"))
            {
                FromAddress = FromAddress.Replace(FromAddress.Substring(0, FromAddress.IndexOf("<")), "");
                return FromAddress.Replace(">", "").Replace("<", "");
            }
            return FromAddress;
        }

        private string getMailFormat(string str)
        {
            if (str.IndexOf(">") > 0)
            {
                return Strings.Left(str.Split(new char[] { '<' })[1], str.Split(new char[] { '<' })[1].IndexOf(">"));
            }
            return str;
        }

        [DebuggerStepThrough]
        private void InitializeComponent()
        {           
            this.EventLog1 = new EventLog();
            this.EventLog1.BeginInit();
            this.ServiceName = "Mail2SMS";
            this.EventLog1.EndInit();
        }

        [DebuggerNonUserCode, MTAThread]
        public static void Main()
        {
            ServiceBase.Run(new ServiceBase[] { new Srvc_Mail2SMS() });
        }

        private void OnElapsedTime(object sender, ElapsedEventArgs e)
        {
            this.ConvertMail2SMS(2);
        }

        protected override void OnStart(string[] args)
        {

        }

        protected override void OnStop()
        {
            this.Timer1.Enabled = false;
            this.ConvertMail2SMS(2);
        }

        private string ParseXML(int len, string tono, int Typ)
        {
            XmlDocument node = new XmlDocument();
            node.Load(ConfigurationSettings.AppSettings["SETTINGS_XML"]);
            XmlNodeReader reader = new XmlNodeReader(node);
            while (reader.Read())
            {
                switch (((int) reader.NodeType))
                {
                    case 1:
                        if ((len == Conversions.ToInteger(reader.GetAttribute("MobileLength"))) & (Conversions.ToInteger(tono) == Conversions.ToInteger(reader.GetAttribute("Prefix"))))
                        {
                            this.Country = reader.GetAttribute("Locale");
                            this.website = reader.GetAttribute("Website");
                        }
                        break;

                    case 3:
                        Console.WriteLine(reader.Value);
                        break;

                    case 8:
                        Console.WriteLine("<!--" + reader.Value + "-->");
                        break;

                    case 15:
                        Console.WriteLine("</" + reader.Name + ">");
                        break;

                    case 0x11:
                        Console.WriteLine("<?" + reader.Name + " " + reader.Value + "?>");
                        break;
                }
            }
            if (Typ == 1)
            {
                return this.Country;
            }
            return this.website;
        }

        public void SendMail(string strFrom, string strTo, string strSubject, string strMessage)
        {
            System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage();
            System.Net.Mail.MailMessage message2 = new System.Net.Mail.MailMessage(new MailAddress(strFrom.Trim()), new MailAddress(strTo));
            message2.BodyEncoding = Encoding.UTF8;
            message2.Subject = strSubject.Trim();
            message2.Body = strMessage.Trim() + "\r\n";           
            message2.IsBodyHtml = true;
            SmtpClient client = new SmtpClient(ConfigurationSettings.AppSettings["SMTP_Host"]);
            client.Credentials = ((ICredentialsByHost)new NetworkCredential(ConfigurationSettings.AppSettings["SMTP_UserName"], ConfigurationSettings.AppSettings["SMTP_Password"]));
            client.Port = (Conversions.ToInteger(ConfigurationSettings.AppSettings["SMTP_MailOutgoingPort"]));
            client.Send(message2);
        }

        internal virtual EventLog EventLog1
        {
            [DebuggerNonUserCode]
            get
            {
                return this._EventLog1;
            }
            [MethodImpl(MethodImplOptions.Synchronized), DebuggerNonUserCode]
            set
            {
                this._EventLog1 = value;
            }
        }

      
    }
}