Skip to content
This repository has been archived by the owner on Jan 10, 2021. It is now read-only.

Commit

Permalink
Update and Fix IMAP errors
Browse files Browse the repository at this point in the history
  • Loading branch information
mobizt committed Jun 16, 2019
1 parent 1414f10 commit 31a3fb3
Show file tree
Hide file tree
Showing 10 changed files with 9,248 additions and 0 deletions.
1,596 changes: 1,596 additions & 0 deletions README.md

Large diffs are not rendered by default.

275 changes: 275 additions & 0 deletions examples/Receive_email/Receive_email.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,275 @@
/*
* Created by K. Suwatchai (Mobizt)
*
* Email: k_suwatchai@hotmail.com
*
* Github: https://github.com/mobizt
*
* Copyright (c) 2019 mobizt
*
*/


//Required HTTPClientESP32Ex library, can be installed from https : //github.com/mobizt/HTTPClientESP32Ex

//To use send Email for Gmail, less secure app option should be enabled. https://myaccount.google.com/lesssecureapps?pli=1

//To receive Email for Gmail, IMAP option should be enabled. https://support.google.com/mail/answer/7126229?hl=en

/*
===========================================================================================================================
To prevent stack overrun in case of you want to download email attachments in IMAP readMail,
increase the stack size in app_main() in esp32 main.cpp will help by change the stack size from 8192 to any more value
as following
xTaskCreatePinnedToCore(loopTask, "loopTask", 8192, NULL, 1, &loopTaskHandle, ARDUINO_RUNNING_CORE);
to
xTaskCreatePinnedToCore(loopTask, "loopTask", 16384, NULL, 1, &loopTaskHandle, ARDUINO_RUNNING_CORE);
For Arduino, file esp32's main.cpp is at C:\Users\USER_NAME\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.1\cores\esp32\main.cpp
And for platformIO, that file is at C:\Users\USER_NAME\.platformio\packages\framework-arduinoespressif32\cores\esp32\main.cpp
===========================================================================================================================
*/

#include <Arduino.h>
#include "ESP32_MailClient.h"
#include "SD.h"

#define WIFI_SSID "YOUR_WIFI_SSID"
#define WIFI_PASSWORD "YOUR_WIFI_PASSWORD"

//WiFi or HTTP client for internet connection
HTTPClientESP32Ex http;

//The Email Reading data object contains config and data that received
IMAPData imapData;

//Callback function to get the Email reading status
void readCallback(ReadStatus info);

//List all files in SD card
void printDirectory(File &dir, int depth);

void readEmail();

unsigned long lastTime = 0;

void setup()
{

Serial.begin(115200);
Serial.println();

Serial.print("Connecting to AP");

WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(200);
}

Serial.println("");
Serial.println("WiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());

Serial.println();

MailClient.sdBegin();
//MailClient.sdBegin(14,2,15,13); //SCK, MISO, MOSI,SS for TTGO T8 v1.7 or 1.8

File dir = SD.open("/");

printDirectory(dir, 0);

Serial.println();

imapData.setLogin("imap.gmail.com", 993, "YOUR_EMAIL_ACCOUNT@gmail.com", "YOUR_EMAIL_PASSWORD");
imapData.setFolder("INBOX");

//Clear fetch UID
//If fetch UID was set, no search is perform.
imapData.setFechUID("");

//imapData.setSearchCriteria("SINCE 10-Feb-2019");
//imapData.setSearchCriteria("UID 700:*");
imapData.setSearchCriteria("UID SEARCH ALL");

//To fetch or read one message UID = 320
//imapData.setFechUID("320");

//Set SD folder to save download messages and attachments
imapData.setSaveFilePath("/email_data");

//Save attachament
imapData.setDownloadAttachment(true);

//Set fetch/search result to return html message
imapData.setHTMLMessage(true);

//Set fetch/search result to return text message
imapData.setTextMessage(true);

//Set to save html message in SD card with decoded content.
imapData.saveHTMLMessage(true, true);

//Set to save text message in SD card with decoded content.
imapData.saveTextMessage(true, true);

//Set the maximum result when search criteria was set.
imapData.setSearchLimit(10);

//Set the sort order of returning message upon most recent received email.
imapData.setRecentSort(true);

//Set the return tex/html message size in byte.
imapData.setMessageBufferSize(200);

//Set the maximum attachment size 5 MB (each file)
imapData.setAttachmentSizeLimit(1024 * 1024 * 5);

//Set the Email receive callback function.
imapData.setReadCallback(readCallback);

//Set to get attachment downloading progress status.
imapData.setDownloadReport(true);

MailClient.readMail(http, imapData);
}

