Нотификатор непрочитанных сообщений электронной почты Gmail

Тема в разделе "Глядите, что я сделал", создана пользователем NikitOS, 10 мар 2018.

  1. NikitOS

    NikitOS Король шутов Администратор

    Hello!
    Представляю на суд свой проект нотификатора электронной почты Gmail.
    ------
    ESP8266 NodeMCU 1.0
    I₂C OLED дисплей 0.96 дюйма
    -----
    Дисплей подключен к NodeMCU так:
    Vcc - 3V
    Gnd - Gnd
    SCL - D5
    SDA - D3
    -----
    В строке №39 необходимо указать отпечаток SHA-1 сертификата SSL сайта mail.google.ru который можно узнать командой для Mac/Linux:
    Код (Bash):
    openssl s_client -connect mail.google.com:443 < /dev/null 2>/dev/null | openssl x509 -fingerprint -noout -in /dev/stdin | sed 's/:/ /g'
     
    В строке №40 необходимо указать ваш email и пароль зашифрованный в формате Base64. Закодировать можно здесь. Писать нужно в формате email@gmail.com: password, где email@gmail.com - ваш email; password - ваш пароль

    В строке №44 впишите ваши данные для подключения к WiFi

    В строке №47 укажите пины к которым вы подключили дисплей(D4 желательно не занимать)
    -----
    Код (C++):
    #include <WiFiClientSecure.h>   //Библиотека для работы с HTTPS
    #include <ESP8266WiFi.h>        //Библиотека для работы с WIFI на ESP8266
    #include <ESP8266WiFiMulti.h>   //Библиотека для подключения к одной из заданных сетей WIFI
    #include <Wire.h>               //Библиотека для работы с I₂C
    #include <Adafruit_SSD1306.h>   //Библиотека для работы с OLED дисплеями с чипом SSD1306

    ESP8266WiFiMulti wifiMulti;     //Объявляем объект типа ESP8266WifiMulti с именем wifiMulti

    Adafruit_SSD1306 display(5);
    const char* host = "mail.google.com"; //Сервер Gmail
    const char* url = "/mail/feed/atom";  //Ссылка для проверки новых сообщений
    const int httpsPort = 443;            //Порт для соеденения с сервером

    const char* fingerprint = "AD 42 C6 54 9A C5 63 6E 73 FA 51 0A 8F CF 07 21 AA 78 14 5B";  //SSL сертификат SHA-1 для соеденения с сервером
    const char* credentials = "ZW1haWxAZ21haWwuY29tOnBhc3N3b3Jk";                     //Ваш email и пароль закодированный в формате Base64
    int led = D4;                                                                             //Светодиод для индикации
    void setup() {
      pinMode(led, OUTPUT);                       //Пин светодиода как вход
      wifiMulti.addAP("SSID", "PASSWORD");      //Добавляем WIFI сеть к которой нужно подключиться
      int i = 0;
      wifiMulti.run();                            //Подключаемся к WIFI сети
      Wire.pins(D3,D5);                           //Назначаем пины I₂C для подключения дисплея D3-SDA, D6-SCL
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  //Тип дисплея - ssd1306 128x64
    }
    void loop() {
      display.clearDisplay();                                         //Отчищаем дисплей
      int unread = getUnread();                                       //Создаем переменную с числом непрочитанных сообщений
      if (unread == 0) {                                              //Если нет непрочитанных сообщений...
      display.setTextSize(1);                                         //Устанавливаем размер шрифта
      display.setCursor(0, 18);                                       //Устанавливаем курсор
      display.print("No unread emails");                              //Выводим надпись "No unread emails"
      digitalWrite(led, HIGH);                                        //Выключаем светодиод
      } else if (unread > 0) {                                        //Если есть непрочитанные сообщения...
        display.setTextSize(1);                                       //Устанавливаем размер шрифта
        display.setCursor(1, 18);                                     //Устанавливаем курсор
        display.print("Unread emails: " + String(unread));            //Выводим надпись "Unread emails: " и количество непрочитанных сообщений
        digitalWrite(led, LOW);                                       //Включаем светодиод
      } else {                                                        //Иначе...
        display.setTextSize(1);                                       //Устанавливаем размер шрифта
        display.setCursor(0, 18);                                     //Устанавливаем курсор
        display.println("Error get unread emails");                   //Выводим надпись "Error get unread emails"
      }
      delay(5000);                                                    //Ждем 5 секунд
    }

    int getUnread() {                                                    //Функция проверки числа непрочитанных сообщений
      WiFiClientSecure client;                                           //Используем WiFiClientSecure для создания HTTPS соеденения
      if (!client.connect(host, httpsPort)) {                            //Подключаемся к серверу Gmail с номером порта 443
        return -1;
      }
      if (client.verify(fingerprint, host)) {                            //Проверяем SHA-1 отпечаток SSH сертификата
      } else {                                                           //Иначе...
        return -1;
      }
      client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                   "Host: " + host + "\r\n" +
                   "Authorization: Basic " + credentials + "\r\n" +
                   "User-Agent: ESP8266\r\n" +
                   "Connection: close\r\n\r\n");                         //Передаем серверу данные для получения данных :/
      int unread = -1;

      while (client.connected()) {                                       //Ждем данных в формате XML
        client.readStringUntil('<');                                     //Читаем от открывающего тега...
        String tagname = client.readStringUntil('>');                    //До закрывающего и объявляем то что внутри тега как переменную tagname
        if (tagname == "fullcount") {                                    //Если имя тега равно <fullcount>
          String unreadStr = client.readStringUntil('<');                //Ищем закрывающий тег </fullcount>
          unread = unreadStr.toInt();                                    //Конвентируем из строки в переменную unread типа int
          break;                                                         //Останавливаем чтение
        }                                                                //Если тег <fullcount> не найден то переходим к следующему тегу
      }
      return unread;                                                     //Возвращаем число непрочитанных сообщений
    }
     

    Вопросы писать сюда
     
    Arduino.ru, Tomasina, ZAZ-965 и 2 другим нравится это.
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    Ну что я могу сказать?
    Наблюдаю значимый прогресс в знаниях, браво!
     
    Arduino.ru и NikitOS нравится это.