private void OnMailReceived(Jid sender, string messageId, string subject, string message, DateTime timestamp) { Contact contact; if (_roster == null || !_roster.TryGetValue(GetContactId(sender), out contact)) { contact = ConstructUnknownContact(sender); } MailReceived?.Invoke(this, new MessageReceivedEventArgs(contact, messageId, subject, message, timestamp)); }
private void StartReceiveMail() { if (string.IsNullOrEmpty(Settings.Default.MailInput_Server)) { Logger.WriteDebug("MailService: Server not set -> stop receive"); return; } if (Settings.Default.MailInput_Port <= 0) { Logger.WriteDebug("MailService: Port not set -> stop receive"); return; } if (string.IsNullOrWhiteSpace(Settings.Default.MailInput_User)) { Logger.WriteDebug("MailService: User not set -> stop receive"); return; } if (string.IsNullOrWhiteSpace(Settings.Default.MailInput_Password)) { Logger.WriteDebug("MailService: Password not set -> stop receive"); return; } _receiveMailTaskTokenSource = new CancellationTokenSource(); _nextMailTaskRestartTime = DateTime.Now.AddMinutes(1); _receiveMailTask = Task.Factory.StartNew(() => { _receiveMailTaskTokenSource.Token.ThrowIfCancellationRequested(); Logger.WriteDebug("MailService.receiveTask: start"); try { //Check settings using (var imapClient = new Imap()) { Logger.WriteDebug(MethodBase.GetCurrentMethod(), "Connect to IMAP-Server..."); //Connect try { if (Settings.Default.MailInput_SSL) { imapClient.ConnectSSL(Settings.Default.MailInput_Server, Settings.Default.MailInput_Port); } else { imapClient.Connect(Settings.Default.MailInput_Server, Settings.Default.MailInput_Port); } imapClient.UseBestLogin(Settings.Default.MailInput_User, Encrypt.DecryptString(Settings.Default.MailInput_Password, "MailInput_Password")); Logger.WriteDebug(MethodBase.GetCurrentMethod(), "Connect -> ok"); } catch (Exception ex) { ExceptionOccured.RaiseEvent(this, new ExceptionEventArgs { Methode = MethodBase.GetCurrentMethod(), Error = ex }); _receiveMailTaskMonitorTimer?.Stop(); _receiveMailTaskTokenSource?.Cancel(); return; } //Chech IDLE command if (!imapClient.SupportedExtensions().Contains(ImapExtension.Idle)) { Logger.WriteDebug(MethodBase.GetCurrentMethod(), "Server does not support imap idle -> abort"); return; } //Select standart Inbox as folder imapClient.SelectInbox(); //Thread to recognize stop command and stop idle command Task.Factory.StartNew(() => { Logger.WriteDebug("MailService.idelTask: start"); while (!_receiveMailTaskTokenSource.Token.IsCancellationRequested) { Thread.Sleep(1000); } imapClient.StopIdle(); Logger.WriteDebug("MailService.idelTask: stop"); }, _receiveMailTaskTokenSource.Token); //Thread hangs until new mail or stop while (!_receiveMailTaskTokenSource.Token.IsCancellationRequested) { Logger.WriteDebug(MethodBase.GetCurrentMethod(), "imap idle -> start"); var currentStatus = imapClient.Idle(); Logger.WriteDebug(MethodBase.GetCurrentMethod(), "imap idle -> finished"); if (_receiveMailTaskTokenSource.Token.IsCancellationRequested) { break; } //Create expression var _searchExpression = Expression.HasFlag(Flag.Unseen); if (!string.IsNullOrWhiteSpace(Settings.Default.MailInput_Subject)) { _searchExpression = Expression.And(Expression.Subject(Settings.Default.MailInput_Subject), Expression.HasFlag(Flag.Unseen)); } //Query messages uids foreach (var uid in imapClient.Search(_searchExpression)) { Logger.WriteDebug(MethodBase.GetCurrentMethod(), $"message UID -> {uid}"); imapClient.MarkMessageSeenByUID(uid); var mailBuilder = new MailBuilder(); mailBuilder.CreatePlainTextAutomatically = true; var emlMessage = imapClient.GetMessageByUID(uid); var mail = mailBuilder.CreateFromEml(emlMessage); if (mail.Attachments.Count >= 1) { Logger.WriteDebug(MethodBase.GetCurrentMethod(), $"message attachments -> {mail.Attachments.Count}"); // save all attachments to disk var attachmentId = 1; foreach (var mime in mail.Attachments) { mime.Save(Path.Combine(Settings.Default.Fax_PathInput, $"ALARMMAIL-ATTACHMENT-{attachmentId}_{Guid.NewGuid()}{Path.GetExtension(mime.SafeFileName)}")); Logger.WriteDebug(MethodBase.GetCurrentMethod(), $"message attachment [{mime.SafeFileName}] -> saved"); attachmentId++; } } else { Logger.WriteDebug(MethodBase.GetCurrentMethod(), $"message text -> {mail.Text}"); if (string.IsNullOrWhiteSpace(mail.Text)) { Logger.WriteDebug(MethodBase.GetCurrentMethod(), "message text is empty -> abort"); continue; } //Write message to txt file File.WriteAllText( Path.Combine(Settings.Default.Fax_PathInput, $"ALARMMAIL_{Guid.NewGuid()}.txt"), mail.Text, Encoding.GetEncoding(1252)); //Raise EinsatzCreated MailReceived.RaiseEvent(this, new MailReceivedEventArgs(mail.Text)); } } } //Disconnect imapClient.Close(); } } catch (Exception ex) { ExceptionOccured.RaiseEvent(this, new ExceptionEventArgs { Methode = MethodBase.GetCurrentMethod(), Error = ex }); } Logger.WriteDebug("MailService.receiveTask: stop"); }, _receiveMailTaskTokenSource.Token); //Start task monitor if mail task is running if (_receiveMailTask != null && _receiveMailTask.Status == TaskStatus.Running) { Logger.WriteDebug("MailService.receiveMailTaskMonitorTimer: start"); _receiveMailTaskMonitorTimer = new Timer(); _receiveMailTaskMonitorTimer.Elapsed += receiveMailTaskMonitorTimer_Elapsed; _receiveMailTaskMonitorTimer.Interval = 5000; _receiveMailTaskMonitorTimer.Start(); } }