예제 #1
1
 private void CheckImapMail(ImapClient client)
 {
     const int maxtrys = 10;
     for (int i = 0; i < maxtrys; i++)
     {
         try
         {
             uint[] uids = client.Search(SearchCondition.Unseen());
             foreach (MailMessage msg in uids.Select(uid => client.GetMessage(uid)))
             {
                 Logger.Instance.LogFormat(LogType.Debug, this, "NEUE MAIL " + msg.Subject);
                 MailOperation(msg);
             }
             break;
         }
         catch (NotAuthenticatedException)
         {
             client.Login(_configuration.UserName, _configuration.Password, AuthMethod.Login);
         }
         catch (Exception ex)
         {
             Logger.Instance.LogFormat(LogType.Error, this, ex.ToString());
         }
     }
 }
예제 #2
1
        static void Main(string[] args)
        {
            try
            {
                var cmdArgs = new Args();
                CommandLine.Parser.Default.ParseArgumentsStrict(args, cmdArgs);
                string password = cmdArgs.Password;
                if (password == "*")
                {
                    Console.Write("Password: "******"Password: "******"*", Math.Max(20, password.Length))));
                    }
                }
                Console.WriteLine("Connecting to server");
                using (ImapClient cli = new ImapClient(cmdArgs.Host, cmdArgs.Port == 0 ? (cmdArgs.Ssl ? 993 : 143) : cmdArgs.Port, cmdArgs.Ssl))
                {
                    Console.WriteLine("Logging in");
                    cli.Login(cmdArgs.UserName, password, AuthMethod.Auto);
                    Console.WriteLine();

                    Dump(() => cli.ListMailboxes(), "Mailboxes");

                    //Dump(() => cli.Capabilities(), "Capabilities");

                    //Dump(cli.GetMailboxInfo("INBOX"));
                    //Dump(cli.GetMailboxInfo("Elementy wysłane"));

                    string mb = cmdArgs.DraftsFolder;
                    //Dump(cli.GetMailboxInfo(mb));

                    var ids = cli.Search(SearchCondition.All(), mb);
                    Console.WriteLine("{0} message(s)");
                    foreach (var id in ids)
                    {
                        Console.WriteLine(id);
                        var fs = cli.GetMessageFlags(id, mb);
                        Console.WriteLine("\t{0}: {1}", "Flags", string.Join(" ", fs.Select(f => f.ToString())));
                        var m = cli.GetMessage(id, FetchOptions.Normal, false, mb);
                        Console.WriteLine("\tHeaders:");
                        foreach (string h in m.Headers)
                        {
                            Console.WriteLine("\t\t{0}: {1}", h, m.Headers[h]);
                        }
                        if (m.Subject.StartsWith("[PATCH"))
                        {
                            var fileName = string.Format("{0}.patch", id);
                            Console.WriteLine("Saving message to {0}", fileName);
                            Func<string, string> adjustHeaderValue = k =>
                                {
                                    var v = m.Headers[k];
                                    if (k == "Content-Type")
                                    {
                                        if (v != null)
                                        {
                                            var i = v.IndexOf("charset=");
                                            if (0 <= i)
                                            {
                                                return v.Substring(0, i) + "charset=\"UTF-8\"";
                                            }
                                        }
                                    }
                                    else if (k == "Content-Transfer-Encoding")
                                    {
                                        return "8bit";
                                    }
                                    return v;
                                };
                            File.WriteAllBytes(
                                fileName,
                                Encoding.UTF8.GetBytes(
                                    string.Join(
                                        Environment.NewLine,
                                        m.Headers.Cast<string>().Select(k => k + ": " + adjustHeaderValue(k))
                                        .Concat(
                                            new[]
                                    {
                                        string.Empty,
                                        m.Body
                                    }))));
                        }
                        Console.WriteLine();
                    }

                    Console.WriteLine("Logging out");
                    cli.Logout();
                }
            }
            catch (Exception x)
            {
                Console.WriteLine(x);
            }
        }
