コード例 #1
0
        /// <summary>
        /// Get the list of emails for a search
        /// </summary>
        /// <param name="args">The search condition followed by the header only and set as seen booleans</param>
        /// <returns>The list of mail message that match the search</returns>
        private List <MimeMessage> GetSearchResults(params object[] args)
        {
            List <MimeMessage> messageList = new List <MimeMessage>();
            IMailFolder        folder      = this.GetCurrentFolder();

            foreach (UniqueId uid in folder.Search((SearchQuery)args[0], default(CancellationToken)))
            {
                if ((bool)args[2])
                {
                    folder.AddFlags(uid, MessageFlags.Seen, true);
                }

                MimeMessage message = null;

                if ((bool)args[1])
                {
                    HeaderList headers = folder.GetHeaders(uid);
                    message = new MimeMessage(headers);
                }
                else
                {
                    message = folder.GetMessage(uid);
                }

                messageList.Add(message);
            }

            return(messageList);
        }
コード例 #2
0
ファイル: PopHelper.cs プロジェクト: zzxulong/study
 /// <summary>
 /// 邮件添加标识(已读,已回复,已删除等等).参数值参考EmailViewM实体同名属性
 /// 调用前先调用配置方法CfgIMAP()
 /// </summary>
 /// <param name="uniqueIdls">同一文件夹下的邮件唯一标识列表</param>
 /// <param name="flag">标识代码 1=已读 2=已回复 8=删除</param>
 /// <param name="folderType">文件夹名</param>
 public void SetFlag(List <uint> uniqueIdls, int flag, string folderType = null)
 {
     try
     {
         using (ImapClient client = ConnectIMAP())
         {
             List <UniqueId> uniqueids    = uniqueIdls.Select(o => new UniqueId(o)).ToList();
             MessageFlags    messageFlags = (MessageFlags)flag;
             if (folderType == null)
             {
                 folderType = client.Inbox.Name;
             }
             IMailFolder folder = client.GetFolder(folderType);
             folder.Open(FolderAccess.ReadWrite);
             folder.AddFlags(uniqueids, messageFlags, true);
             //
             folder.Close();
             client.Disconnect(true);
         }
     }
     catch (Exception e)
     {
         ErrMsg = $"邮件添加标识时异常:{e.ToString()} [{e.Message}]";
     }
 }
コード例 #3
0
ファイル: EmailDriver.cs プロジェクト: Magenic/MAQS
        /// <summary>
        /// Get the list of emails for a search
        /// </summary>
        /// <param name="condition">The search condition</param>
        /// <param name="headersOnly">True if you only want header information</param>
        /// <param name="markRead">True if you want the emails marked as read</param>
        /// <returns>The list of mail message that match the search</returns>
        private List <MimeMessage> GetSearchResults(SearchQuery condition, bool headersOnly, bool markRead)
        {
            List <MimeMessage> messageList = new List <MimeMessage>();
            IMailFolder        folder      = this.GetCurrentFolder();

            foreach (UniqueId uid in folder.Search(condition, default))
            {
                if (markRead)
                {
                    folder.AddFlags(uid, MessageFlags.Seen, true);
                }

                MimeMessage message;

                if (headersOnly)
                {
                    HeaderList headers   = folder.GetHeaders(uid);
                    var        messageId = headers[HeaderId.MessageId];

                    message = new MimeMessage(headers)
                    {
                        MessageId = messageId
                    };
                }
                else
                {
                    message = folder.GetMessage(uid);
                }

                messageList.Add(message);
            }

            return(messageList);
        }
コード例 #4
0
        private static void MarkAllMessagesAsSeen(IMailFolder folder)
        {
            var uids = folder.Search(SearchQuery.NotSeen);

            if (uids.Any())
            {
                folder.AddFlags(uids, MessageFlags.Seen, true);
            }
        }
コード例 #5
0
        private static void DeleteOldMessages(IMailFolder folder)
        {
            var uids = (from p in folder.Search(SearchQuery.All) orderby p.Id descending select p).Skip(50).ToList();

            if (uids.Any())
            {
                folder.AddFlags(uids, MessageFlags.Deleted, true);
            }
        }
コード例 #6
0
 public static void DeleteMessages(ImapClient client, IMailFolder mailbox, IList <UniqueId> uids)
 {
     if (client.Capabilities.HasFlag(ImapCapabilities.UidPlus))
     {
         mailbox.Expunge(uids);
     }
     else
     {
         mailbox.AddFlags(uids, MessageFlags.Deleted, true);
         mailbox.Expunge();
     }
 }