void readEmail()
{

Serial.println();
Serial.println("Read Email...");

imapData.setFechUID("10");
imapData.setSearchCriteria("");
MailClient.readMail(http, imapData);

imapData.setFechUID("11");
imapData.setSearchCriteria("");
MailClient.readMail(http, imapData);

imapData.setFechUID("12");
imapData.setSearchCriteria("");
MailClient.readMail(http, imapData);
}

void loop()
{

if (millis() - lastTime > 1000 * 60 * 3)
{

lastTime = millis();
Serial.println(ESP.getFreeHeap());

readEmail();
}
}

//Callback function to get the Email reading status
void readCallback(ReadStatus msg)
{
//Print the current status
Serial.println("INFO: " + msg.info());

if (msg.status() != "")
Serial.println("STATUS: " + msg.status());

//Show the result when reading finished
if (msg.success())
{

for (int i = 0; i < imapData.availableMessages(); i++)
{
Serial.println("=================");

//Search result number which varied upon search crieria
Serial.println("Messsage Number: " + imapData.getNumber(i));

//UID only available when assigned UID keyword in setSearchCriteria
//e.g. imapData.setSearchCriteria("UID SEARCH ALL");
Serial.println("Messsage UID: " + imapData.getUID(i));
Serial.println("Messsage ID: " + imapData.getMessageID(i));
Serial.println("Accept Language: " + imapData.getAcceptLanguage(i));
Serial.println("Content Language: " + imapData.getContentLanguage(i));
Serial.println("From: " + imapData.getFrom(i));
Serial.println("From Charset: " + imapData.getFromCharset(i));
Serial.println("To: " + imapData.getTo(i));
Serial.println("To Charset: " + imapData.getToCharset(i));
Serial.println("CC: " + imapData.getCC(i));
Serial.println("CC Charset: " + imapData.getCCCharset(i));
Serial.println("Date: " + imapData.getDate(i));
Serial.println("Subject: " + imapData.getSubject(i));
Serial.println("Subject Charset: " + imapData.getSubjectCharset(i));

//If setHeaderOnly to false;
if (!imapData.isHeaderOnly())
{
Serial.println("Text Message: " + imapData.getTextMessage(i));
Serial.println("Text Message Charset: " + imapData.getTextMessgaeCharset(i));
Serial.println("HTML Message: " + imapData.getHTMLMessage(i));
Serial.println("HTML Message Charset: " + imapData.getHTMLMessgaeCharset(i));
if (imapData.isFetchMessageFailed(i))
Serial.println("Fetch Error: " + imapData.getFetchMessageFailedReason(i));

if (imapData.isDownloadMessageFailed(i))
Serial.println("Save Content Error: " + imapData.getDownloadMessageFailedReason(i));

if (imapData.getAttachmentCount(i) > 0)
{

Serial.println("**************");
Serial.println("Attachment: " + String(imapData.getAttachmentCount(i)) + " file(s)");

for (int j = 0; j < imapData.getAttachmentCount(i); j++)
{
Serial.println("File Index: " + String(j + 1));
Serial.println("Filename: " + imapData.getAttachmentFileName(i, j));
Serial.println("Name: " + imapData.getAttachmentName(i, j));
Serial.println("Size: " + String(imapData.getAttachmentFileSize(i, j)));
Serial.println("Type: " + imapData.getAttachmentType(i, j));
Serial.println("Creation Date: " + imapData.getAttachmentCreationDate(i, j));
if (imapData.isDownloadAttachmentFailed(i, j))
Serial.println("Download Attachment Error: " + imapData.getDownloadAttachmentFailedReason(i, j));
}
}
}

Serial.println();
}
}
}

//List all files in SD card
void printDirectory(File &dir, int depth)
{
while (true)
{
File entry = dir.openNextFile();
if (!entry)
break;

for (uint8_t i = 0; i < depth; i++)
Serial.print("| ");

std::string name = entry.name();
if (entry.isDirectory())
{
Serial.print("+----" + String(name.substr(name.find_last_of("/\\") + 1).c_str()) + "\r\n");
printDirectory(entry, depth + 1);
}
else
{
Serial.print("+--" + String(name.substr(name.find_last_of("/\\") + 1).c_str()));
Serial.print("\t\t\t(");
Serial.print(entry.size(), DEC);
Serial.println(")");
}
entry.close();
}
}
Loading

0 comments on commit 31a3fb3

Please sign in to comment.