Arduino Ameba: 發送email === [回目錄](https://hackmd.io/CYIwxqBMoLQKYgKwDYYBYDMB2LMAcAZgIx4zACGISy4ycwkQA===) --- 參考資料:https://playground.arduino.cc/Code/Email --- Ameba官方範例裡沒有教你如何寄發email,所以就自己寫一個吧! 原理是這樣的: 網路上有某類伺服器叫做SMTP Server,專門用來發送email 只要使用Ameba板,對該SMTP Server發送特定的HTTP Request,就可以叫它幫我發送email出去了! --- ## 1. 註冊SMTP2GO,免費SMTP Server 註冊[SMTP2GO](https://www.smtp2go.com/)的帳號,這是一個SMTP Server,可以讓你連上去發送email,免費額度是每個月1000封以內,以測試來講夠用了 接著在[https://app.smtp2go.com/settings/users/](https://app.smtp2go.com/settings/users/)新增一個SMTP User,這才是真正發信用的email帳號 ## 2. 加密你的email帳密 使用[Base64encode網站](https://www.base64encode.org/),將剛剛SMTP User的帳號和密碼加密(encode),會得到兩串字串,存起來,等等寫code會用到,會用來發給SMTP Server確認我就是email帳號持有者 應該會得到類似下面的字串: test@gmail.com 會轉換成 **dGVzdEBnbWFpbC5jb20=** mypassword 會轉換成 **bXlwYXNzd29yZA==** ## 3. 寫ameba code,燒進去 這段code的功能是這樣的: - 連上某特定WiFi - 叫SMTP2GO發送一封email到指定信箱 - 待機 注意你必須更改前幾行的一些設定: - 你的WiFi AP SSID - 你的WiFi AP 密碼 - 你的WiFi AP IP - 剛剛得到的username加密後的字串 - 剛剛得到的password加密後的字串 - 發信者的email - 收信者的email ``` cpp #include <WiFi.h> // Wifi Seting char ssid[] = "SSID"; // edit this char pass[] = "PSWD"; // edit this WiFiClient client; int status = WL_IDLE_STATUS; // Email server setting char server[] = "smtpcorp.com"; int port = 2525; char myIP[] = "your-wifi-ip"; // edit this char username[] = "your-username-encoded-value"; // edit this char password[] = "your-password-encoded-value"; // edit this char sender[] = "<your@email.com>"; // edit this char reciver[] = "<others@email.com>"; // edit this //=========================================== void setup() { Serial.begin(9600); // Wifi Connect while (status != WL_CONNECTED) { Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); status = WiFi.begin(ssid, pass); delay(10000); } Serial.println("Connected to wifi"); Serial.println("\nStarting send email..."); if(sendEmail()){ Serial.println(F("Email sent")); } else { Serial.println(F("Email failed")); } } void loop() { delay(1000); } byte sendEmail() { byte thisByte = 0; byte respCode; if(client.connect(server,port) == 1) { Serial.println(F("connected")); } else { Serial.println(F("connection failed")); return 0; } if(!eRcv()) return 0; Serial.println(F("Sending hello")); // replace 1.2.3.4 with your Arduino's ip client.println((String)"EHLO "+myIP); if(!eRcv()) return 0; Serial.println(F("Sending auth login")); client.println("auth login"); if(!eRcv()) return 0; Serial.println(F("Sending User")); // Change to your base64 encoded user client.println(username); if(!eRcv()) return 0; Serial.println(F("Sending Password")); // change to your base64 encoded password client.println(password); if(!eRcv()) return 0; // change to your email address (sender) Serial.println(F("Sending From")); client.println((String)"MAIL From: "+sender); if(!eRcv()) return 0; // change to recipient address Serial.println(F("Sending To")); client.println((String)"RCPT To: "+reciver); if(!eRcv()) return 0; Serial.println(F("Sending DATA")); client.println("DATA"); if(!eRcv()) return 0; // Mail content here!!!!!!!!! Serial.println(F("Sending email")); client.println((String)"To: "+reciver); client.println((String)"From: "+sender); client.println("Subject: Arduino email test\r\n"); client.println("This is from my Arduino!"); client.println("."); if(!eRcv()) return 0; Serial.println(F("Sending QUIT")); client.println("QUIT"); if(!eRcv()) return 0; client.stop(); Serial.println(F("disconnected")); return 1; } byte eRcv() { byte respCode; byte thisByte; int loopCount = 0; while(!client.available()) { delay(1); loopCount++; // if nothing received for 10 seconds, timeout 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; } void efail() { byte thisByte = 0; int loopCount = 0; client.println(F("QUIT")); while(!client.available()) { delay(1); loopCount++; // if nothing received for 10 seconds, timeout if(loopCount > 10000) { client.stop(); Serial.println(F("\r\nTimeout")); return; } } while(client.available()) { thisByte = client.read(); Serial.write(thisByte); } client.stop(); Serial.println(F("disconnected")); } ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up