fixes from GEMU2015

This commit is contained in:
Jason2866 2021-06-03 16:17:41 +02:00
parent 96ce74bdd8
commit dba5cf2902
3 changed files with 84 additions and 66 deletions

View File

@ -1,30 +1,30 @@
/** /**
* Mail Client Arduino Library for Espressif's ESP32 and ESP8266 * Mail Client Arduino Library for Espressif's ESP32 and ESP8266
* *
* Version: 1.2.0 * Version: 1.2.0
* Released: May 17, 2021 * Released: May 17, 2021
* *
* Updates: * Updates:
* - Add support ESP8266 Core SDK v3.x.x. * - Add support ESP8266 Core SDK v3.x.x.
* *
* *
* This library allows Espressif's ESP32 and ESP8266 devices to send and read Email * This library allows Espressif's ESP32 and ESP8266 devices to send and read Email
* through the SMTP and IMAP servers. * through the SMTP and IMAP servers.
* *
* The MIT License (MIT) * The MIT License (MIT)
* Copyright (c) 2021 K. Suwatchai (Mobizt) * Copyright (c) 2021 K. Suwatchai (Mobizt)
* *
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of * Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in * this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to * the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so, * the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions: * subject to the following conditions:
* *
* The above copyright notice and this permission notice shall be included in all * The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software. * copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
@ -2746,20 +2746,16 @@ bool ESP_Mail_Client::sendAttachments(SMTPSession *smtp, SMTP_Message *msg, cons
else else
{ {
if (att->file.storage_type == esp_mail_file_storage_type_univ) {
} else {
if (!_sdOk && att->file.storage_type == esp_mail_file_storage_type_sd) if (!_sdOk && att->file.storage_type == esp_mail_file_storage_type_sd)
_sdOk = sdTest(); _sdOk = sdTest();
if (!_flashOk && att->file.storage_type == esp_mail_file_storage_type_flash) { if (!_flashOk && att->file.storage_type == esp_mail_file_storage_type_flash)
#if defined(ESP32) #if defined(ESP32)
//_flashOk = ESP_MAIL_FLASH_FS.begin(FORMAT_FLASH); _flashOk = ESP_MAIL_FLASH_FS.begin(FORMAT_FLASH);
#elif defined(ESP8266) #elif defined(ESP8266)
//_flashOk = ESP_MAIL_FLASH_FS.begin(); _flashOk = ESP_MAIL_FLASH_FS.begin();
#endif #endif
}
if ((!_sdOk && att->file.storage_type == esp_mail_file_storage_type_sd) || (!_flashOk && att->file.storage_type == esp_mail_file_storage_type_flash)) if ((!_sdOk && att->file.storage_type == esp_mail_file_storage_type_sd) || (!_flashOk && att->file.storage_type == esp_mail_file_storage_type_flash))
{ {
@ -2812,13 +2808,12 @@ bool ESP_Mail_Client::openFileRead(SMTPSession *smtp, SMTP_Message *msg, SMTP_At
if (att->file.storage_type == esp_mail_file_storage_type_sd) { if (att->file.storage_type == esp_mail_file_storage_type_sd) {
file_existed = ESP_MAIL_SD_FS.exists(filepath.c_str()); file_existed = ESP_MAIL_SD_FS.exists(filepath.c_str());
} } else if (att->file.storage_type == esp_mail_file_storage_type_flash) {
else if (att->file.storage_type == esp_mail_file_storage_type_flash) {
}
else if (att->file.storage_type == esp_mail_file_storage_type_univ) {
file_existed = ESP_MAIL_FLASH_FS.exists(filepath.c_str()); file_existed = ESP_MAIL_FLASH_FS.exists(filepath.c_str());
} } else if (att->file.storage_type == esp_mail_file_storage_type_univ) {
} file_existed = ufsp->exists(filepath.c_str());
}
if (!file_existed) if (!file_existed)
{ {
@ -2832,12 +2827,11 @@ bool ESP_Mail_Client::openFileRead(SMTPSession *smtp, SMTP_Message *msg, SMTP_At
if (att->file.storage_type == esp_mail_file_storage_type_sd) { if (att->file.storage_type == esp_mail_file_storage_type_sd) {
file_existed = ESP_MAIL_SD_FS.exists(filepath.c_str()); file_existed = ESP_MAIL_SD_FS.exists(filepath.c_str());
} } else if (att->file.storage_type == esp_mail_file_storage_type_flash) {
else if (att->file.storage_type == esp_mail_file_storage_type_flash) {
}
else if (att->file.storage_type == esp_mail_file_storage_type_univ) {
file_existed = ESP_MAIL_FLASH_FS.exists(filepath.c_str()); file_existed = ESP_MAIL_FLASH_FS.exists(filepath.c_str());
} } else if (att->file.storage_type == esp_mail_file_storage_type_univ) {
file_existed = ufsp->exists(filepath.c_str());
}
} }
if (!file_existed) if (!file_existed)
@ -2861,17 +2855,16 @@ bool ESP_Mail_Client::openFileRead(SMTPSession *smtp, SMTP_Message *msg, SMTP_At
if (att->file.storage_type == esp_mail_file_storage_type_sd) { if (att->file.storage_type == esp_mail_file_storage_type_sd) {
file = ESP_MAIL_SD_FS.open(filepath.c_str(), FILE_READ); file = ESP_MAIL_SD_FS.open(filepath.c_str(), FILE_READ);
} } else if (att->file.storage_type == esp_mail_file_storage_type_flash) {
else if (att->file.storage_type == esp_mail_file_storage_type_flash) {
}
#if defined(ESP32) #if defined(ESP32)
//file = ESP_MAIL_FLASH_FS.open(filepath.c_str(), FILE_READ); file = ESP_MAIL_FLASH_FS.open(filepath.c_str(), FILE_READ);
#elif defined(ESP8266) #elif defined(ESP8266)
//file = ESP_MAIL_FLASH_FS.open(filepath.c_str(), "r"); file = ESP_MAIL_FLASH_FS.open(filepath.c_str(), "r");
#endif #endif
else if (att->file.storage_type == esp_mail_file_storage_type_univ) { } else if (att->file.storage_type == esp_mail_file_storage_type_univ) {
file = ufsp->open(filepath.c_str(), "r"); file = ufsp->open(filepath.c_str(), "r");
} }
if (!file) if (!file)
return false; return false;
@ -2904,10 +2897,13 @@ bool ESP_Mail_Client::openFileRead2(SMTPSession *smtp, SMTP_Message *msg, File &
filepath += path; filepath += path;
} }
if (storageType == esp_mail_file_storage_type_sd) if (storageType == esp_mail_file_storage_type_sd) {
file_existed = ESP_MAIL_SD_FS.exists(filepath.c_str()); file_existed = ESP_MAIL_SD_FS.exists(filepath.c_str());
else if (storageType == esp_mail_file_storage_type_flash) } else if (storageType == esp_mail_file_storage_type_flash) {
file_existed = ESP_MAIL_FLASH_FS.exists(filepath.c_str()); file_existed = ESP_MAIL_FLASH_FS.exists(filepath.c_str());
} else if (storageType == esp_mail_file_storage_type_univ) {
file_existed = ufsp->exists(filepath.c_str());
}
if (!file_existed) if (!file_existed)
{ {
@ -3034,18 +3030,16 @@ bool ESP_Mail_Client::sendInline(SMTPSession *smtp, SMTP_Message *msg, const std
} }
else else
{ {
if (att->file.storage_type == esp_mail_file_storage_type_univ) {
} else {
if (!_sdOk && att->file.storage_type == esp_mail_file_storage_type_sd) if (!_sdOk && att->file.storage_type == esp_mail_file_storage_type_sd)
_sdOk = sdTest(); _sdOk = sdTest();
if (!_flashOk && att->file.storage_type == esp_mail_file_storage_type_flash) { if (!_flashOk && att->file.storage_type == esp_mail_file_storage_type_flash)
#if defined(ESP32) #if defined(ESP32)
//_flashOk = ESP_MAIL_FLASH_FS.begin(FORMAT_FLASH); _flashOk = ESP_MAIL_FLASH_FS.begin(FORMAT_FLASH);
#elif defined(ESP8266) #elif defined(ESP8266)
//_flashOk = ESP_MAIL_FLASH_FS.begin(); _flashOk = ESP_MAIL_FLASH_FS.begin();
#endif #endif
}
if ((!_sdOk && att->file.storage_type == esp_mail_file_storage_type_sd) || (!_flashOk && att->file.storage_type == esp_mail_file_storage_type_flash)) if ((!_sdOk && att->file.storage_type == esp_mail_file_storage_type_sd) || (!_flashOk && att->file.storage_type == esp_mail_file_storage_type_flash))
{ {
@ -3934,14 +3928,14 @@ void ESP_Mail_Client::splitTk(std::string &str, std::vector<std::string> &tk, co
std::string().swap(s); std::string().swap(s);
} }
/** Add the soft line break to the long text line (rfc 3676) /** Add the soft line break to the long text line (rfc 3676)
* and add Format=flowed parameter in the plain text content-type header. * and add Format=flowed parameter in the plain text content-type header.
* We use the existing white space as a part of this soft line break * We use the existing white space as a part of this soft line break
* and set delSp="no" parameter to the header. * and set delSp="no" parameter to the header.
* *
* Some servers are not rfc 3676 compliant. * Some servers are not rfc 3676 compliant.
* This causes the text lines are wrapped instead of joined. * This causes the text lines are wrapped instead of joined.
* *
* Some mail clients trim the space before the line break * Some mail clients trim the space before the line break
* which makes the soft line break cannot be seen. * which makes the soft line break cannot be seen.
*/ */
@ -6072,14 +6066,17 @@ void ESP_Mail_Client::saveHeader(IMAPSession *imap)
if (file) if (file)
file.close(); file.close();
if (imap->_storageType == esp_mail_file_storage_type_sd) if (imap->_storageType == esp_mail_file_storage_type_sd) {
file = ESP_MAIL_SD_FS.open(headerFilePath.c_str(), FILE_WRITE); file = ESP_MAIL_SD_FS.open(headerFilePath.c_str(), FILE_WRITE);
else if (imap->_storageType == esp_mail_file_storage_type_flash) } else if (imap->_storageType == esp_mail_file_storage_type_flash) {
#if defined(ESP32) #if defined(ESP32)
file = ESP_MAIL_FLASH_FS.open(headerFilePath.c_str(), FILE_WRITE); file = ESP_MAIL_FLASH_FS.open(headerFilePath.c_str(), FILE_WRITE);
#elif defined(ESP8266) #elif defined(ESP8266)
file = ESP_MAIL_FLASH_FS.open(headerFilePath.c_str(), "w"); file = ESP_MAIL_FLASH_FS.open(headerFilePath.c_str(), "w");
#endif #endif
} else if (imap->_storageType == esp_mail_file_storage_type_univ) {
file = ufsp->open(headerFilePath.c_str(), "w");
}
if (file) if (file)
{ {
@ -7613,9 +7610,9 @@ bool IMAPSession::closeSession()
if (!_tcpConnected) if (!_tcpConnected)
return false; return false;
#if defined(ESP32) #if defined(ESP32)
/** /**
* The strange behavior in ESP8266 SSL client, BearSSLWiFiClientSecure * The strange behavior in ESP8266 SSL client, BearSSLWiFiClientSecure
* The client disposed without memory released after the server close * The client disposed without memory released after the server close
* the connection due to LOGOUT command, which caused the memory leaks. * the connection due to LOGOUT command, which caused the memory leaks.
*/ */
if (!MailClient.imapLogout(this)) if (!MailClient.imapLogout(this))
@ -8454,9 +8451,9 @@ bool SMTPSession::closeSession()
/* Sign out */ /* Sign out */
#if defined(ESP32) #if defined(ESP32)
/** /**
* The strange behavior in ESP8266 SSL client, BearSSLWiFiClientSecure * The strange behavior in ESP8266 SSL client, BearSSLWiFiClientSecure
* The client disposed without memory released after the server close * The client disposed without memory released after the server close
* the connection due to QUIT command, which caused the memory leaks. * the connection due to QUIT command, which caused the memory leaks.
*/ */
MailClient.smtpSendP(this, esp_mail_str_7, true); MailClient.smtpSendP(this, esp_mail_str_7, true);

View File

@ -2789,10 +2789,18 @@ private:
#endif #endif
}; };
//#define EMAIL_DEBUG_PRINTLN Serial.println
//#define EMAIL_DEBUG_PRINT Serial.print
#define EMAIL_DEBUG_PRINTLN Tasmota_print
#define EMAIL_DEBUG_PRINT Tasmota_print
extern void Tasmota_print(const char *);
static void __attribute__((used)) esp_mail_debug(const char *msg) static void __attribute__((used)) esp_mail_debug(const char *msg)
{ {
delay(0); delay(0);
Serial.println(msg); EMAIL_DEBUG_PRINTLN(msg);
} }
static void __attribute__((used)) static void __attribute__((used))
@ -2800,11 +2808,13 @@ esp_mail_debug_line(const char *msg, bool newline)
{ {
delay(0); delay(0);
if (newline) if (newline)
Serial.println(msg); EMAIL_DEBUG_PRINTLN(msg);
else else
Serial.print(msg); EMAIL_DEBUG_PRINT(msg);
} }
extern ESP_Mail_Client MailClient; extern ESP_Mail_Client MailClient;
extern FS *ufsp;
#endif // ESP_Mail_Client_H #endif // ESP_Mail_Client_H