コード例 #7
0
ファイル: Mail.cs プロジェクト: Bitz/OwO_Bot
        private static string CheckMail(long postId, IMailFolder inbox, UniqueIdRange range,
                                        BinarySearchQuery query)
        {
            string result = string.Empty;

            foreach (UniqueId uid in inbox.Search(range, query))
            {
                var message = inbox.GetMessage(uid);
                result = message.TextBody.Split('\r', '\n').FirstOrDefault();

                if (!string.IsNullOrEmpty(result))
                {
                    inbox.AddFlags(uid, MessageFlags.Seen, true);
                }

                if (result != null && result.ToLower().ToLower() == "cancel")
                {
                    C.WriteLine("We won't be proceeding with this post...");
                    DbBlackList dbBlackList = new DbBlackList();
                    Blacklist   item        = new Blacklist
                    {
                        Subreddit   = WorkingSub,
                        PostId      = postId,
                        CreatedDate = DateTime.Now
                    };
                    dbBlackList.AddToBlacklist(item);
                    Environment.Exit(0);
                }
                else if (result != null && result.ToLower().ToLower() == "next")
                {
                    C.WriteLine("We won't be proceeding with this post...");
                    DbBlackList dbBlackList = new DbBlackList();
                    Blacklist   item        = new Blacklist
                    {
                        Subreddit   = WorkingSub,
                        PostId      = postId,
                        CreatedDate = DateTime.Now
                    };

                    dbBlackList.AddToBlacklist(item);
                    Process.Start(Assembly.GetExecutingAssembly().Location, Args.FirstOrDefault());
                    Environment.Exit(0);
                }
                else
                {
                    C.WriteLineNoTime("We got a title!");
                }
                break;
            }

            return(result);
        }
コード例 #8
0
ファイル: Messages.cs プロジェクト: zeneksashy/MailBox
        public void MessageShown(int uid)
        {
            var mess = msg.ElementAt(msg.Count - uid);
            var i    = unSorted.IndexOf(mess);

            if (!seen.Any(m => m.MessageId == mess.MessageId))
            {
                seen.Add(mess);
                notseen.Remove(notseen.Single(foo => foo.MessageId == mess.MessageId));
                inbox.AddFlags(i, MessageFlags.Seen, true);
                inbox.Expunge();
                mailList.MarkAsRead(uid - 1);
            }
        }
コード例 #9
0
        static void fetch_incoming_messages()
        {
            using (var client = new ImapClient())
            {
                try
                {
                    bd_util.log("fetch_incoming_messages Connecting to Imap");
                    client.Connect(
                        bd_config.get(bd_config.ImapHost),
                        bd_config.get(bd_config.ImapPort),
                        true); // ssl

                    client.Authenticate(
                        bd_config.get(bd_config.ImapUser),
                        bd_config.get(bd_config.ImapPassword)
                        );

                    // The Inbox folder is always available on all IMAP servers...
                    IMailFolder inbox = client.Inbox;
                    inbox.Open(FolderAccess.ReadWrite);

                    bd_util.log("Total messages: " + inbox.Count.ToString());
                    bd_util.log("Recent messages: " + inbox.Recent.ToString());

                    for (int index = 0; index < inbox.Count; index++)
                    {
                        var  message   = inbox.GetMessage(index);
                        bool processed = process_incoming_message(message);
                        if (processed)
                        {
                            // delete it
                            if (bd_config.get(bd_config.DebugSkipDeleteOfIncomingEmails) == 0)
                            {
                                bd_util.log("Actually deleting: " + message.Subject);
                                inbox.AddFlags(index, MessageFlags.Deleted, true);
                                client.Inbox.Expunge();
                            }
                        }
                    }

                    client.Disconnect(true);
                    bd_util.log("Disconnecting from Imap");
                }
                catch (Exception exception)
                {
                    bd_util.log(exception.Message);
                    bd_util.log(exception.StackTrace);
                }
            }
        }
