در این آموزش به نحوه ارسال ایمیل از طریق یک سرور ESP32 می پردازیم . ایمیل یکی از کاربردی ترین سرویس های مبتنی بر اینترنت است . در این سرویس می توان هر نوع فایل کامپیوتری همچون مالتی مدیا ، سند ها و… را انتقال داد . پرتکل های متعدد برای استفاده از سرویس ایمیل وجود دارد . هر کدام از این پروتکل ها کاربرد و سطح امنیت خاص خود را دارند مانند پرتکل های IMAP و POP3 . در این آموزش ما از پروتکل SMTP استفاده میکنیم . این پروتکل یک راه کار ساده برای ارسال ایمیل است اما برای دریافت ایمیل مناسب نیست . یکی از دلایل استفاده از SMTP در این آموزش ساختار SMTP می باشد . SMTP در واقع یک روش انتقال بر پایه پروتکل TCP است که همین موضوع امکان به کار گیری SMTP را در ماژول هایی مانند ESP32 فراهم می سازد . SMTP از پورت 25 برای انتقال دیتا به دریافت کننده استفاده می کند . همچینین تنها به رمز و ID ایمیل نیاز دارد . برای درک بهتر مطالب فوق می توانید مطالب مربوط به SMTP را در اینترنت مطالعه کنید .
وب سایت ها و پلتفرم های زیادی وجود دارند که خدمات ایمیل را به کاربران ارائه می دهند . یکی از این سرویس های Gmail است . به راحتی توسط Gmail می توان به هر کاربر ایمیل ، نامه ارسال کرد . یکی از مزیت های Gmail برای استفاده از آن در اینترنت اشیا ، رایگان بودن و نیز پشتیبانی آن از دریافت و ارسال SMTP می باشد . در این پروژه از یک Gmail به عنوان مقصد دریافت ایمیل ها استفاده می کنیم .
نکته : به طور کلی SMTP امنیت پایینی در بین سایر پرتکل های دیگر دارد لذا از یک حساب کاربری جدید برای این پروژه استفاده کنید .
تنظیمات Gmail :
پس از ساخت یک حساب کاربری گوگل ، امکان استفاده از Gmail را خواهید داشت . می توانید در اینترنت آموزش ساخت حساب کاربری گوگل را مطالعه کنید . پس از ساخت حساب کاربری باید در قسمت less secure به برنامه های کم امنیت اجازه دسترسی یه Gmail خود را تایید کنید . می توانید برای این کار پس از ورود به حساب کاربری از این لینک گزینه Allow less secure apps را فعال کنید .
جزئیات ارتباط SMTP در سرویس Gmail به صورت زیر است :
SMTP Server : smtp.gmail.com
SMTP userbame : ([email protected] نام کاربری شما ( به طور
SMTP Password : شما Gmail رمز عبور
همچنین پورت های TLS و SSL به ترتیب برابر 587 و 465 هستند . این تنظیمات به صورت پیش فرض وجود دارند و نیازی به تغییر تنظیمات نیست . همچنین در صورتی که از یک سرویس ایمیل دیگری مانند yahoo می هواهید استفاده کنید ابتدا باید تنظیمات SMTP آن را پیدا کنید و سپس آن را در برنامه وارد کنید .
ارسال یک ایمیل :
در این پروژه از کتابخانه ESP32 Mial Client استفاده می شود لذا ابتدا باید این کتابخانه را از قسمت Lib manager آردوینو IDE دانلود کنید :
کد های زیر را در آردوینو IDE کپی و سپس بر ر.وی برد خود آپلود کنید . ابتدا لازم است قسمت هایی از کد را تغییر دهید که این موارد در کد ها کامنت شده اند :
/* Rui Santos Complete project details at https://RandomNerdTutorials.com/esp32-send-email-smtp-server-arduino-ide/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. */ #include "ESP32_MailClient.h" // REPLACE WITH YOUR NETWORK CREDENTIALS const char* ssid = "اسم وایفای خود را در این قسمت وارد کنید "; const char* password = "رمز وایفای خود را در این قسمت وارد کنید"; // To send Email using Gmail use port 465 (SSL) and SMTP Server smtp.gmail.com // YOU MUST ENABLE less secure app option https://myaccount.google.com/lesssecureapps?pli=1 #define emailSenderAccount "[email protected]" //در این قسمت ایمیل خود را وارد کنید #define emailSenderPassword "YOUR_EXAMPLE_EMAIL_PASSWORD"// در این قسمت رمز وایفای خود را وارد کنید #define emailRecipient "[email protected]"//در اینجا نیز ایمیل خود را به عنوان دریافت کننده تعریف کنید #define smtpServer "smtp.gmail.com" #define smtpServerPort 465 #define emailSubject "ESP32 Test" // The Email Sending data object contains config and data to send SMTPData smtpData; // Callback function to get the Email sending status void sendCallback(SendStatus info); void setup(){ Serial.begin(115200); Serial.println(); Serial.print("Connecting"); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(200); } Serial.println(); Serial.println("WiFi connected."); Serial.println(); Serial.println("Preparing to send email"); Serial.println(); // Set the SMTP Server Email host, port, account and password smtpData.setLogin(smtpServer, smtpServerPort, emailSenderAccount, emailSenderPassword); // For library version 1.2.0 and later which STARTTLS protocol was supported,the STARTTLS will be // enabled automatically when port 587 was used, or enable it manually using setSTARTTLS function. //smtpData.setSTARTTLS(true); // Set the sender name and Email smtpData.setSender("ESP32", emailSenderAccount); // Set Email priority or importance High, Normal, Low or 1 to 5 (1 is highest) smtpData.setPriority("High"); // Set the subject smtpData.setSubject(emailSubject); // Set the message with HTML format smtpData.setMessage("<div style=\"color:#2f4468;\"><h1>Hello World!</h1><p>- Sent from ESP32 board</p></div>", true); // Set the email message in text format (raw) //smtpData.setMessage("Hello World! - Sent from ESP32 board", false); // Add recipients, you can add more than one recipient smtpData.addRecipient(emailRecipient); //smtpData.addRecipient("[email protected]"); smtpData.setSendCallback(sendCallback); //Start sending Email, can be set callback function to track the status if (!MailClient.sendMail(smtpData)) Serial.println("Error sending Email, " + MailClient.smtpErrorReason()); //Clear all data from Email object to free memory smtpData.empty(); } void loop() { } // Callback function to get the Email sending status void sendCallback(SendStatus msg) { // Print the current status Serial.println(msg.info()); // Do something when complete if (msg.success()) { Serial.println("----------------"); } }
شرح کد های پروژه :
در ابتدا کتابخانه ESP32 Mail Client به برنامه اضافه می شود :
#include "ESP32_MailClient.h"
در قسمت بعد SSID ، رمز وایفای ، ایمیل های ارسال کننده و دریافت کننده وارد می شود . در جهت خوانایی بیشتر پروژه و همچنین انعطاف پذیری برنامه غالبا به جاب وارد کردن مستقیم این چنین پارامتر هایی ، آن ها را به صورت رشته هایی تعریف می کنند که در صورت تغییر دادن آن ، تنها از طریق تغییر این رشته ها پارامتر ها را تغییر داد :
const char* ssid = "REPLACE_WITH_YOUR_SSID"; const char* password = "REPLACE_WITH_YOUR_PASSWORD"; // To send Email using Gmail use port 465 (SSL) and SMTP Server smtp.gmail.com // YOU MUST ENABLE less secure app option https://myaccount.google.com/lesssecureapps?pli=1 #define emailSenderAccount "[email protected]" #define emailSenderPassword "YOUR_EXAMPLE_EMAIL_PASSWORD" #define emailRecipient "[email protected]" #define smtpServer "smtp.gmail.com" #define smtpServerPort 465 #define emailSubject "ESP32 Test"
در خط بعد شی از کلاس SMTP ساخته می شود که می توان از طریق این شی متد های مربوط به SMTP را اجرا کرد :
SMTPData smtpData;
سپس تابع Sendcallback تعریف می شود . از این تابع برای پرینت وضعیت ارسال استفاده می شود :
void sendCallback(SendStatus info);
در تابع Setup ابتدا پیکربندی های مربوط به UART انجام می شود سپس متد ها به ترتیب کد های زیر اجرا می شوند که توضیحات هر کدام کامنت شده است :
// در خط زیر پارامتر های لازم برای اتصال به اس ام تی پی واید می شود smtpData.setLogin(smtpServer, smtpServerPort, emailSenderAccount, emailSenderPassword); // For library version 1.2.0 and later which STARTTLS protocol was supported,the STARTTLS will be // enabled automatically when port 587 was used, or enable it manually using setSTARTTLS function. //smtpData.setSTARTTLS(true); // در خط زیر ایمیل ازسال کننده را تعریف می کنیم smtpData.setSender("ESP32", emailSenderAccount); // در این خط اولویت ارسال ایمیل تعیین می شود smtpData.setPriority("High"); // موضوع ایمیل تعیین می شود smtpData.setSubject(emailSubject); // پیغام ارسال را در قالب اچ تی ام ال تنظیم می کنیم smtpData.setMessage("<div style=\"color:#2f4468;\"><h1>Hello World!</h1><p>- Sent from ESP32 board</p></div>", true); // پیغام ارسال شده را در قالب یک متن واید می کنیم //smtpData.setMessage("Hello World! - Sent from ESP32 board", false); // گیرنده ایمیل را تعیین می کنیم ، می توانید چندین گیرنده را تعیین کنید smtpData.addRecipient(emailRecipient); //smtpData.addRecipient("[email protected]"); //از تابع زیر برای نمایش وضعیت اجرای کد های بالا استفاده می شود smtpData.setSendCallback(sendCallback); //ایمیل ارسال می شود if (!MailClient.sendMail(smtpData)) Serial.println("Error sending Email, " + MailClient.smtpErrorReason()); //Clear all data from Email object to free memory smtpData.empty();
منبع : https://randomnerdtutorials.com/esp32-send-email-smtp-server-arduino-ide/