Всем привет! Сделал простого Telegram - бота, который позволяет читать сообщения с вашей почты Gmail. Что бот может? - Читать сообщения с любой почты GMail - Проверять все ваши почты и выдавать новые сообщения списком - Говорит вам, приходило ли вам сообщение на какую то из почт, то есть чекает почты по кд 1 минуты. Если пришло смс то он вам дает уведому. Что требуется для работы бота? Для чайников: 1. Установите IDE. Я использовал VSCode. 2. Вам требуется установить .Net 3. Заходите в компилятор и просто вставляете код из следующего спойлера 4. Вставляете API ключ из BotFather в Telegram 5. Вставляете ваш ChatID, вы можете взять его, например, в https://t.me/username_to_id_bot 6. Установите библиотеку Telegram.Bot 18 версии 7. Получите ваш пароль для почты. Включите в гугл 2fa а за тем в поиске параметров гугл напишите "пароли для приложений" и сгенерируйте свой пароль, затем вставьте его в код Код C# using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using MailKit; using MailKit.Net.Imap; using MailKit.Security; using MimeKit; using Telegram.Bot; using Telegram.Bot.Polling; using Telegram.Bot.Types; using Telegram.Bot.Types.Enums; class Program { private static List<MailAccount> emailAccounts = new List<MailAccount> { new MailAccount { Email = "пример", Password = "пароль", ImapHost = "imap.gmail.com", Port = 993 }, new MailAccount { Email = "пример", Password = "пароль", ImapHost = "imap.gmail.com", Port = 993 }, new MailAccount { Email = "пример", Password = "пароль", ImapHost = "imap.gmail.com", Port = 993 }, new MailAccount { Email = "пример", Password = "пароль", ImapHost = "imap.gmail.com", Port = 993 } //вставьте здесь по такому формату столько //почт, сколько пожелаете }; private static TelegramBotClient botClient; private static Dictionary<string, string> lastSeenMessages = new Dictionary<string, string>(); public static async Task Main(string[] args) { string token = "TOKEN"; // Замените на свой токен из BotFather botClient = new TelegramBotClient(token); var cancellationToken = new CancellationTokenSource(); var receiverOptions = new ReceiverOptions { AllowedUpdates = Array.Empty<UpdateType>() }; botClient.StartReceiving( updateHandler: BotUpdateHandler, pollingErrorHandler: BotPollingErrorHandler, receiverOptions: receiverOptions, cancellationToken: cancellationToken.Token ); Console.WriteLine("Бот запущен..."); _ = Task.Run(CheckEmailsPeriodically); // Не завершать приложение Console.ReadLine(); } private static async Task BotUpdateHandler(ITelegramBotClient bot, Update update, CancellationToken cancellationToken) { if (update.Type == UpdateType.Message && update.Message!.Type == MessageType.Text) { var message = update.Message; if (message.Text == "/checkemails") { string response = await GetEmails(); await botClient.SendTextMessageAsync(message.Chat.Id, response, cancellationToken: cancellationToken); } else { await botClient.SendTextMessageAsync(message.Chat.Id, "Напишите /checkemails для получения сообщений с почты.", cancellationToken: cancellationToken); } } } private static Task BotPollingErrorHandler(ITelegramBotClient bot, Exception exception, CancellationToken cancellationToken) { Console.WriteLine($"Ошибка в обработке бота: {exception.Message}"); return Task.CompletedTask; } private static async Task CheckEmailsPeriodically() { while (true) { foreach (var account in emailAccounts) { try { var latestMessage = await GetLatestMessageSubject(account); if (!lastSeenMessages.ContainsKey(account.Email) || lastSeenMessages[account.Email] != latestMessage) { if (!string.IsNullOrEmpty(latestMessage)) { lastSeenMessages[account.Email] = latestMessage; await botClient.SendTextMessageAsync( chatId: CHAT ID, //Впишите ваш чат ID из https://t.me/username_to_id_bot text: $"Новое сообщение на почте {account.Email}! Пора проверить почту!" ); } } } catch (Exception ex) { Console.WriteLine($"Ошибка при проверке почты {account.Email}: {ex.Message}"); } } await Task.Delay(TimeSpan.FromMinutes(1)); } } private static async Task<string> GetEmails() { var result = new List<string>(); foreach (var account in emailAccounts) { var emails = await GetEmailsFromAccount(account); result.Add($"Почта: {account.Email}"); result.AddRange(emails); result.Add("----------"); } return string.Join("\n", result); } private static async Task<List<string>> GetEmailsFromAccount(MailAccount account) { var emails = new List<string>(); try { using (var client = new ImapClient()) { await client.ConnectAsync(account.ImapHost, account.Port, SecureSocketOptions.SslOnConnect); await client.AuthenticateAsync(account.Email, account.Password); var inbox = client.Inbox; await inbox.OpenAsync(FolderAccess.ReadOnly); var messageCount = inbox.Count; var messages = await inbox.FetchAsync(0, Math.Min(10, messageCount) - 1, MessageSummaryItems.Full); foreach (var message in messages) { emails.Add($"{message.Envelope.Subject} - {message.Envelope.Date:yyyy-MM-dd **:mm:ss}"); } await client.DisconnectAsync(true); } } catch (Exception ex) { emails.Add($"Ошибка при подключении к почте {account.Email}: {ex.Message}"); } return emails; } private static async Task<string> GetLatestMessageSubject(MailAccount account) { try { using (var client = new ImapClient()) { await client.ConnectAsync(account.ImapHost, account.Port, SecureSocketOptions.SslOnConnect); await client.AuthenticateAsync(account.Email, account.Password); var inbox = client.Inbox; await inbox.OpenAsync(FolderAccess.ReadOnly); var messageCount = inbox.Count; if (messageCount == 0) return string.Empty; var latestMessage = await inbox.GetMessageAsync(messageCount - 1); await client.DisconnectAsync(true); return latestMessage.Subject; } } catch (Exception ex) { Console.WriteLine($"Ошибка при получении сообщений для {account.Email}: {ex.Message}"); return string.Empty; } } } public class MailAccount { public string Email { get; set; } public string Password { get; set; } public string ImapHost { get; set; } public int Port { get; set; } }
Не пробовал нормальный await CheckEmailsPeriodically(); CSHARP await CheckEmailsPeriodically(); вместо _ = Task.Run(CheckEmailsPeriodically); // Не завершать приложение Console.ReadLine(); CSHARP _ = Task.Run(CheckEmailsPeriodically); // Не завершать приложение Console.ReadLine();