有了 ESP8266-01的溫濕度模組,可以查詢溫濕度的方法有好幾種,其中一種是透過網頁檢視目前溫濕度,這個作法有點被動,需要知道溫度時,再以瀏覽器連線查詢。上一篇實作將溫濕度的偵測值,每兩分鐘就送給 Line 通知用戶,這種方式比較主動。除了 Line 以外,還可以將當時的溫濕度值送到 Email信箱,以下就來看看如何實作將感測值寄到我的 Gmail 信箱。相關ESP8266-01溫濕度模組線路的連接方式,請參考:Arduino筆記(33):透過 ESP8266 無線網路讀取DHT-11的溫濕度。
要寄送郵件,有兩個必要條件:
(1) 要有發送的郵件主機 (SMTP) 帳號密碼
(2) 傳送的帳號密碼需要以 Base64 加密
由於程式內要送出帳號跟密碼,需要以 Base64 的格式傳送,我們透過 Base64Encode 這個網站將 帳號跟密碼轉換成 Base64 的碼,寫在程式內。以下是 Base64Encode的首頁。可以分別輸入登入 SMTP 的帳號跟密碼,取得兩組編成 Base64的加密字串。例如帳號名稱是[myaccount] 編譯後的結果為 [bXlhY2NvdW50]。
我個人使用中華電信的信箱已經很長一段時間,以下的實作就用中華電信的郵件主機,寄送 DHT-11的溫濕度感測值到我的 Gmail 信箱,完整程式如下:
要寄送郵件,有兩個必要條件:
(1) 要有發送的郵件主機 (SMTP) 帳號密碼
要從ESP8266模塊發送電子郵件,您需要遵循SMTP協議。如果沒有其他可以寄信的郵箱,可以申請免費的 SMTP 寄信服務,例如:Sendpulse 、SMTP2GO或其他的 SMTP 服務 。
由於程式內要送出帳號跟密碼,需要以 Base64 的格式傳送,我們透過 Base64Encode 這個網站將 帳號跟密碼轉換成 Base64 的碼,寫在程式內。以下是 Base64Encode的首頁。可以分別輸入登入 SMTP 的帳號跟密碼,取得兩組編成 Base64的加密字串。例如帳號名稱是[myaccount] 編譯後的結果為 [bXlhY2NvdW50]。
我個人使用中華電信的信箱已經很長一段時間,以下的實作就用中華電信的郵件主機,寄送 DHT-11的溫濕度感測值到我的 Gmail 信箱,完整程式如下:
[程式]
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <DHT.h>
#define DHTTYPE DHT11
#define DHTPIN 2
// 設定網路基地台SSID跟密碼
char ssid[] = "MyHome";
char password[] = "12345678";
char server[] = "xxx.hinet.net"; // The SMTP Server
String tempe = ""; // 顯示溫度的字串
String humid = ""; // 顯示濕度的字串
DHT dht(DHTPIN, DHTTYPE, 11);
float humidity, temp_f; // 從 DHT-11 讀取的值
// will store last temp was read
unsigned long previousMillis = 0;
// interval at which to read sensor
const long interval = 2000;
WiFiClient espClient;
void setup()
{
Serial.begin(9600);
delay(10);
Serial.println("");
Serial.println("");
Serial.print("Connecting To: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
// 等待連線,並從 Console顯示 IP
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi Connected.");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void loop()
{
// 量測間等待至少 2 秒
unsigned long currentMillis = millis();
if(currentMillis - previousMillis >= interval) {
// 將最後讀取感測值的時間紀錄下來
previousMillis = currentMillis;
// 讀取溫度大約 250 微秒!
humidity = dht.readHumidity(); // 讀取濕度(百分比)
temp_f = dht.readTemperature(true); // 讀取溫度(華氏)
// humidity = 53.5;
// temp_f = 102.4;
// 檢查兩個值是否為空值
if (isnan(humidity) || isnan(temp_f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
}
// 除錯用
String tempe="現在溫度:"+String((int)(temp_f-32)*5/9)+"℃";
String humid="濕度:"+String((int)humidity)+"%";
Serial.println(tempe);
Serial.println(humid);
sendEmail(tempe,humid);
// 每三分鐘會發出一封郵件
delay(180000);
}
void sendEmail(String tempe, String humid)
{
// 使用 25 Port 連線
if (espClient.connect(server, 25) == 1) {
Serial.println(F("connected"));
}
else {
Serial.println(F("connection failed"));
return;
}
if (!emailResp())
return;
// 使用EHLO命令問候 SMTP服務器。
// 如果連接成功,會得到回應碼 250
Serial.println(F("Sending EHLO"));
espClient.println("EHLO www.example.com");
if (!emailResp())
return;
// 使用AUTH LOGIN 指令登入授權用戶。
// 如果連接成功,會得到回應碼 334
Serial.println(F("Sending auth login"));
espClient.println("AUTH LOGIN");
if (!emailResp())
return;
// 發送郵件登入 SMTP 主機的帳號,
//需要用 BASE64編碼,需使用者自行修改
Serial.println(F("Sending User"));
espClient.println("ABCD123456"); //
if (!emailResp())
return;
// 發送郵件登入 SMTP 主機的密碼,
// 需要用 BASE64編碼,需使用者自行修改
Serial.println(F("Sending Password"));
espClient.println("ABCD123456");
if (!emailResp())
return;
// 寄件者郵箱名稱
Serial.println(F("Sending From"));
espClient.println(F("MAIL From: xxx@ms4.hinet.net"));
if (!emailResp())
return;
// 收件者郵箱名稱
Serial.println(F("Sending To"));
espClient.println(F("RCPT To: xxx@gmail.com"));
if (!emailResp())
return;
// 發送"DATA",然後發送電子郵件的內文
Serial.println(F("Sending DATA"));
espClient.println(F("DATA"));
if (!emailResp())
return;
Serial.println(F("Sending email"));
// 改成您的收件者郵箱名稱
espClient.println(F("To: xxx@gmail.com"));
// 改成您的送件者郵箱名稱
espClient.println(F("From: xxx@ms4.hinet.net"));
espClient.println(F("Subject: ESP8266 test e-mail\r\n"));
espClient.println(F("This is a e-mail sent from ESP8266.\n"));
espClient.println(tempe);
espClient.println(humid);
//
espClient.println(F("."));
if (!emailResp())
return;
//終止郵件並發送quit命令
Serial.println(F("Sending QUIT"));
espClient.println(F("QUIT"));
if (!emailResp())
return;
espClient.stop();
Serial.println(F("disconnected"));
}
byte emailResp() {
byte responseCode;
byte readByte;
int loopCount = 0;
while (!espClient.available())
{
delay(1);
loopCount++;
// 等待 20 秒,如果無法接收就停止
if (loopCount > 20000) {
espClient.stop();
Serial.println(F("\r\nTimeout"));
return 0;
}
}
responseCode = espClient.peek();
while (espClient.available()) {
readByte = espClient.read();
Serial.write(readByte);
}
if (responseCode >= '4') {
// efail();
return 0;
}
return 1;
}




hi 你好
回覆刪除有如此的應用我很有興趣 ,依你的程式碼 我可以發送email 到我的指定信箱可是不是每一封都成功,觀察中發現只有在 250 msr11 的時候才可以收到,想請教是那出了問題?
您好, 這應該是跟mail Server有關,也就是mail server要有SMTP的權限,通常是要帳號密碼才能透過這個帳號寄送。我曾遇到一種狀況是:如果是非中華電信的線路商連線(當時是台灣大哥大線路),無法直接打開Outlook寄信,必須回到中華電信的網頁上才可以寄信。您再看一下是否是因為mail server SMTP權限的問題而無法正常寄信。
刪除非常感謝您的分享。 您提到的用於在線base64解碼和編碼的工具很棒。 但是,這是另一個工具,您可以將其用作替代工具。 該工具是
回覆刪除url-decode.com/tool/base64-encode
這也使您可以訪問其他數量的Web實用程序。
謝謝分享...
刪除網誌管理員已經移除這則留言。
回覆刪除Searching for an SMTP2Go alternative that offers better scalability? Find top email platforms with reliable SMTP relay, dedicated IPs, detailed analytics, and seamless integration for bulk and transactional email campaigns.
回覆刪除張貼留言