در این آموزش به نحوه ارسال ایمیل از طریق یک سرور 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/

Tags:
About Author: USER_4