feat: IMAP sync incremental + Account Setup Wizard + robust FETCH parser

- ImapSynchronizer::syncFolder(): detecta eliminados (UIDs locales no en servidor), fetch nuevos (sinceUid), actualiza flags (FLAGS batch)
- fetchAllUids(): SELECT + SEARCH ALL para lista completa UIDs servidor
- parseAndUpdateFlags(): FETCH FLAGS en lotes 100, update DB si cambió read/flagged
- AccountSetupDialog: integra ConnectionWizard para IMAP/POP3 con test de conexión real
- IMAP FETCH parser robusto: logging respuesta servidor + fallback UID-by-UID
- Fix: FETCH failed logging muestra first/last UID + respuesta truncada
This commit is contained in:
2026-08-17 15:34:49 +02:00
parent 364624aada
commit a004bdd60f
94 changed files with 19408 additions and 1047 deletions
+19 -13
View File
@@ -1,6 +1,9 @@
#include "emailmanager.h"
#include <QDebug>
#include <QFile>
#include <QStandardPaths>
#include "db/dao/mailitemdao.h"
#include "services/mimestorage.h"
EmailManager::EmailManager(QObject *parent)
: QObject(parent)
@@ -9,29 +12,33 @@ EmailManager::EmailManager(QObject *parent)
MailItem EmailManager::getMailItemById(qint64 id) const
{
Q_UNUSED(id);
qDebug() << "[EmailManager] getMailItemById (stub)";
return MailItem();
const auto item = MailItemDao::findById(id);
return item.value_or(MailItem());
}
QString EmailManager::getStorageDirectory() const
{
qDebug() << "[EmailManager] getStorageDirectory (stub)";
return QString();
return QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + QStringLiteral("/mails");
}
QString EmailManager::getEmailHtmlById(qint64 id) const
{
Q_UNUSED(id);
qDebug() << "[EmailManager] getEmailHtmlById (stub)";
return QString("<html><body><p>GMime not available</p></body></html>");
const auto item = MailItemDao::findById(id);
if (!item) return QString();
if (!item->bodyHtml().isEmpty()) return item->bodyHtml();
if (item->fileId().isEmpty()) return QString();
MimeStorageService storage;
ParsedMimeMessage parsed;
return storage.parseMessage(storage.readEmlFile(item->fileId()), parsed) ? parsed.bodyHtml : QString();
}
QString EmailManager::convertEmlToHtml(const QString& emlFilePath) const
{
Q_UNUSED(emlFilePath);
qDebug() << "[EmailManager] convertEmlToHtml (stub)";
return QString();
QFile file(emlFilePath);
if (!file.open(QIODevice::ReadOnly)) return QString();
MimeStorageService storage;
ParsedMimeMessage parsed;
return storage.parseMessage(file.readAll(), parsed) ? parsed.bodyHtml : QString();
}
bool EmailManager::sendEmail(const QString& to, const QString& subject, const QString& body)
@@ -39,8 +46,7 @@ bool EmailManager::sendEmail(const QString& to, const QString& subject, const QS
Q_UNUSED(to);
Q_UNUSED(subject);
Q_UNUSED(body);
qDebug() << "[EmailManager] sendEmail (stub)";
return false;
}
#include "emailmanager.moc"
#include "emailmanager.moc"