Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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();
            }
        }