#include #include #include #include #include #define SMTP_PORT     587 #define ONE_WIRE_PIN  5 #define SLEEP_TIME    (30*60) #define EXT1_WAKEUP #ifdef EXT1_WAKEUP #define BUTTON_PIN_BITMASK 0x300000000 #endif const char* ssid = "Livebox-XXXX"; const char* password = "XXXXXXXXXXXXXXXXXXXXXXXXXX"; char server[] = "smtp.xxxxxx.xx"; // Change to your base64, ASCII encoded user const char userID[] = "XxXxXxXxXxXx"; // change to your base64, ASCII encoded password const char userPWD[] = "YyYyYyYyYyYyYy"; // sender const char sender[] = "sender@xxxxxx.xx"; // recipent const char recipient[] = "xxxxx.xxxxxxxx@gmail.com";  WiFiClient client; OneWire oneWire(ONE_WIRE_PIN  ); DallasTemperature DS18B20(&oneWire); void setup() {   byte ret;   uint64_t wakeup_pin_mask;   Serial.begin(115200);   WiFi.begin(ssid, password);   while (WiFi.status() != WL_CONNECTED)   {     delay(500);     Serial.print(".");   }   Serial.println("");   Serial.println("WiFi Connected");   Serial.print("IPess: ");   Serial.println(WiFi.localIP());   switch (esp_sleep_get_wakeup_cause()) {     case ESP_SLEEP_WAKEUP_EXT0:       ret = sendEmail("**** Motion Detected ****");       break;     case ESP_SLEEP_WAKEUP_EXT1: #ifdef EXT1_WAKEUP       wakeup_pin_mask = esp_sleep_get_ext1_wakeup_status();       if (wakeup_pin_mask & GPIO_SEL_32) {         ret = sendEmail("**** Motion1 Detected ****");       }       if (wakeup_pin_mask & GPIO_SEL_33) {         ret = sendEmail("**** Motion2 Detected ****");       }       else {       }       break; #endif     case ESP_SLEEP_WAKEUP_TIMER:       char temp[6];       char s[32];       dtostrf(getTemperature(), 5, 2, temp);       sprintf(s, "**** temperture is %s ****", temp);       ret = sendEmail(s);       break;     case ESP_SLEEP_WAKEUP_TOUCHPAD:       ret = sendEmail("**** TOUCH ****");       break;     case ESP_SLEEP_WAKEUP_ULP:       ret = sendEmail("**** ULP ****");       break;     default:       ret = sendEmail("**** Just Started ****");       break;   }   Serial.print("Going into deep sleep for ");   Serial.print(SLEEP_TIME);   Serial.println(" seconds");   delay(50);   esp_sleep_enable_timer_wakeup(1000000L * SLEEP_TIME); #ifdef EXT1_WAKEUP   esp_sleep_enable_ext1_wakeup(BUTTON_PIN_BITMASK, ESP_EXT1_WAKEUP_ANY_HIGH);   // internal pull-ups not available !!! #else   esp_sleep_enable_ext0_wakeup(GPIO_NUM_33, 1);   rtc_gpio_pulldown_en(GPIO_NUM_33); #endif   esp_deep_sleep_start(); } void loop() { } byte sendEmail(const char *data) {   byte thisByte = 0;   byte respCode;   if (client.connect(server, SMTP_PORT) == 1) {     Serial.println(F("connected"));   } else {     Serial.println(F("connection failed"));     return 0;   }   if (!recv()) return 0;   Serial.println(F("Sending HELLO"));   client.println("EHLO www.example.com");   if (!recv()) return 0;   Serial.println(F("Sending auth login"));   client.println("auth login");   if (!recv()) return 0;   Serial.println(F("Sending User"));   client.println(userID);   if (!recv()) return 0;   Serial.println(F("Sending Password"));   client.println(userPWD);   if (!recv()) return 0;   Serial.print(F("Sending From ")); Serial.println(sender);   client.print(F("MAIL From: ")); client.println(sender);   if (!recv()) return 0;   Serial.print(F("Sending To ")); Serial.println(recipient);   client.print(F("RCPT To: ")); client.println(recipient);   if (!recv()) return 0;   Serial.println(F("Sending DATA"));   client.println(F("DATA"));   if (!recv()) return 0;   Serial.println(F("Sending email"));   client.print(F("To: ")); client.println(recipient);   client.print(F("From: ")); client.println(sender);   client.println(F("Subject: My first Email from ESP32\r\n"));   client.print(F("From ESP32 N° "));   uint64_t chipID = ESP.getEfuseMac();   client.println((uint16_t)(chipID >> 32), HEX);   Serial.println(data);   client.println(data);   client.println(F("."));   if (!recv()) return 0;   Serial.println(F("Sending QUIT"));   client.println(F("QUIT"));   if (!recv()) return 0;   client.stop();   Serial.println(F("disconnected"));   return 1; } byte recv() {   byte respCode;   byte thisByte;   int loopCount = 0;   while (!client.available()) {     delay(1);     loopCount++;     if (loopCount > 10000) {       client.stop();       Serial.println(F("\r\nTimeout"));       return 0;     }   }   respCode = client.peek();   while (client.available()) {     thisByte = client.read();     Serial.write(thisByte);   }   if (respCode >= '4') {     //  efail();     return 0;   }   return 1; } float getTemperature() {   float tempC;   do {     DS18B20.requestTemperatures();     tempC = DS18B20.getTempCByIndex(0);     delay(100);   } while (tempC == 85.0 || tempC == (-127.0));   return tempC; }