public List <eMail> GetEmails(int offset, int limit) { List <eMail> eMails = new List <eMail>(); MongoDatabase mongoDatabase = this._mongoServer.GetDatabase("email_user_" + this._id); MongoCollection <eMailEntity> mongoCollection = mongoDatabase.GetCollection <eMailEntity>("mails"); //IMongoQuery query = Query<eMailEntity>.Where(e => e.RecipientTo == this.eMail); //MongoCursor<eMailEntity> mongoCursor = mongoCollection.Find(query).SetSkip(offset).SetLimit(limit); MongoCursor <eMailEntity> mongoCursor = mongoCollection.FindAll().SetSkip(offset).SetLimit(limit); foreach (eMailEntity entity in mongoCursor) { eMail mail = new eMail(); mail.SetId(entity.Id.ToString()); mail.SetClientName(entity.ClientName); mail.SetFrom(entity.MailFrom); mail.SetMessage(entity.Message); mail.SetRecipient(entity.RecipientTo); mail.SetSubject(entity.Subject); mail.SetHeaderFrom(entity.HeaderFrom); mail.SetHeaderTo(entity.HeaderTo); mail.SetTime(entity.Time); eMails.Add(mail); } return(eMails); }
public eMail GetEMail(string id) { MongoDatabase mongoDatabase = this._mongoServer.GetDatabase("email_user_" + this._id); MongoCollection <eMailEntity> mongoCollection = mongoDatabase.GetCollection <eMailEntity>("mails"); IMongoQuery query = Query <eMailEntity> .Where(e => e.Id == new ObjectId(id)); eMailEntity entity = mongoCollection.FindOne(query); if (entity != null) { eMail mail = new eMail(); mail.SetId(entity.Id.ToString()); mail.SetClientName(entity.ClientName); mail.SetFrom(entity.MailFrom); mail.SetMessage(entity.Message); mail.SetRecipient(entity.RecipientTo); mail.SetSubject(entity.Subject); mail.SetHeaderFrom(entity.HeaderFrom); mail.SetHeaderTo(entity.HeaderTo); mail.SetTime(entity.Time); return(mail); } return(null); }
private static void CheckIfMailsHaveToBeSend() { logger.Info("check if mails have to be sent."); MongoServer mongoServer = MyMongoDB.GetServer(); MongoDatabase mongoDatabase = mongoServer.GetDatabase("email"); MongoCollection <LazyBsonDocument> mongoCollection = mongoDatabase.GetCollection <LazyBsonDocument>("users"); MongoCursor <LazyBsonDocument> mongoCursor = mongoCollection.FindAll(); foreach (LazyBsonDocument bsonDocument in mongoCursor) { if (Options.Verbose) { Console.WriteLine("checking user-id: " + bsonDocument["_id"].ToString() + "; username: "******"Username"].ToString()); } try { MongoDatabase mongoUserDatabase = mongoServer.GetDatabase("email_user_" + bsonDocument["_id"].ToString()); MongoCollection <LazyBsonDocument> mongoUserCollection = mongoUserDatabase.GetCollection <LazyBsonDocument>("mails"); MongoCursor <LazyBsonDocument> mongoUserCursor = mongoUserCollection.Find(Query.EQ("Folder", "SENT")); foreach (LazyBsonDocument bsonUserDocument in mongoUserCursor) { Console.WriteLine("found email in SENT-Folder: " + bsonUserDocument["_id"].ToString()); eMail userMail = new eMail(bsonUserDocument); userMail.Send(); break; } } catch (Exception ex) { logger.ErrorException(ex.Message, ex); } } }
private static void Check() { Console.WriteLine("running precheck..."); MongoServer mongoServer = MyMongoDB.GetServer(); MongoDatabase mongoDatabase = mongoServer.GetDatabase("email"); MongoCollection <LazyBsonDocument> mongoCollection = mongoDatabase.GetCollection <LazyBsonDocument>("mails"); MongoCursor <LazyBsonDocument> mongoCursor = mongoCollection.FindAll(); foreach (LazyBsonDocument bsonDocument in mongoCursor) { if (Options.Verbose) { Console.WriteLine("checking email-id: " + bsonDocument["_id"].ToString()); } try { if (User.EMailExists(bsonDocument["RecipientTo"].AsString)) { Console.WriteLine("user with email-address found: " + bsonDocument["RecipientTo"].AsString); User newMailUser = new User(); newMailUser.RefreshById(User.GetIdByEMail(bsonDocument["RecipientTo"].AsString)); eMail mail = new eMail(bsonDocument); mail.AssignToUser(newMailUser); } } catch (Exception ex) { logger.ErrorException(ex.Message, ex); } } Console.WriteLine("precheck finished..."); }
private string BuildHeaderFields(List <string> headerFields, eMail currentEMail) { string bodyString = String.Empty; foreach (string headerField in headerFields) { switch (headerField.ToUpper()) { case "BCC": bodyString += "Bcc: \r\n"; break; case "CC": bodyString += "Cc: \r\n"; break; case "DATE": // Wed, 17 Jul 1996 02:23:25 -0700 (PDT) if (!currentEMail.HeaderDate.Equals(DateTime.MinValue)) { bodyString += "Date: " + currentEMail.HeaderDate.ToString("ddd, dd MMM yyyy HH:mm:ss zzz (UTC)\r\n"); } else { bodyString += "Date: " + currentEMail.Time.ToString("ddd, dd MMM yyyy HH:mm:ss zzz (UTC)\r\n"); } break; case "FROM": bodyString += "From: \"" + currentEMail.HeaderFrom.Name + "\" <" + currentEMail.HeaderFrom.Address + ">\r\n"; break; case "SUBJECT": bodyString += "Subject: " + currentEMail.Subject + "\r\n"; break; case "TO": if (currentEMail.HeaderTo.Count > 0) { bodyString += "To: "; int headerToCounter = 0; foreach (eMailAddress headerTo in currentEMail.HeaderTo) { if (headerToCounter > 0) { bodyString += ", "; } bodyString += "\"" + headerTo.Name + "\" <" + headerTo.Address + ">\r\n"; headerToCounter++; } } break; } } return(bodyString); }
public void AddEMail(eMail mail) { MongoDatabase mongoDatabase = this._mongoServer.GetDatabase("email_user_" + this._id); MongoCollection <eMailEntity> mongoCollection = mongoDatabase.GetCollection <eMailEntity>("mails"); eMailAddress headerFrom = new eMailAddress(this.Username, this.eMail); mail.SetReplyTo(this.Username, this.eMail); eMailEntity mailEntity = new eMailEntity { Time = mail.Time, MailFrom = mail.MailFrom, HeaderReplyTo = mail.HeaderReplyTo, Subject = mail.Subject, RecipientTo = mail.RecipientTo, ClientName = "eMailServer.NET", Message = mail.Message, HeaderFrom = headerFrom, RawHeader = mail.RawHeader }; WriteConcernResult result = mongoCollection.Insert(mailEntity, WriteConcern.Acknowledged); logger.Info("WriteConcernResult: " + result.Ok); }
private void Mail(string rawUrl, NameValueCollection queryString) { if (!this.User.IsLoggedIn) { throw new UnauthorizedAccessException("access denied"); } XmlNode XmlRoot = this._doc.GetElementsByTagName(this._xmlRoot).Item(0); XmlElement XmlMail = this._doc.CreateElement("mail"); rawUrl = Regex.Replace(rawUrl.Replace("/mail/", ""), "\\?.*", "", RegexOptions.Compiled); switch (rawUrl) { case "get": if (queryString["id"] != null && queryString["id"] != String.Empty) { eMail mail = this.User.GetEMail(queryString["id"]); if (mail != null) { XmlMail.SetAttribute("from", mail.MailFrom); XmlMail.SetAttribute("to", mail.RecipientTo); XmlMail.SetAttribute("subject", mail.Subject); XmlElement XmlRecipients = this._doc.CreateElement("recipients"); XmlMail.AppendChild(XmlRecipients); XmlElement XmlMessage = this._doc.CreateElement("message"); XmlMessage.InnerText = mail.Message; XmlMail.AppendChild(XmlMessage); } } break; case "write": if (this.Request.HttpMethod == "POST") { using (HttpPostRequest.HttpPostRequest postRequest = new HttpPostRequest.HttpPostRequest(this.Request)) { string toEMail = String.Empty; string subject = String.Empty; string message = String.Empty; if (postRequest.Parameters["email"] != null) { toEMail = postRequest.Parameters["email"]; } if (postRequest.Parameters["subject"] != null) { subject = postRequest.Parameters["subject"]; } if (postRequest.Parameters["message"] != null) { message = postRequest.Parameters["message"]; } eMail newEMail = new eMail(); newEMail.SetFrom(this.User.eMail); newEMail.SetRecipient(toEMail); newEMail.SetSubject(subject); newEMail.SetMessage(message); XmlMail.SetAttribute("from", newEMail.MailFrom); XmlMail.SetAttribute("to", newEMail.RecipientTo); XmlMail.SetAttribute("subject", newEMail.Subject); XmlElement XmlRecipients = this._doc.CreateElement("recipients"); /* * foreach(string recipient in newEMail.Recipients) { * XmlElement XmlRecipient = this._doc.CreateElement("recipient"); * XmlRecipient.SetAttribute("email", recipient); * XmlRecipients.AppendChild(XmlRecipient); * } */ XmlMail.AppendChild(XmlRecipients); XmlElement XmlMessage = this._doc.CreateElement("message"); XmlMessage.InnerText = newEMail.Message; XmlMail.AppendChild(XmlMessage); this.User.AddEMail(newEMail); newEMail.Send(); } } break; } XmlRoot.AppendChild(XmlMail); }
public SmtpServer(TcpClient client, int sslPort) : base(client, sslPort) { bool dataStarted = false; string mailMessage = String.Empty; eMail mail = new eMail(); this.Connected += (object sender, TcpRequestEventArgs e) => { if (this.Verbose && e.RemoteEndPoint != null && e.LocalEndPoint != null) { logger.Debug("connected from remote [{0}:{1}] to local [{2}:{3}]", e.RemoteEndPoint.Address.ToString(), e.RemoteEndPoint.Port, e.LocalEndPoint.Address.ToString(), e.LocalEndPoint.Port ); } this.SendMessage("service ready", 220); }; this.Disconnected += (object sender, TcpRequestEventArgs e) => { if (this.Verbose && e.RemoteEndPoint != null && e.LocalEndPoint != null) { logger.Debug("disconnected from remote [{0}:{1}] to local [{2}:{3}]", e.RemoteEndPoint.Address.ToString(), e.RemoteEndPoint.Port, e.LocalEndPoint.Address.ToString(), e.LocalEndPoint.Port ); } }; this.LineReceived += (object sender, TcpLineReceivedEventArgs e) => { logger.Info(String.Format("[{0}:{1}] to [{2}:{3}] Received Line: \"{4}\"", this._remoteEndPoint.Address.ToString(), this._remoteEndPoint.Port, this._localEndPoint.Address.ToString(), this._localEndPoint.Port, e.Line)); switch (this._state) { case State.AuthenticateLoginUsername: this._temporaryVariables["username"] = Encoding.UTF8.GetString(Convert.FromBase64String(e.Line)).Trim(); if (this._temporaryVariables["username"] != String.Empty) { this._state = State.AuthenticateLoginPassword; if (User.NameExists(this._temporaryVariables["username"]) || User.EMailExists(this._temporaryVariables["username"])) { this.SendMessage(Convert.ToBase64String(Encoding.UTF8.GetBytes("Password:"******"5.7.8 Authentication credentials invalid", 535); } } else { this._temporaryVariables.Remove("username"); this._state = State.Default; this.SendMessage("5.7.8 Authentication credentials invalid", 535); } break; case State.AuthenticateLoginPassword: this._temporaryVariables["password"] = Encoding.UTF8.GetString(Convert.FromBase64String(e.Line)).Trim(); this._state = State.Default; if (this._temporaryVariables["password"] != String.Empty) { string username = this._temporaryVariables["username"]; string password = this._temporaryVariables["password"]; this._temporaryVariables.Remove("username"); this._temporaryVariables.Remove("password"); if (this._user.RefreshByUsernamePassword(username, password) || this._user.RefreshByEMailPassword(username, password)) { this.SendMessage("2.7.0 Authentication Succeeded", 235); } else { this.SendMessage("5.7.8 Authentication credentials invalid", 535); } } else { this.SendMessage("5.7.8 Authentication credentials invalid", 535); } break; case State.AuthenticateCramMD5: List <string> wordsCramMD5 = this.GetWordsFromBase64EncodedLine(e.Line); this._state = State.Default; if (wordsCramMD5.Count == 1) { string[] splittedWords = wordsCramMD5[0].Split(new char[] { ' ' }); if (splittedWords.Length == 2) { bool nameExists = User.NameExists(splittedWords[0]); bool eMailExists = User.EMailExists(splittedWords[0]); if (nameExists || eMailExists) { string userId = (nameExists) ? User.GetIdByName(splittedWords[0]) : User.GetIdByEMail(splittedWords[0]); User tmpUser = new User(); if (tmpUser.RefreshById(userId)) { string calculatedDigest = this.CalculateCramMD5Digest(tmpUser.Password, this._currentCramMD5Challenge); if (calculatedDigest == splittedWords[1]) { this._user = tmpUser; this.SendMessage("2.7.0 Authentication Succeeded", 235); } else { this.SendMessage("5.7.8 Authentication credentials invalid", 535); } } else { this.SendMessage("4.7.0 Temporary authentication failure", 454); } } else { this.SendMessage("5.7.8 Authentication credentials invalid", 535); } } else { this.SendMessage("5.7.8 Authentication credentials invalid", 535); } } else { this.SendMessage("5.7.8 Authentication credentials invalid", 535); } this._currentCramMD5Challenge = String.Empty; break; case State.Default: default: if (!dataStarted) { if (e.Line.StartsWith("HELO ")) { mail.SetClientName(e.Line.Substring(5)); this.SendMessage("OK", 250); } else if (e.Line.StartsWith("EHLO ")) { mail.SetClientName(e.Line.Substring(5)); this.SendMessage("Hello " + mail.ClientName + " [" + this._remoteEndPoint.Address.ToString() + "]", "250-localhost"); if (!this.SslIsActive) { string capabilities = "LOGIN"; capabilities += " PLAIN CRAM-MD5"; this.SendMessage(capabilities, "250-AUTH"); this.SendMessage("STARTTLS", 250); } else { string capabilities = "AUTH LOGIN"; capabilities += " PLAIN CRAM-MD5"; this.SendMessage(capabilities, 250); } } else if (e.Line.StartsWith("AUTH ")) { Match authMatch = Regex.Match(e.Line, @"^AUTH\s+(PLAIN|CRAM-MD5|LOGIN)(.*)?", RegexOptions.IgnoreCase); if (authMatch.Success) { switch (authMatch.Groups[1].Value.ToUpper()) { case "PLAIN": List <string> words = new List <string>(); try { words = this.GetWordsFromBase64EncodedLine(authMatch.Groups[2].Value); } catch (Exception) { } this._state = State.Default; if (words.Count == 2) { if (words[0] != String.Empty && words[1] != String.Empty) { if (this._user.RefreshByUsernamePassword(words[0], words[1]) || this._user.RefreshByEMailPassword(words[0], words[1])) { this.SendMessage("2.7.0 Authentication Succeeded", 235); } else { this.SendMessage("5.7.8 Authentication credentials invalid", 535); } } else { this.SendMessage("5.7.8 Authentication credentials invalid", 535); } } else { this.SendMessage("5.7.8 Authentication credentials invalid", 535); } break; case "LOGIN": this._state = State.AuthenticateLoginUsername; this.SendMessage(Convert.ToBase64String(Encoding.UTF8.GetBytes("Username:"******"CRAM-MD5": this._state = State.AuthenticateCramMD5; string base64EncodedCramMD5Challenge = this.CalculateOneTimeBase64Challenge("localhost.de"); this._currentCramMD5Challenge = Encoding.UTF8.GetString(Convert.FromBase64String(base64EncodedCramMD5Challenge)); this.SendMessage(base64EncodedCramMD5Challenge, 334); break; default: this.SendMessage("Unrecognized authentication type", 504); break; } } } else if (e.Line.StartsWith("MAIL FROM:")) { string email = e.Line.Substring(10); try { mail.SetFrom(email); this.SendMessage("OK", 250); } catch (FormatException) { this.SendMessage("BAD <" + email + ">... Denied due to invalid email-format", 555); } } else if (e.Line.StartsWith("RCPT TO:")) { mail.SetRecipient(e.Line.Substring(8)); this.SendMessage("OK", 250); } else if (e.Line.StartsWith("STARTTLS")) { if (e.Line.Trim() == "STARTTLS") { this.SendMessage("Ready to start TLS", 220); if (!this.StartTls()) { this.SendMessage("TLS not available due to temporary reason", 454); } } else { this.SendMessage("Syntax error (no parameters allowed)", 501); } } else if (e.Line == "DATA") { this.SendMessage("start mail input", 354); dataStarted = true; } else if (e.Line == "QUIT") { if (eMailServer.Options.Verbose) { logger.Debug("[{0}:{1}] to [{2}:{3}] quit connection", this._localEndPoint.Address.ToString(), this._localEndPoint.Port, this._remoteEndPoint.Address.ToString(), this._remoteEndPoint.Port); } this.Close(); return; } else { this.SendMessage("Syntax error, command unrecognized", 500); if (eMailServer.Options.Verbose) { logger.Debug("[{0}:{1}] to [{2}:{3}] unknown command: {2}", this._remoteEndPoint.Address.ToString(), this._remoteEndPoint.Port, this._localEndPoint.Address.ToString(), this._localEndPoint.Port, e.Line); } } } else { if (e.Line == ".") { mailMessage = mailMessage.Trim(); logger.Info("[{0}:{1}] to [{2}:{3}] eMail data received: {2}", this._remoteEndPoint.Address.ToString(), this._remoteEndPoint.Port, mailMessage, this._localEndPoint.Address.ToString(), this._localEndPoint.Port); dataStarted = false; mail.ParseData(mailMessage); if (mail.IsValid) { if (this._user.IsLoggedIn && User.EMailExists(mail.MailFrom)) { mail.SetUser(this._user); mail.SetFolder("SENT"); } else { mail.SetFolder("INBOX"); } mail.SaveToMongoDB(); } else { logger.Error("received message is invalid for saving to database."); } this.SendMessage("OK", 250); } else { mailMessage += e.Line + "\r\n"; } } break; } }; }
private string BuildHeaderFields(List<string> headerFields, eMail currentEMail) { string bodyString = String.Empty; foreach(string headerField in headerFields) { switch(headerField.ToUpper()) { case "BCC": bodyString += "Bcc: \r\n"; break; case "CC": bodyString += "Cc: \r\n"; break; case "DATE": // Wed, 17 Jul 1996 02:23:25 -0700 (PDT) if (!currentEMail.HeaderDate.Equals(DateTime.MinValue)) { bodyString += "Date: " + currentEMail.HeaderDate.ToString("ddd, dd MMM yyyy HH:mm:ss zzz (UTC)\r\n"); } else { bodyString += "Date: " + currentEMail.Time.ToString("ddd, dd MMM yyyy HH:mm:ss zzz (UTC)\r\n"); } break; case "FROM": bodyString += "From: \"" + currentEMail.HeaderFrom.Name + "\" <" + currentEMail.HeaderFrom.Address + ">\r\n"; break; case "SUBJECT": bodyString += "Subject: " + currentEMail.Subject + "\r\n"; break; case "TO": if (currentEMail.HeaderTo.Count > 0) { bodyString += "To: "; int headerToCounter = 0; foreach(eMailAddress headerTo in currentEMail.HeaderTo) { if (headerToCounter > 0) { bodyString += ", "; } bodyString += "\"" + headerTo.Name + "\" <" + headerTo.Address + ">\r\n"; headerToCounter++; } } break; } } return bodyString; }
public void AddEMail(eMail mail) { MongoDatabase mongoDatabase = this._mongoServer.GetDatabase("email_user_" + this._id); MongoCollection<eMailEntity> mongoCollection = mongoDatabase.GetCollection<eMailEntity>("mails"); eMailAddress headerFrom = new eMailAddress(this.Username, this.eMail); mail.SetReplyTo(this.Username, this.eMail); eMailEntity mailEntity = new eMailEntity { Time = mail.Time, MailFrom = mail.MailFrom, HeaderReplyTo = mail.HeaderReplyTo, Subject = mail.Subject, RecipientTo = mail.RecipientTo, ClientName = "eMailServer.NET", Message = mail.Message, HeaderFrom = headerFrom, RawHeader = mail.RawHeader }; WriteConcernResult result = mongoCollection.Insert(mailEntity, WriteConcern.Acknowledged); logger.Info("WriteConcernResult: " + result.Ok); }
public eMail GetEMail(string id) { MongoDatabase mongoDatabase = this._mongoServer.GetDatabase("email_user_" + this._id); MongoCollection<eMailEntity> mongoCollection = mongoDatabase.GetCollection<eMailEntity>("mails"); IMongoQuery query = Query<eMailEntity>.Where(e => e.Id == new ObjectId(id)); eMailEntity entity = mongoCollection.FindOne(query); if (entity != null) { eMail mail = new eMail(); mail.SetId(entity.Id.ToString()); mail.SetClientName(entity.ClientName); mail.SetFrom(entity.MailFrom); mail.SetMessage(entity.Message); mail.SetRecipient(entity.RecipientTo); mail.SetSubject(entity.Subject); mail.SetHeaderFrom(entity.HeaderFrom); mail.SetHeaderTo(entity.HeaderTo); mail.SetTime(entity.Time); return mail; } return null; }
public List<eMail> GetEmails(int offset, int limit) { List<eMail> eMails = new List<eMail>(); MongoDatabase mongoDatabase = this._mongoServer.GetDatabase("email_user_" + this._id); MongoCollection<eMailEntity> mongoCollection = mongoDatabase.GetCollection<eMailEntity>("mails"); //IMongoQuery query = Query<eMailEntity>.Where(e => e.RecipientTo == this.eMail); //MongoCursor<eMailEntity> mongoCursor = mongoCollection.Find(query).SetSkip(offset).SetLimit(limit); MongoCursor<eMailEntity> mongoCursor = mongoCollection.FindAll().SetSkip(offset).SetLimit(limit); foreach(eMailEntity entity in mongoCursor) { eMail mail = new eMail(); mail.SetId(entity.Id.ToString()); mail.SetClientName(entity.ClientName); mail.SetFrom(entity.MailFrom); mail.SetMessage(entity.Message); mail.SetRecipient(entity.RecipientTo); mail.SetSubject(entity.Subject); mail.SetHeaderFrom(entity.HeaderFrom); mail.SetHeaderTo(entity.HeaderTo); mail.SetTime(entity.Time); eMails.Add(mail); } return eMails; }
private void Mail(string rawUrl, NameValueCollection queryString) { if (!this.User.IsLoggedIn) { throw new UnauthorizedAccessException("access denied"); } XmlNode XmlRoot = this._doc.GetElementsByTagName(this._xmlRoot).Item(0); XmlElement XmlMail = this._doc.CreateElement("mail"); rawUrl = Regex.Replace(rawUrl.Replace("/mail/", ""), "\\?.*", "", RegexOptions.Compiled); switch(rawUrl) { case "get": if (queryString["id"] != null && queryString["id"] != String.Empty) { eMail mail = this.User.GetEMail(queryString["id"]); if (mail != null) { XmlMail.SetAttribute("from", mail.MailFrom); XmlMail.SetAttribute("to", mail.RecipientTo); XmlMail.SetAttribute("subject", mail.Subject); XmlElement XmlRecipients = this._doc.CreateElement("recipients"); XmlMail.AppendChild(XmlRecipients); XmlElement XmlMessage = this._doc.CreateElement("message"); XmlMessage.InnerText = mail.Message; XmlMail.AppendChild(XmlMessage); } } break; case "write": if (this.Request.HttpMethod == "POST") { using(HttpPostRequest.HttpPostRequest postRequest = new HttpPostRequest.HttpPostRequest(this.Request)) { string toEMail = String.Empty; string subject = String.Empty; string message = String.Empty; if (postRequest.Parameters["email"] != null) { toEMail = postRequest.Parameters["email"]; } if (postRequest.Parameters["subject"] != null) { subject = postRequest.Parameters["subject"]; } if (postRequest.Parameters["message"] != null) { message = postRequest.Parameters["message"]; } eMail newEMail = new eMail(); newEMail.SetFrom(this.User.eMail); newEMail.SetRecipient(toEMail); newEMail.SetSubject(subject); newEMail.SetMessage(message); XmlMail.SetAttribute("from", newEMail.MailFrom); XmlMail.SetAttribute("to", newEMail.RecipientTo); XmlMail.SetAttribute("subject", newEMail.Subject); XmlElement XmlRecipients = this._doc.CreateElement("recipients"); /* foreach(string recipient in newEMail.Recipients) { XmlElement XmlRecipient = this._doc.CreateElement("recipient"); XmlRecipient.SetAttribute("email", recipient); XmlRecipients.AppendChild(XmlRecipient); } */ XmlMail.AppendChild(XmlRecipients); XmlElement XmlMessage = this._doc.CreateElement("message"); XmlMessage.InnerText = newEMail.Message; XmlMail.AppendChild(XmlMessage); this.User.AddEMail(newEMail); newEMail.Send(); } } break; } XmlRoot.AppendChild(XmlMail); }
public SmtpServer(TcpClient client, int sslPort) : base(client, sslPort) { bool dataStarted = false; string mailMessage = String.Empty; eMail mail = new eMail(); this.Connected += (object sender, TcpRequestEventArgs e) => { if (this.Verbose && e.RemoteEndPoint != null && e.LocalEndPoint != null) { logger.Debug("connected from remote [{0}:{1}] to local [{2}:{3}]", e.RemoteEndPoint.Address.ToString(), e.RemoteEndPoint.Port, e.LocalEndPoint.Address.ToString(), e.LocalEndPoint.Port ); } this.SendMessage("service ready", 220); }; this.Disconnected += (object sender, TcpRequestEventArgs e) => { if (this.Verbose && e.RemoteEndPoint != null && e.LocalEndPoint != null) { logger.Debug("disconnected from remote [{0}:{1}] to local [{2}:{3}]", e.RemoteEndPoint.Address.ToString(), e.RemoteEndPoint.Port, e.LocalEndPoint.Address.ToString(), e.LocalEndPoint.Port ); } }; this.LineReceived += (object sender, TcpLineReceivedEventArgs e) => { logger.Info(String.Format("[{0}:{1}] to [{2}:{3}] Received Line: \"{4}\"", this._remoteEndPoint.Address.ToString(), this._remoteEndPoint.Port, this._localEndPoint.Address.ToString(), this._localEndPoint.Port, e.Line)); switch(this._state) { case State.AuthenticateLoginUsername: this._temporaryVariables["username"] = Encoding.UTF8.GetString(Convert.FromBase64String(e.Line)).Trim(); if (this._temporaryVariables["username"] != String.Empty) { this._state = State.AuthenticateLoginPassword; if (User.NameExists(this._temporaryVariables["username"]) || User.EMailExists(this._temporaryVariables["username"])) { this.SendMessage(Convert.ToBase64String(Encoding.UTF8.GetBytes("Password:"******"5.7.8 Authentication credentials invalid", 535); } } else { this._temporaryVariables.Remove("username"); this._state = State.Default; this.SendMessage("5.7.8 Authentication credentials invalid", 535); } break; case State.AuthenticateLoginPassword: this._temporaryVariables["password"] = Encoding.UTF8.GetString(Convert.FromBase64String(e.Line)).Trim(); this._state = State.Default; if (this._temporaryVariables["password"] != String.Empty) { string username = this._temporaryVariables["username"]; string password = this._temporaryVariables["password"]; this._temporaryVariables.Remove("username"); this._temporaryVariables.Remove("password"); if (this._user.RefreshByUsernamePassword(username, password) || this._user.RefreshByEMailPassword(username, password)) { this.SendMessage("2.7.0 Authentication Succeeded", 235); } else { this.SendMessage("5.7.8 Authentication credentials invalid", 535); } } else { this.SendMessage("5.7.8 Authentication credentials invalid", 535); } break; case State.AuthenticateCramMD5: List<string> wordsCramMD5 = this.GetWordsFromBase64EncodedLine(e.Line); this._state = State.Default; if (wordsCramMD5.Count == 1) { string[] splittedWords = wordsCramMD5[0].Split(new char[] {' '}); if (splittedWords.Length == 2) { bool nameExists = User.NameExists(splittedWords[0]); bool eMailExists = User.EMailExists(splittedWords[0]); if (nameExists || eMailExists) { string userId = (nameExists) ? User.GetIdByName(splittedWords[0]) : User.GetIdByEMail(splittedWords[0]); User tmpUser = new User(); if (tmpUser.RefreshById(userId)) { string calculatedDigest = this.CalculateCramMD5Digest(tmpUser.Password, this._currentCramMD5Challenge); if (calculatedDigest == splittedWords[1]) { this._user = tmpUser; this.SendMessage("2.7.0 Authentication Succeeded", 235); } else { this.SendMessage("5.7.8 Authentication credentials invalid", 535); } } else { this.SendMessage("4.7.0 Temporary authentication failure", 454); } } else { this.SendMessage("5.7.8 Authentication credentials invalid", 535); } } else { this.SendMessage("5.7.8 Authentication credentials invalid", 535); } } else { this.SendMessage("5.7.8 Authentication credentials invalid", 535); } this._currentCramMD5Challenge = String.Empty; break; case State.Default: default: if (!dataStarted) { if (e.Line.StartsWith("HELO ")) { mail.SetClientName(e.Line.Substring(5)); this.SendMessage("OK", 250); } else if (e.Line.StartsWith("EHLO ")) { mail.SetClientName(e.Line.Substring(5)); this.SendMessage("Hello " + mail.ClientName + " [" + this._remoteEndPoint.Address.ToString() + "]", "250-localhost"); if (!this.SslIsActive) { string capabilities = "LOGIN"; capabilities += " PLAIN CRAM-MD5"; this.SendMessage(capabilities, "250-AUTH"); this.SendMessage("STARTTLS", 250); } else { string capabilities = "AUTH LOGIN"; capabilities += " PLAIN CRAM-MD5"; this.SendMessage(capabilities, 250); } } else if (e.Line.StartsWith("AUTH ")) { Match authMatch = Regex.Match(e.Line, @"^AUTH\s+(PLAIN|CRAM-MD5|LOGIN)(.*)?", RegexOptions.IgnoreCase); if (authMatch.Success) { switch(authMatch.Groups[1].Value.ToUpper()) { case "PLAIN": List<string> words = new List<string>(); try { words = this.GetWordsFromBase64EncodedLine(authMatch.Groups[2].Value); } catch(Exception) { } this._state = State.Default; if (words.Count == 2) { if (words[0] != String.Empty && words[1] != String.Empty) { if (this._user.RefreshByUsernamePassword(words[0], words[1]) || this._user.RefreshByEMailPassword(words[0], words[1])) { this.SendMessage("2.7.0 Authentication Succeeded", 235); } else { this.SendMessage("5.7.8 Authentication credentials invalid", 535); } } else { this.SendMessage("5.7.8 Authentication credentials invalid", 535); } } else { this.SendMessage("5.7.8 Authentication credentials invalid", 535); } break; case "LOGIN": this._state = State.AuthenticateLoginUsername; this.SendMessage(Convert.ToBase64String(Encoding.UTF8.GetBytes("Username:"******"CRAM-MD5": this._state = State.AuthenticateCramMD5; string base64EncodedCramMD5Challenge = this.CalculateOneTimeBase64Challenge("localhost.de"); this._currentCramMD5Challenge = Encoding.UTF8.GetString(Convert.FromBase64String(base64EncodedCramMD5Challenge)); this.SendMessage(base64EncodedCramMD5Challenge, 334); break; default: this.SendMessage("Unrecognized authentication type", 504); break; } } } else if (e.Line.StartsWith("MAIL FROM:")) { string email = e.Line.Substring(10); try { mail.SetFrom(email); this.SendMessage("OK", 250); } catch(FormatException) { this.SendMessage("BAD <" + email + ">... Denied due to invalid email-format", 555); } } else if (e.Line.StartsWith("RCPT TO:")) { mail.SetRecipient(e.Line.Substring(8)); this.SendMessage("OK", 250); } else if (e.Line.StartsWith("STARTTLS")) { if (e.Line.Trim() == "STARTTLS") { this.SendMessage("Ready to start TLS", 220); if (!this.StartTls()) { this.SendMessage("TLS not available due to temporary reason", 454); } } else { this.SendMessage("Syntax error (no parameters allowed)", 501); } } else if (e.Line == "DATA") { this.SendMessage("start mail input", 354); dataStarted = true; } else if (e.Line == "QUIT") { if (eMailServer.Options.Verbose) { logger.Debug("[{0}:{1}] to [{2}:{3}] quit connection", this._localEndPoint.Address.ToString(), this._localEndPoint.Port, this._remoteEndPoint.Address.ToString(), this._remoteEndPoint.Port); } this.Close(); return; } else { this.SendMessage("Syntax error, command unrecognized", 500); if (eMailServer.Options.Verbose) { logger.Debug("[{0}:{1}] to [{2}:{3}] unknown command: {2}", this._remoteEndPoint.Address.ToString(), this._remoteEndPoint.Port, this._localEndPoint.Address.ToString(), this._localEndPoint.Port, e.Line); } } } else { if (e.Line == ".") { mailMessage = mailMessage.Trim(); logger.Info("[{0}:{1}] to [{2}:{3}] eMail data received: {2}", this._remoteEndPoint.Address.ToString(), this._remoteEndPoint.Port, mailMessage, this._localEndPoint.Address.ToString(), this._localEndPoint.Port); dataStarted = false; mail.ParseData(mailMessage); if (mail.IsValid) { if (this._user.IsLoggedIn && User.EMailExists(mail.MailFrom)) { mail.SetUser(this._user); mail.SetFolder("SENT"); } else { mail.SetFolder("INBOX"); } mail.SaveToMongoDB(); } else { logger.Error("received message is invalid for saving to database."); } this.SendMessage("OK", 250); } else { mailMessage += e.Line + "\r\n"; } } break; } }; }
private static void CheckIfMailsHaveToBeSend() { logger.Info("check if mails have to be sent."); MongoServer mongoServer = MyMongoDB.GetServer(); MongoDatabase mongoDatabase = mongoServer.GetDatabase("email"); MongoCollection<LazyBsonDocument> mongoCollection = mongoDatabase.GetCollection<LazyBsonDocument>("users"); MongoCursor<LazyBsonDocument> mongoCursor = mongoCollection.FindAll(); foreach(LazyBsonDocument bsonDocument in mongoCursor) { if (Options.Verbose) { Console.WriteLine("checking user-id: " + bsonDocument["_id"].ToString() + "; username: "******"Username"].ToString()); } try { MongoDatabase mongoUserDatabase = mongoServer.GetDatabase("email_user_" + bsonDocument["_id"].ToString()); MongoCollection<LazyBsonDocument> mongoUserCollection = mongoUserDatabase.GetCollection<LazyBsonDocument>("mails"); MongoCursor<LazyBsonDocument> mongoUserCursor = mongoUserCollection.Find(Query.EQ("Folder", "SENT")); foreach(LazyBsonDocument bsonUserDocument in mongoUserCursor) { Console.WriteLine("found email in SENT-Folder: " + bsonUserDocument["_id"].ToString()); eMail userMail = new eMail(bsonUserDocument); userMail.Send(); break; } } catch(Exception ex) { logger.ErrorException(ex.Message, ex); } } }
private static void Check() { Console.WriteLine("running precheck..."); MongoServer mongoServer = MyMongoDB.GetServer(); MongoDatabase mongoDatabase = mongoServer.GetDatabase("email"); MongoCollection<LazyBsonDocument> mongoCollection = mongoDatabase.GetCollection<LazyBsonDocument>("mails"); MongoCursor<LazyBsonDocument> mongoCursor = mongoCollection.FindAll(); foreach(LazyBsonDocument bsonDocument in mongoCursor) { if (Options.Verbose) { Console.WriteLine("checking email-id: " + bsonDocument["_id"].ToString()); } try { if (User.EMailExists(bsonDocument["RecipientTo"].AsString)) { Console.WriteLine("user with email-address found: " + bsonDocument["RecipientTo"].AsString); User newMailUser = new User(); newMailUser.RefreshById(User.GetIdByEMail(bsonDocument["RecipientTo"].AsString)); eMail mail = new eMail(bsonDocument); mail.AssignToUser(newMailUser); } } catch(Exception ex) { logger.ErrorException(ex.Message, ex); } } Console.WriteLine("precheck finished..."); }