در این آموزش به نحوه ارسال ایمیل از طریق یک سرور 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 : (name@gmail.com نام کاربری شما ( به طور
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 "EXAMPLE_EMAIL@gmail.com" //در این قسمت ایمیل خود را وارد کنید
#define emailSenderPassword "YOUR_EXAMPLE_EMAIL_PASSWORD"// در این قسمت رمز وایفای خود را وارد کنید
#define emailRecipient "YOUR_EMAIL_RECIPIENT@EXAMPLE.com"//در اینجا نیز ایمیل خود را به عنوان دریافت کننده تعریف کنید
#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("YOUR_OTHER_RECIPIENT_EMAIL_ADDRESS@EXAMPLE.com");
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 "EXAMPLE_EMAIL@gmail.com" #define emailSenderPassword "YOUR_EXAMPLE_EMAIL_PASSWORD" #define emailRecipient "YOUR_EMAIL_RECIPIENT@EXAMPLE.com" #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("YOUR_OTHER_RECIPIENT_EMAIL_ADDRESS@EXAMPLE.com");
//از تابع زیر برای نمایش وضعیت اجرای کد های بالا استفاده می شود
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/



