/// <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); }
/// <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}]"; } }
/// <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); }
private static void MarkAllMessagesAsSeen(IMailFolder folder) { var uids = folder.Search(SearchQuery.NotSeen); if (uids.Any()) { folder.AddFlags(uids, MessageFlags.Seen, true); } }
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); } }
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(); } }
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); }
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); } }
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); } } }
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); } } }
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"); }
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); } }
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); } }
/// <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); } }
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; } } }
public void Delete(int index) { folderMail.AddFlags(index, MessageFlags.Deleted, false); client.Disconnect(false); }
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; } } }
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); } }
public static void DeleteEmails(ImapClient client, IList <UniqueId> emails, IMailFolder folder) { folder.AddFlags(emails, MessageFlags.Deleted, false); folder.Expunge(); }
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)); } } } }
/// <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); } }
/// <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); } }
public void DeleteMessages(ArrayImpl dataToDelete) { var messages = GetMessagesList(dataToDelete); _currentFolder.AddFlags(messages, MessageFlags.Deleted, silent: true); }
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(); } }