Загрузка...

Просмотр сообщений с почты Gmail в Telegram

Тема в разделе C# создана пользователем RSLR 21 дек 2024. (поднята 25 дек 2024) 283 просмотра

Загрузка...
  1. RSLR
    RSLR Автор темы 21 дек 2024 Пятница 224 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; }
    }
     
    21 дек 2024 Изменено
    1. RSLR Автор темы
      RSLR, везде, где в коде написало "https://" уберите это и все заработает
  2. NRU
    NRU 21 дек 2024 1340 10 дек 2023
    Подойдет для пенсионеров
     
    1. AS7RID
      NRU, Даже для пенсионеров не подойдёт. Проще просто в почту зайти и не ебаться с ботом
  3. architectcoders
    architectcoders 21 дек 2024 Заблокирован(а)
    Написать код через чат гпт и выкинуть на лолз - НИХУЕВА
     
    1. architectcoders
      architectcoders, Да что говорить даже в падлу было в блок кода вставить
  4. vtlstolyarov
    vtlstolyarov 26 дек 2024 474 8 янв 2022
    Не пробовал нормальный
    CSHARP
    await CheckEmailsPeriodically();
    вместо
    CSHARP
    _ = Task.Run(CheckEmailsPeriodically);

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