Загрузка...

View messages from Gmail in Telegram

Thread in C# created by RSLR Dec 21, 2024. (bumped Dec 25, 2024) 336 views

  1. RSLR
    RSLR Topic starter Dec 21, 2024 Пятница 305 Mar 23, 2024
    Всем привет! Сделал простого 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 а за тем в поиске параметров гугл напишите "пароли для приложений" и сгенерируйте свой пароль, затем вставьте его в код
    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; }
    }
     
    1. RSLR Topic starter
      RSLR, везде, где в коде написало "https://" уберите это и все заработает
  2. NRU
    NRU Dec 21, 2024 1337 Dec 10, 2023
    Подойдет для пенсионеров
     
    1. AS7RID
      NRU, Даже для пенсионеров не подойдёт. Проще просто в почту зайти и не ебаться с ботом
  3. architectcoders
    Написать код через чат гпт и выкинуть на лолз - НИХУЕВА
     
    1. architectcoders
      architectcoders, Да что говорить даже в падлу было в блок кода вставить
    2. Богатый
      architectcoders, Да нихуя, чатгпт бы лучше написал
  4. vtlstolyarov
    Не пробовал нормальный
    CSHARP
    await CheckEmailsPeriodically();
    вместо
    CSHARP
    _ = Task.Run(CheckEmailsPeriodically);

    // Не завершать приложение
    Console.ReadLine();
     
Loading...
Top