예제 #3
1
        static int Main(string[] args)
        {
            try
            {
                var cmdArgs = new Args();
                CommandLine.Parser.Default.ParseArgumentsStrict(args, cmdArgs);
                string password = cmdArgs.Password;
                if (password == "*")
                {
                    Console.Write("Password: "******"Password: "******"*", Math.Max(20, password.Length))));
                    }
                }
                if (cmdArgs.Verbose)
                {
                    Console.WriteLine("Connecting to server");
                }
                using (ImapClient cli = new ImapClient(cmdArgs.Host, cmdArgs.Port == 0 ? (cmdArgs.Ssl ? 993 : 143) : cmdArgs.Port, cmdArgs.Ssl))
                {
                    if (cmdArgs.Verbose)
                    {
                        Console.WriteLine("Logging in");
                    }
                    cli.Login(cmdArgs.UserName, password, AuthMethod.Auto);
                    if (cmdArgs.Verbose)
                    {
                        Console.WriteLine();
                    }

                    string mb = cmdArgs.DraftsFolder;

                    var ids = cli.Search(SearchCondition.All(), mb);
                    foreach (var id in ids)
                    {
                        var fs = cli.GetMessageFlags(id, mb);
                        if (fs.Contains(MessageFlag.Draft))
                        {
                            continue;
                        }

                        if (cmdArgs.Verbose)
                        {
                            Console.WriteLine(id);
                            Console.WriteLine("\t{0}: {1}", "Flags", string.Join(" ", fs.Select(f => f.ToString())));
                            var m = cli.GetMessage(id, FetchOptions.HeadersOnly, false, mb);
                            Console.WriteLine("\tHeaders:");
                            foreach (string h in m.Headers)
                            {
                                Console.WriteLine("\t\t{0}: {1}", h, m.Headers[h]);
                            }
                        }

                        Console.WriteLine("Setting Draft flag on message {0}", id);
                        cli.SetMessageFlags(id, mb, MessageFlag.Draft, MessageFlag.Seen);
                        var fs2 = cli.GetMessageFlags(id, mb);
                        if (cmdArgs.Verbose)
                        {
                            Console.WriteLine("Message flags: {0}", string.Join(" ", fs2.Select(f => f.ToString())));
                            Console.WriteLine();
                        }
                    }

                    if (cmdArgs.Verbose)
                    {
                        Console.WriteLine("Logging out");
                    }
                    cli.Logout();
                }

                return 0;
            }
            catch (Exception x)
            {
                Console.WriteLine("{0}: {1}", x.GetType().FullName, x.Message);
                return 1;
            }
        }