コード例 #10
0
 public static void SetEmailSeen(UniqueId uId, string username, string password)
 {
     if (CheckInternet() || System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
     {
         using (var client = new ImapClient())
         {
             client.Connect("imap.gmail.com", 993, true);
             client.Authenticate(username, password);
             //The Inbox folder is always available on all IMAP servers...
             IMailFolder inbox = client.Inbox;
             inbox.Open(FolderAccess.ReadWrite);
             inbox.AddFlags(uId, MessageFlags.Seen, true);
             client.Disconnect(true);
         }
     }
 }
コード例 #11
0
ファイル: MailHelper.cs プロジェクト: Fizo55/mailCleaner
        private static void DeleteMails(IMailFolder inbox, ImapClient client)
        {
            if (client == null)
            {
                throw new ArgumentNullException(nameof(client));
            }

            for (int i = 0; i < inbox.Count; i++)
            {
                inbox.AddFlags(i, MessageFlags.Deleted, true);
            }

            inbox.Expunge();
            client.Disconnect(true);
            Console.WriteLine("Your mail have been deleted");
        }
コード例 #12
0
        public void MarkAsRead(MailInfo mail)
        {
            using (ImapClient client = new ImapClient())
            {
                client.Connect(mailServer, port, ssl);
                client.AuthenticationMechanisms.Remove("XOAUTH2");
                client.Authenticate(UserData.Email, UserData.Password);

                IMailFolder folder = client.GetFolder(mail.ParentFolder.FullName);
                folder.Open(FolderAccess.ReadWrite);
                folder.AddFlags(new List <UniqueId> {
                    mail.Uid
                }, MessageFlags.Seen, true);
                folder.Close();
                client.Disconnect(true);
            }
        }
コード例 #13
0
ファイル: Provider.cs プロジェクト: Matioz/JanuszMail
        public HttpStatusCode MarkEmailAsRead(UniqueId id, string folder)
        {
            if (!IsAuthenticated())
            {
                return(HttpStatusCode.ExpectationFailed);
            }
            IMailFolder mailFolder = GetFolder(folder);

            if (mailFolder != null)
            {
                mailFolder.Open(FolderAccess.ReadWrite);
                mailFolder.AddFlags(id, MessageFlags.Seen, true);
                mailFolder.Close();
                return(HttpStatusCode.OK);
            }
            else
            {
                return(HttpStatusCode.InternalServerError);
            }
        }
コード例 #14
0
ファイル: PopHelper.cs プロジェクト: zzxulong/study
        /// <summary>
        /// 使用唯一ID获取一封完整邮件
        /// 调用前先调用配置方法CfgIMAP()
        /// </summary>
        /// <param name="folder">文件夹名,默认是收件箱</param>
        /// <param name="uniqueid">邮件唯一编号</param>
        public EmailViewM GetEmailByUniqueId(uint uniqueid, string folderName = null)
        {
            try
            {
                using (ImapClient client = ConnectIMAP())
                {
                    if (folderName == null)
                    {
                        folderName = client.Inbox.Name;
                    }
                    IMailFolder folder = client.GetFolder(folderName);
                    folder.Open(FolderAccess.ReadWrite);
                    UniqueId emailUniqueId = new UniqueId(uniqueid);

                    // 获取这些邮件的摘要信息
                    List <UniqueId> uids = new List <UniqueId>();
                    uids.Add(emailUniqueId);
                    var emaills = folder.Fetch(uids, MessageSummaryItems.UniqueId | MessageSummaryItems.Envelope);
                    var emhead  = emaills[0];

                    // 获取邮件含正文部分,.
                    MimeMessage embody = folder.GetMessage(emailUniqueId);

                    /*赋值到实体类*/
                    var entity = FillEntity(emhead, embody, folder);
                    //然后设置为已读
                    folder.AddFlags(emailUniqueId, MessageFlags.Seen, true);
                    //
                    folder.Close();
                    client.Disconnect(true);
                    //
                    return(entity);
                }
            }
            catch (Exception e)
            {
                ErrMsg = $"获取单个完整邮件异常:{e.ToString()} [{e.Message}]";
                return(null);
            }
        }
コード例 #15
0
        public override void RunCommand(object sender)
        {
            var engine = (IAutomationEngineInstance)sender;

            string vIMAPHost                = v_IMAPHost.ConvertUserVariableToString(engine);
            string vIMAPPort                = v_IMAPPort.ConvertUserVariableToString(engine);
            string vIMAPUserName            = v_IMAPUserName.ConvertUserVariableToString(engine);
            string vIMAPPassword            = ((SecureString)v_IMAPPassword.ConvertUserVariableToObject(engine, nameof(v_IMAPPassword), this)).ConvertSecureStringToString();
            string vIMAPSourceFolder        = v_IMAPSourceFolder.ConvertUserVariableToString(engine);
            string vIMAPFilter              = v_IMAPFilter.ConvertUserVariableToString(engine);
            string vIMAPMessageDirectory    = v_IMAPMessageDirectory.ConvertUserVariableToString(engine);
            string vIMAPAttachmentDirectory = v_IMAPAttachmentDirectory.ConvertUserVariableToString(engine);

            using (var client = new ImapClient())
            {
                client.ServerCertificateValidationCallback = (sndr, certificate, chain, sslPolicyErrors) => true;
                client.SslProtocols = SslProtocols.None;

                using (var cancel = new CancellationTokenSource())
                {
                    try
                    {
                        client.Connect(vIMAPHost, int.Parse(vIMAPPort), true, cancel.Token);                         //SSL
                    }
                    catch (Exception)
                    {
                        client.Connect(vIMAPHost, int.Parse(vIMAPPort));                         //TLS
                    }

                    client.AuthenticationMechanisms.Remove("XOAUTH2");
                    client.Authenticate(vIMAPUserName, vIMAPPassword, cancel.Token);

                    IMailFolder toplevel    = client.GetFolder(client.PersonalNamespaces[0]);
                    IMailFolder foundFolder = FindFolder(toplevel, vIMAPSourceFolder);

                    if (foundFolder != null)
                    {
                        foundFolder.Open(FolderAccess.ReadWrite, cancel.Token);
                    }
                    else
                    {
                        throw new Exception("Source Folder not found");
                    }

                    SearchQuery query;
                    if (vIMAPFilter.ToLower() == "none")
                    {
                        query = SearchQuery.All;
                    }
                    else if (!string.IsNullOrEmpty(vIMAPFilter.Trim()))
                    {
                        query = SearchQuery.MessageContains(vIMAPFilter)
                                .Or(SearchQuery.SubjectContains(vIMAPFilter))
                                .Or(SearchQuery.FromContains(vIMAPFilter))
                                .Or(SearchQuery.BccContains(vIMAPFilter))
                                .Or(SearchQuery.BodyContains(vIMAPFilter))
                                .Or(SearchQuery.CcContains(vIMAPFilter))
                                .Or(SearchQuery.ToContains(vIMAPFilter));
                    }
                    else
                    {
                        throw new NullReferenceException("Filter not specified");
                    }

                    if (v_IMAPGetUnreadOnly == "Yes")
                    {
                        query = query.And(SearchQuery.NotSeen);
                    }

                    var filteredItems = foundFolder.Search(query, cancel.Token);

                    List <MimeMessage> outMail = new List <MimeMessage>();

                    foreach (UniqueId uid in filteredItems)
                    {
                        if (v_IMAPMarkAsRead == "Yes")
                        {
                            foundFolder.AddFlags(uid, MessageFlags.Seen, true);
                        }

                        MimeMessage message = foundFolder.GetMessage(uid, cancel.Token);

                        if (v_IMAPSaveMessagesAndAttachments == "Yes")
                        {
                            ProcessEmail(message, vIMAPMessageDirectory, vIMAPAttachmentDirectory);
                        }

                        message.MessageId = $"{vIMAPSourceFolder}#{uid}";
                        outMail.Add(message);
                    }
                    outMail.StoreInUserVariable(engine, v_OutputUserVariableName, nameof(v_OutputUserVariableName), this);

                    client.Disconnect(true, cancel.Token);
                    client.ServerCertificateValidationCallback = null;
                }
            }
        }
コード例 #16
0
 public void Delete(int index)
 {
     folderMail.AddFlags(index, MessageFlags.Deleted, false);
     client.Disconnect(false);
 }
コード例 #17
0
        public override void RunCommand(object sender)
        {
            var         engine        = (IAutomationEngineInstance)sender;
            MimeMessage vMimeMessage  = (MimeMessage)v_IMAPMimeMessage.ConvertUserVariableToObject(engine, nameof(v_IMAPMimeMessage), this);
            string      vIMAPHost     = v_IMAPHost.ConvertUserVariableToString(engine);
            string      vIMAPPort     = v_IMAPPort.ConvertUserVariableToString(engine);
            string      vIMAPUserName = v_IMAPUserName.ConvertUserVariableToString(engine);
            string      vIMAPPassword = ((SecureString)v_IMAPPassword.ConvertUserVariableToObject(engine, nameof(v_IMAPPassword), this)).ConvertSecureStringToString();

            using (var client = new ImapClient())
            {
                client.ServerCertificateValidationCallback = (sndr, certificate, chain, sslPolicyErrors) => true;
                client.SslProtocols = SslProtocols.None;

                using (var cancel = new CancellationTokenSource())
                {
                    try
                    {
                        client.Connect(vIMAPHost, int.Parse(vIMAPPort), true, cancel.Token);                         //SSL
                    }
                    catch (Exception)
                    {
                        client.Connect(vIMAPHost, int.Parse(vIMAPPort));                         //TLS
                    }

                    client.AuthenticationMechanisms.Remove("XOAUTH2");
                    client.Authenticate(vIMAPUserName, vIMAPPassword, cancel.Token);

                    var      splitId   = vMimeMessage.MessageId.Split('#').ToList();
                    UniqueId messageId = UniqueId.Parse(splitId.Last());
                    splitId.RemoveAt(splitId.Count - 1);
                    string messageFolder = string.Join("", splitId);

                    IMailFolder toplevel          = client.GetFolder(client.PersonalNamespaces[0]);
                    IMailFolder foundSourceFolder = GetIMAPEmailsCommand.FindFolder(toplevel, messageFolder);

                    if (foundSourceFolder != null)
                    {
                        foundSourceFolder.Open(FolderAccess.ReadWrite, cancel.Token);
                    }
                    else
                    {
                        throw new Exception("Source Folder not found");
                    }

                    var messageSummary = foundSourceFolder.Fetch(new[] { messageId }, MessageSummaryItems.Flags);

                    if (v_IMAPDeleteReadOnly == "Yes")
                    {
                        if (messageSummary[0].Flags.Value.HasFlag(MessageFlags.Seen))
                        {
                            foundSourceFolder.AddFlags(messageId, MessageFlags.Deleted, true, cancel.Token);
                        }
                    }
                    else
                    {
                        foundSourceFolder.AddFlags(messageId, MessageFlags.Deleted, true, cancel.Token);
                    }

                    client.Disconnect(true, cancel.Token);
                    client.ServerCertificateValidationCallback = null;
                }
            }
        }
コード例 #18
0
        protected override void Execute(NativeActivityContext context)
        {
            string username   = Email.Get(context);             //发送端账号
            string password   = Password.Get(context);          //发送端密码(这个客户端重置后的密码)
            string server     = Server.Get(context);            //邮件服务器
            Int32  port       = Port.Get(context);              //端口号
            Int32  counts     = Counts.Get(context);            //检索邮件数
            string mainFolder = MainFolder.Get(context);        //邮件文件夹

            string mailTopicKey    = MailTopicKey.Get(context);
            string mailSenderKey   = MailSenderKey.Get(context);
            string mailTextBodyKey = MailTextBodyKey.Get(context);

            List <object>      configList = new List <object>();
            List <MimeMessage> emails     = new List <MimeMessage>();
            ImapClient         client     = new ImapClient();
            SearchQuery        query;
            IList <UniqueId>   uidss;

            try
            {
                client.CheckCertificateRevocation          = false;
                client.ServerCertificateValidationCallback = (s, c, h, e) => true;
                client.Connect(server, port, SecureConnection);
                client.Authenticate(username, password);

                if (OnlyUnreadMessages || _AllUnreadMessages)
                {
                    query = SearchQuery.NotSeen;
                }
                else
                {
                    query = SearchQuery.All;
                }

                List <IMailFolder> mailFolderList = client.GetFolders(client.PersonalNamespaces[0]).ToList();
                IMailFolder        folder         = client.GetFolder(mainFolder);
                folder.Open(FolderAccess.ReadWrite);
                emails = new List <MimeMessage>();
                if (_AllUnreadMessages)
                {
                    query = SearchQuery.NotSeen;
                    uidss = folder.Search(query);
                    for (int i = uidss.Count - 1; i >= 0; i--)
                    {
                        MimeMessage message = folder.GetMessage(new UniqueId(uidss[i].Id));
                        emails.Add(message);
                        if (MarkAsRead)
                        {
                            folder.AddFlags(new UniqueId(uidss[i].Id), MessageFlags.Seen, true);//如果设置为true,则不会发出MessageFlagsChanged事件
                        }
                        if (DeleteMessages)
                        {
                            folder.AddFlags(new UniqueId(uidss[i].Id), MessageFlags.Deleted, true);//如果设置为true,则不会发出MessageFlagsChanged事件
                        }
                    }
                }
                else
                {
                    uidss = folder.Search(query);
                    for (int i = uidss.Count - 1, j = 0; i >= 0 && j < counts; i--, j++)
                    {
                        MimeMessage message = folder.GetMessage(new UniqueId(uidss[i].Id));

                        InternetAddressList Sender = message.From;
                        string SenderStr           = Sender.Mailboxes.First().Address;
                        string Topic = message.Subject;
                        if (mailTopicKey != null && mailTopicKey != "")
                        {
                            if (Topic == null || Topic == "")
                            {
                                j--;
                                continue;
                            }
                            if (!Topic.Contains(mailTopicKey))
                            {
                                j--;
                                continue;
                            }
                        }
                        if (mailSenderKey != null && mailSenderKey != "")
                        {
                            if (SenderStr == null || SenderStr == "")
                            {
                                j--;
                                continue;
                            }
                            if (!SenderStr.Contains(mailSenderKey))
                            {
                                j--;
                                continue;
                            }
                        }
                        if (mailTextBodyKey != null && mailTextBodyKey != "")
                        {
                            if (message.TextBody == null || message.TextBody == "")
                            {
                                j--;
                                continue;
                            }
                            if (!message.TextBody.Contains(mailTextBodyKey))
                            {
                                j--;
                                continue;
                            }
                        }

                        emails.Add(message);
                        if (MarkAsRead)
                        {
                            folder.AddFlags(new UniqueId(uidss[i].Id), MessageFlags.Seen, true);//如果设置为true,则不会发出MessageFlagsChanged事件
                        }
                        if (DeleteMessages)
                        {
                            folder.AddFlags(new UniqueId(uidss[i].Id), MessageFlags.Deleted, true);//如果设置为true,则不会发出MessageFlagsChanged事件
                        }
                    }
                }

                //获取搜索结果的摘要信息(我们需要UID和BODYSTRUCTURE每条消息,以便我们可以提取文本正文和附件)(获取全部邮件)
                //var items = folder.Fetch(uidss, MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure);
                MailMsgList.Set(context, emails);
                client.Disconnect(true);

                configList.Add(server);
                configList.Add(port);
                configList.Add(SecureConnection);
                configList.Add(username);
                configList.Add(password);
                configList.Add(mainFolder);
            }
            catch (Exception e)
            {
                client.Disconnect(true);
                SharedObject.Instance.Output(SharedObject.enOutputType.Error, "获取IMAP邮件失败", e.Message);
            }
            if (Body != null)
            {
                object[] buff = configList.ToArray();
                context.ScheduleAction(Body, emails, client, buff);
            }
        }
コード例 #19
0
ファイル: Program.cs プロジェクト: LucasAndradeSilva/MapEmail
 public static void DeleteEmails(ImapClient client, IList <UniqueId> emails, IMailFolder folder)
 {
     folder.AddFlags(emails, MessageFlags.Deleted, false);
     folder.Expunge();
 }
コード例 #20
0
        private void ProcessRules(IMailFolder inbox) {
            inbox.Open(FolderAccess.ReadWrite);
            inbox.Status(StatusItems.Unread);

            if (inbox.Unread > 0) {
                var unreadMessageUids = inbox.Search(SearchQuery.NotSeen);
                var toMove = new Dictionary<string, List<UniqueId>>();
                var markAsRead = new List<UniqueId>();

                // process unread messages
                foreach (var unreadMessageUid in unreadMessageUids) {
                    var message = inbox.GetMessage(unreadMessageUid);

                    var matchingRule = GetMatchingRule(message);
                    if (matchingRule != null) {
                        if (!toMove.ContainsKey(matchingRule.Destination)) {
                            toMove.Add(matchingRule.Destination, new List<UniqueId>());
                        }

                        toMove[matchingRule.Destination].Add(unreadMessageUid);

                        if (matchingRule.MarkAsRead) {
                            markAsRead.Add(unreadMessageUid);
                        }
                    }
                }

                // mark as read
                if (markAsRead.Any()) {
                    inbox.AddFlags(markAsRead, MessageFlags.Seen, true);
                }

                // move to destination
                if (toMove.Any()) {
                    foreach (var destination in toMove.Keys) {
                        inbox.MoveTo(toMove[destination], inbox.GetSubfolder(destination));
                    }
                }
            }
        }
コード例 #21
0
        /// <summary>
        /// Данная функция является точкой входа.
        /// <summary>
        public void Execute(Context context)
        {
            if (context.MessageContextStrings == null)
            {
                context.MessageContextStrings = new List <string>();
            }
            Directory.CreateDirectory(context.WorkDirectory);
            List <MessageContext> messageContexts = new List <MessageContext>();

            /*
             * Это лишь один из возможных вариантов. В текущем примере мы сохраняем
             * контекст писем как строку в формате JSON. Таким образом мы можем
             * связать несколько элементов в одном элементе.
             * Например, тело текста сообщения и если есть вложения, то и их тоже,
             * при этом это не разные списки и можно в другом месте соотнести
             * тело сообщения и вложения одного письма.
             */

            using (ImapClient client = new ImapClient())
            {
                // В данном примере предполагается, что все данные для подключения
                // и аудентификации есть в контексте робота.
                client.Connect(context.Host, (int)context.Port.Value, context.UseSsl.Value);
                client.Authenticate(context.UserName, context.Password);

                // Бучем читать из стандартной папки "Входящие", "Inbox" и т.п.
                IMailFolder inbox = client.Inbox;
                // Нужны права и на запись для помечания прочитанных
                inbox.Open(FolderAccess.ReadWrite);

                // Важный для нас этап - настройка запроса (фильтрация)
                // 1. Нам нужны те, которые мы еще не прочитали и которые не удалены
                var query = SearchQuery.NotSeen.And(SearchQuery.NotDeleted);
                // 2. Далее нам нужно добавить поиск по тексту темы.
                if (!string.IsNullOrEmpty(context.SubjectText))
                {
                    query = query.And(SearchQuery.SubjectContains(context.SubjectText));
                }
                // 2. Далее нам нужно добавить поиск по тексту отправителя (например, email).
                if (!string.IsNullOrEmpty(context.SenderText))
                {
                    query = query.And(SearchQuery.HeaderContains("FROM", context.SenderText));
                }

                // Далее выполняем запрос и получаем уникальные идентификаторы писем,
                // которые должны соответветствовать запросу.
                IList <UniqueId> uids = client.Inbox.Search(query);

                // Проходимся по письмам и получаем текст с вложениями
                foreach (UniqueId uid in uids)
                {
                    string subDirectory = Path.Combine(context.WorkDirectory, uid.Id.ToString());
                    Directory.CreateDirectory(subDirectory);
                    MimeMessage    message        = client.Inbox.GetMessage(uid);
                    MessageContext messageContext = new MessageContext();
                    // Обращаем внимание, что тут можно указывать формат
                    messageContext.TextBody = message.GetTextBody(MimeKit.Text.TextFormat.Text);

                    foreach (MimeEntity attachment in message.Attachments)
                    {
                        var fileName = attachment.ContentDisposition?.FileName ?? attachment.ContentType.Name;
                        fileName = Path.Combine(subDirectory, fileName);

                        using (var stream = File.Create(fileName))
                        {
                            if (attachment is MessagePart)
                            {
                                var mssagePart = (MessagePart)attachment;

                                mssagePart.Message.WriteTo(stream);
                            }
                            else
                            {
                                var part = (MimePart)attachment;

                                part.Content.DecodeTo(stream);
                            }
                        }

                        messageContext.AttachmentPaths.Add(fileName);
                    }

                    // Добавляем контекст в формате JSON строки.
                    context.MessageContextStrings.Add(messageContext.GetContextJSON());
                }

                // Помечаем как прочитанные. Не забываем,
                // что может понадобиться права на запись в папке
                inbox.AddFlags(uids, MessageFlags.Seen, true);
            }
        }
コード例 #22
0
        /// <summary>
        /// Данная функция является точкой входа.
        /// <summary>
        public void Execute(Context context)
        {
            if (context.MessageTexts == null)
            {
                context.MessageTexts = new List <string>();
            }
            if (context.Attachments == null)
            {
                context.Attachments = new List <FileInfo>();
            }
            Directory.CreateDirectory(context.WorkDirectory);

            /*
             * Это лишь один из возможных вариантов. В текущем примере мы просто
             * получаем списки текстов и вложений. Но они по сути никак не связаны.
             * Пока мы не можем использовать в контексте нестандартные типы в списке
             * и не можем хранить в одном элементе структуру, подсписки разного типа и т.д.
             * Но как вариант можно генерировать строку для одного письма, где будет
             * содержаться текст письма и пути к сохраненным файлам вложений и потом
             * в других местах парсить это.
             * Еще как вариант можно всю информацию сохранять в папке по каждому письму,
             * а в контекст хранить пути к папкам, далее работаем с этим.
             */

            using (ImapClient client = new ImapClient())
            {
                // В данном примере предполагается, что все данные для подключения
                // и аудентификации есть в контексте робота.
                client.Connect(context.Host, (int)context.Port.Value, context.UseSsl.Value);
                client.Authenticate(context.UserName, context.Password);

                // Бучем читать из стандартной папки "Входящие", "Inbox" и т.п.
                IMailFolder inbox = client.Inbox;
                // Нужны права и на запись для помечания прочитанных
                inbox.Open(FolderAccess.ReadWrite);

                // Важный для нас этап - настройка запроса (фильтрация)
                // 1. Нам нужны те, которые мы еще не прочитали и которые не удалены
                var query = SearchQuery.NotSeen.And(SearchQuery.NotDeleted);
                // 2. Далее нам нужно добавить поиск по тексту темы.
                if (!string.IsNullOrEmpty(context.SubjectText))
                {
                    query = query.And(SearchQuery.SubjectContains(context.SubjectText));
                }
                // 2. Далее нам нужно добавить поиск по тексту отправителя (например, email).
                if (!string.IsNullOrEmpty(context.SenderText))
                {
                    query = query.And(SearchQuery.HeaderContains("FROM", context.SenderText));
                }

                // Далее выполняем запрос и получаем уникальные идентификаторы писем,
                // которые должны соответветствовать запросу.
                IList <UniqueId> uids = client.Inbox.Search(query);

                // Проходимся по письмам и получаем текст с вложениями
                foreach (UniqueId uid in uids)
                {
                    string subDirectory = Path.Combine(context.WorkDirectory, uid.Id.ToString());
                    Directory.CreateDirectory(subDirectory);
                    MimeMessage message = client.Inbox.GetMessage(uid);
                    // Обращаем внимание, что тут можно указывать формат
                    context.MessageTexts.Add(message.GetTextBody(MimeKit.Text.TextFormat.Text));

                    foreach (MimeEntity attachment in message.Attachments)
                    {
                        var fileName = attachment.ContentDisposition?.FileName ?? attachment.ContentType.Name;
                        fileName = Path.Combine(subDirectory, fileName);

                        using (var stream = File.Create(fileName))
                        {
                            if (attachment is MessagePart)
                            {
                                var mssagePart = (MessagePart)attachment;

                                mssagePart.Message.WriteTo(stream);
                            }
                            else
                            {
                                var part = (MimePart)attachment;

                                part.Content.DecodeTo(stream);
                            }
                        }

                        context.Attachments.Add(new FileInfo(fileName));
                    }
                }

                // Помечаем как прочитанные. Не забываем,
                // что может понадобиться права на запись в папке
                inbox.AddFlags(uids, MessageFlags.Seen, true);
            }
        }
コード例 #23
0
        public void DeleteMessages(ArrayImpl dataToDelete)
        {
            var messages = GetMessagesList(dataToDelete);

            _currentFolder.AddFlags(messages, MessageFlags.Deleted, silent: true);
        }
コード例 #24
0
        private void MailCheck()
        {
            DBConnect     conn          = new DBConnect();
            SqlConnection sqlConnection = new SqlConnection(@"Data Source=" + conn.host + ";Initial Catalog=" + conn.db +
                                                            ";" + "User ID=" + conn.user + ";Password="******"SELECT * FROM Mails WHERE Send_from = '{message.From.ToString().Replace("'","")}' " +
                                                 $"and Subject = '{message.Subject.ToString().Replace("'", "")}' and Send_to = '{message.To.ToString().Replace("'", "")}'";

                        bool kostyl = false;
                        using (DbDataReader reader = sqlCommand.ExecuteReader())
                        {
                            if (!reader.HasRows)
                            {
                                kostyl = true;
                            }
                        }

                        if (kostyl)
                        {
                            SqlCommand command = sqlConnection.CreateCommand();
                            command.CommandText = "INSERT INTO Mails (Send_from, Subject, Date_send, Send_to, Importance, isRead) " +
                                                  $"VALUES ('{message.From.ToString().Replace("'","")}', '{message.Subject.ToString().Replace("'", "")}', " +
                                                  $"'{message.Date.ToString().Replace("'", "")}', '{message.To.ToString().Replace("'", "")}', 'Важное', 0)";

                            command.ExecuteNonQuery();
                            inbox.AddFlags(item.UniqueId, MessageFlags.Deleted, true);
                            inbox.Expunge();
                        }
                    }

                    inbox.Close();
                }
            }
            catch (Exception ex)
            {
                Logger.Log.Error(ex.ToString());
            }
            finally
            {
                sqlConnection.Close();
                sqlConnection.Dispose();
            }
        }