Arduino - Water Leak Email Notification

In this guide, we will learn how to use Arduino to find water leaks and send alerts by email instantly. We will go through how to set up the sensor, show examples of the code, and explain how to connect with email services. This will help keep your home or office safe from water damage. This is great for people who enjoy do-it-yourself projects and want to improve their systems for detecting water leaks.

Arduino Water Leak Email Notification

Hardware Required

1×Arduino UNO R4 WiFi
1×USB Cable Type-C
1×Water Leak Detector
1×Jumper Wires
1×(Optional) DC Power Jack
1×(Recommended) Screw Terminal Block Shield for Arduino Uno
1×(Optional) Transparent Acrylic Enclosure For Arduino Uno

Or you can buy the following sensor kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Please note: These are Amazon affiliate links. If you buy the components through these links, We will get a commission at no extra cost to you. We appreciate it.

About Water Sensor and Gmail

We offer detailed tutorials on Water Sensors and Gmail. Each guide provides thorough details and easy-to-follow steps on hardware setup, how it works, and how to connect and program the Arduino. To learn more, visit these links:

Wiring Diagram between Water Sensor and Arduino

Arduino Water Sensor Wiring Diagram

This image is created using Fritzing. Click to enlarge image

Arduino Code

/* * Created by * * This example code is in the public domain * * Tutorial page: */ #include <WiFiS3.h> #include <ESP_Mail_Client.h> #define WIFI_SSID "YOUR_WIFI_SSID" // CHANGE IT #define WIFI_PASSWORD "YOUR_WIFI_PASSWORD" // CHANGE IT // the sender email credentials #define SENDER_EMAIL "" // CHANGE IT #define SENDER_PASSWORD "xxxx xxxx xxxx xxxx" // CHANGE IT to your Google App password #define RECIPIENT_EMAIL "" // CHANGE IT #define SMTP_HOST "" #define SMTP_PORT 587 #define WATER_SENSOR_PIN 7 // Arduino pin D7 connected to water sensor's pin int water_state; // current state of water sensor int prev_water_state; // previous state of water sensor SMTPSession smtp; void setup() { Serial.begin(9600); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.print("Connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(300); } Serial.println(); Serial.print("Connected with IP: "); Serial.println(WiFi.localIP()); Serial.println(); pinMode(WATER_SENSOR_PIN, INPUT_PULLUP); // set Arduino pin to input pull-up mode water_state = digitalRead(WATER_SENSOR_PIN); // read state } void loop() { prev_water_state = water_state; // save the last state water_state = digitalRead(WATER_SENSOR_PIN); // read new state if (prev_water_state == HIGH && water_state == LOW) { Serial.println("Water leakage is detected!"); String subject = "Email Notification from Arduino"; String textMsg = "This is an email sent from Arduino.\n"; textMsg += "Water leakage is detected"; gmail_send(subject, textMsg); } } void gmail_send(String subject, String textMsg) { // set the network reconnection option MailClient.networkReconnect(true); smtp.debug(1); smtp.callback(smtpCallback); Session_Config config; // set the session config config.server.host_name = SMTP_HOST; config.server.port = SMTP_PORT; = SENDER_EMAIL; config.login.password = SENDER_PASSWORD; config.login.user_domain = F(""); config.time.ntp_server = F(","); config.time.gmt_offset = 3; config.time.day_light_offset = 0; // declare the message class SMTP_Message message; // set the message headers = F("Arduino"); = SENDER_EMAIL; message.subject = subject; message.addRecipient(F("To Whom It May Concern"), RECIPIENT_EMAIL); message.text.content = textMsg; message.text.transfer_encoding = "base64"; message.text.charSet = F("utf-8"); message.priority = esp_mail_smtp_priority::esp_mail_smtp_priority_low; // set the custom message header message.addHeader(F("Message-ID: <>")); // connect to the server if (!smtp.connect(&config)) { Serial.println("Connection error: "); Serial.print("- Status Code: "); Serial.println(smtp.statusCode()); Serial.print("- Error Code: "); Serial.println(smtp.errorCode()); Serial.print("- Reason: "); Serial.println(smtp.errorReason().c_str()); return; } if (!smtp.isLoggedIn()) { Serial.println("Not yet logged in."); } else { if (smtp.isAuthenticated()) Serial.println("Successfully logged in."); else Serial.println("Connected with no Auth."); } // start sending Email and close the session if (!MailClient.sendMail(&smtp, &message)) { Serial.println("Connection error: "); Serial.print("- Status Code: "); Serial.println(smtp.statusCode()); Serial.print("- Error Code: "); Serial.println(smtp.errorCode()); Serial.print("- Reason: "); Serial.println(smtp.errorReason().c_str()); } } // callback function to get the Email sending status void smtpCallback(SMTP_Status status) { // print the current status Serial.println(; // print the sending result if (status.success()) { for (size_t i = 0; i < smtp.sendingResult.size(); i++) { // get the result item SMTP_Result result = smtp.sendingResult.getItem(i); Serial.print("Status: "); if (result.completed) Serial.println("success"); else Serial.println("failed"); Serial.print("Recipient: "); Serial.println(result.recipients.c_str()); Serial.print("Subject: "); Serial.println(result.subject.c_str()); } Serial.println("----------------\n"); // free the memory smtp.sendingResult.clear(); } }

Quick Steps

  • If this is the first time you use Arduino Uno R4, see how to setup environment for Arduino Uno R4 on Arduino IDE.
  • Place the water sensor where it might detect water leakage.
  • Connect the water sensor to the Arduino board.
  • Connect the Arduino board to your PC using a micro USB cable.
  • Open the Arduino IDE on your PC.
  • Select the right Arduino board (Arduino Uno R4 WiFi) and COM port.
  • Open the Library Manager by clicking on the Library Manager icon in the Arduino IDE's left navigation bar.
  • Search for ESP Mail Client and find the ESP Mail Client developed by Mobizt.
  • Click the Install button to add the ESP Mail Client library.
Arduino ESP Mail Client library
  • Copy the code provided and open it in Arduino IDE.
  • Update your WiFi details (SSID and password) in the code by modifying WIFI_SSID and WIFI_PASSWORD.
  • Replace the sender's email and password with your own by changing SENDER_EMAIL and SENDER_PASSWORD.
  • Update the recipient's email address in the code by modifying RECIPIENT_EMAIL. This can be the same as the sender’s email.


  • The email of the sender must be a Gmail account.
  • The sender's password is the App password obtained from the earlier step.
  • The email of the recipient can be any kind of email.
  • Click the Upload button in Arduino IDE to upload the code to Arduino.
  • Open the Serial Monitor.
  • Pour water onto the water sensor.
  • Look at the result on the Serial Monitor.
Water leakage is detected #### Email sent successfully > C: Email sent successfully ---------------- Message sent success: 1 Message sent failed: 0 ---------------- Message No: 1 Status: success Date/Time: May 27, 2024 04:42:50 Recipient: Subject: Email Notification from Arduino ----------------
Autoscroll Show timestamp
Clear output
9600 baud  
  • Check your email inbox. You will receive an email like the following:
Arduino water sensor email

Video Tutorial

We are considering to make the video tutorials. If you think the video tutorials are essential, please subscribe to our YouTube channel to give us motivation for making the videos.

The Best Arduino Starter Kit