Exemplo n.º 1
0
        private void SynchronizeMailbox(ImapClient client, string mailbox, DirectoryInfo target)
        {
            var info = client.GetMailboxInfo(mailbox);

            Log.Info($"Synchronizing mailbox {info.Name} ({mailbox}).");

            // Fetch online data
            var onlineUids = client.Search(SearchCondition.All(), mailbox).ToList();
            Log.Verbose($"Found {onlineUids.Count()} messages online.");

            // Match offline data
            foreach (var file in target.GetFiles("*.eml"))
            {
                var fileName = Path.GetFileNameWithoutExtension(file.Name);
                uint fileUid;
                if (!uint.TryParse(fileName.PadLeft(8, '0').Substring(0, 8), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out fileUid))
                {
                    Log.Warn($"Unexpected file '{file.Name}' found in mailbox {mailbox}.");
                    continue;
                }

                if (this.Options.Delete && !onlineUids.Contains(fileUid))
                {
                    Log.Verbose($"Deleting obsolete message '{file.Name}'...");
                    file.Delete();
                }

                onlineUids.Remove(fileUid);
            }

            // Fetch new files
            Log.Info($"Fetching {onlineUids.Count} messages...");
            foreach (var onlineUid in onlineUids)
            {
                var message = client.GetMessage(onlineUid, FetchOptions.Normal, false, mailbox);
                if (message.From == null)
                    message.From = new MailAddress(Options.UserName);
                var fileName = $"{onlineUid:x8} {CleanSubject(message.Subject)}.eml";
                message.Save(Path.Combine(target.FullName, fileName));
                Log.Verbose($"Fetched message '{fileName}'");
            }
        }
        /// <summary>
        /// Gets the email body.
        /// </summary>
        /// <param name="emailSubject">The email subject.</param>
        /// <param name="emailFrom">The email from.</param>
        /// <returns>Email body.</returns>
        private static HtmlDocument GetEmailBody(string emailSubject, string emailFrom)
        {
            var appSettings = ConfigurationManager.AppSettings;

            var hostname = appSettings[EmailHostname];
            var port = Convert.ToInt32(appSettings[EmailPort]);
            var username = appSettings[EmailUsername];
            var password = appSettings[EmailPassword];
            var useSsl = Convert.ToBoolean(appSettings[EmailUseSSL]);
            var defaultMailbox = appSettings[EmailDefaultMailbox];

            var client = new ImapClient(hostname, port, username, password, AuthMethod.Login, useSsl);
            client.DefaultMailbox = defaultMailbox;

            var messagesCountBefore = client.GetMailboxInfo().Messages;

            var emailBody = new HtmlDocument();

            int checkEmailTimeout = 120;
            for (int i = 0; i < checkEmailTimeout; i++)
            {
                if (client.GetMailboxInfo().Messages > messagesCountBefore)
                {
                    var uids = client.Search(SearchCondition.Subject(emailSubject)
                        .And(SearchCondition.From(emailFrom)));

                    if (uids.Count() > 0)
                    {
                        emailBody.LoadHtml(client.GetMessage(uids.First()).Body);

                        return emailBody;
                    }
                }

                Thread.Sleep(TimeSpan.FromSeconds(1));
            }

            Logger.Instance.Error("Email has been not received.");
            return emailBody;
        }