View File

@ -3,19 +3,11 @@
#include <ESP_Mail_Client.h> #include <ESP_Mail_Client.h>
#ifdef ESP8266
#ifndef SEND_MAIL32_MINRAM #ifndef SEND_MAIL32_MINRAM
#undef SEND_MAIL32_MINRAM #undef SEND_MAIL32_MINRAM
#define SEND_MAIL32_MINRAM 13*1024 #define SEND_MAIL32_MINRAM 70*1024
#endif #endif
#endif // ESP8266
#ifdef ESP32
#ifndef SEND_MAIL32_MINRAM
#undef SEND_MAIL32_MINRAM
#define SEND_MAIL32_MINRAM 30*1024
#endif
#endif // ESP32
#define xPSTR(a) a #define xPSTR(a) a
#define MAX_ATTCHMENTS 8 #define MAX_ATTCHMENTS 8
@ -41,7 +33,7 @@ uint16_t SendMail(char *buffer) {
const char *to; const char *to;
const char *subject; const char *subject;
const char *cmd; const char *cmd;
uint16_t status = 0; uint16_t status = 1;
uint16_t blen; uint16_t blen;
char *endcmd; char *endcmd;
ESP_Mail_Session session; ESP_Mail_Session session;
@ -173,8 +165,12 @@ uint16_t SendMail(char *buffer) {
#endif #endif
//smtp->debug(true); #ifdef DEBUG_EMAIL_PORT
smtp->debug(true);
#else
smtp->debug(false); smtp->debug(false);
#endif
// smtp->callback(smtpCallback); // smtp->callback(smtpCallback);
message.clearRecipients(); message.clearRecipients();
@ -219,14 +215,17 @@ uint16_t SendMail(char *buffer) {
/* Connect to server with the session config */ /* Connect to server with the session config */
delay(0); delay(0);
if (!smtp->connect(&session)) if (!smtp->connect(&session)) {
goto exit; goto exit;
}
/* Start sending the Email and close the session */ /* Start sending the Email and close the session */
delay(0); delay(0);
if (!MailClient.sendMail(smtp, &message, true)) { if (!MailClient.sendMail(smtp, &message, true)) {
Serial.println("Error sending Email, " + smtp->errorReason()); Serial.println("Error sending Email, " + smtp->errorReason());
} else {
status = 0;
} }
exit: exit:
@ -372,4 +371,16 @@ if (status.success())
} }
} }
void Tasmota_print(const char *txt) {
#ifdef DEBUG_EMAIL_PORT
AddLog(LOG_LEVEL_INFO, PSTR("ESP32mail: %s"),txt);
#endif
}
#endif // USE_ESP32MAIL #endif // USE_ESP32MAIL