예제 #4
1
        private void CheckImapMail()
        {
            try
            {
                using (ImapClient imapClient = new ImapClient(_configuration.ServerName, _configuration.Port, _configuration.SSL, null, _configuration.Encoding))
                {
                    imapClient.Login(_configuration.UserName, _configuration.Password, AuthMethod.Login);

                    IEnumerable<uint> uids = imapClient.Search(SearchCondition.Unseen());
                    foreach (MailMessage msg in uids.Select(uid => imapClient.GetMessage(uid)))
                    {
                        try
                        {
                            ProcessMail(msg);
                        }
                        catch (Exception ex)
                        {
                            Logger.Instance.LogException(this, ex);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                // Sometimes an error occures, e.g. if the network was disconected or a timeout occured.
                Logger.Instance.LogException(this, ex);
            }
        }
예제 #5
1
 private void CheckImapMail()
 {
     using (_imapClient = new ImapClient(_configuration.ServerName, _configuration.Port, _configuration.SSL))
     {
         _imapClient.Login(_configuration.UserName, _configuration.Password, AuthMethod.Login);
         try
         {
             uint[] uids = _imapClient.Search(SearchCondition.Unseen());
             foreach (MailMessage msg in uids.Select(uid => _imapClient.GetMessage(uid)))
             {
                 Logger.Instance.LogFormat(LogType.Debug, this, "New mail " + msg.Subject);
                 MailOperation(msg);
             }
         }
         catch (Exception ex)
         {
             Logger.Instance.LogFormat(LogType.Error, this, ex.ToString());
         }
     }
 }
예제 #6
0
파일: Imap.cs 프로젝트: smiley22/ImapNotify
        public static void Start()
        {
            bool Gmail = Properties.Settings.Default.UseGmail;
            string Host = Gmail ? Properties.Settings.Default.GmailImapServer :
                Properties.Settings.Default.ImapServer;
            int Port = Gmail ? Int32.Parse(Properties.Settings.Default.GmailServerPort) :
                Int32.Parse(Properties.Settings.Default.ServerPort);
            string Username = Properties.Settings.Default.Username;
            string Password = Encryption.DecryptString(Properties.Settings.Default.Password);
            bool SSL = Gmail ? true : Properties.Settings.Default.UseSSL;

            IC = new ImapClient(Host, Port, Username, Password, AuthMethod.Login, SSL);
            IsRunning = true;

            /* Does NOT run in the context of the "UI thread" but in its _own_ thread */
            IC.NewMessage += (sender, e) => {
                MailMessage m = null;
                int messageCount;
                lock (IC) {
                    m = IC.GetMessage(e.MessageUID, FetchOptions.TextOnly, false);
                    messageCount = IC.Search(SearchCondition.Unseen()).Length;
                };
                NewMessageEventArgs args = new NewMessageEventArgs(m, messageCount);
                NewMessageEvent(sender, args);
            };
        }
예제 #7
0
        public static void GetEmails()
        {
            string ImapServer  = "mail.ldddns.com";
            string ImapUserame = "song";
            string ImapPwd     = "20191104";

            var t = new S22.Imap.ImapClient(ImapServer, 110, ImapUserame, ImapPwd);

            using (S22.Imap.ImapClient client = new S22.Imap.ImapClient(ImapServer, 110, ImapUserame, ImapPwd))
            {
                var unseen = client.Search(SearchCondition.Unseen());

                if (unseen == null || unseen.Count() == 0)
                {
                    Console.WriteLine(string.Format("==============>没有新邮件!"));
                    return;
                }
                Console.WriteLine(string.Format("==============>开始检测"));
                foreach (uint uid in unseen)
                {
                    var    msg        = client.GetMessage(uid, true);
                    var    dataStream = msg.AlternateViews[0].ContentStream;
                    byte[] byteBuffer = new byte[dataStream.Length];
                    string altbody    = msg.BodyEncoding.GetString(byteBuffer, 0, dataStream.Read(byteBuffer, 0, byteBuffer.Length));
                    try
                    {
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }
            }
        }
예제 #8
0
        public IEnumerable <MailDto> ReceiveAsync(params string[] identifiers)
        {
            using (var client = new S22.Imap.ImapClient(this.Host, this.Port, this.EnableSsl))
            {
                client.Login(this.Email, this.Password.Decrypt(), AuthMethod.Login);

                var uids             = client.Search(SearchCondition.All());
                var identifiersAsUid = identifiers.Select(x => Convert.ToUInt32(x));

                foreach (var uid in uids.Where(x => !identifiersAsUid.Contains(x)))
                {
                    var message = client.GetMessage(uid);
                    yield return(this.CreateMail(message, uid.ToString()));
                }

                client.Logout();
            }
        }
예제 #9
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}'");
            }
        }
예제 #10
0
        private void CargarTodos()
        {
            var imap = new ImapClient(
                   config.imap, config.puerto, config.correo, config.pwd, AuthMethod.Auto, true);
              IEnumerable<uint> uids = imap.Search(
                                 SearchCondition.SentSince(DateTime.Now.AddDays(-7)), "inbox"
                               );
              foreach (uint uid in uids) {
            Application.DoEvents();
            Text = uid + "" + uids.Count();
            if (!dataGridView1.IsDisposed) {
              MailMessage m = imap.GetMessage(uid,false);
              DateTime d = Convert.ToDateTime(m.Headers.Get("Date"));
              int indice = dataGridView1.Rows.Add(m.From, m.Subject, d);
              dataGridView1.Rows[indice].Tag = m;
              dataGridView1.Sort(dataGridView1.Columns[2], System.ComponentModel.ListSortDirection.Descending);
            } else {
              break;
            }
              }

              if (imap.Supports("IDLE")) {
            imap.NewMessage += OnNewMessage;
              }
        }
        /// <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;
        }