summaryrefslogtreecommitdiff
path: root/noncore/net/mail
Side-by-side diff
Diffstat (limited to 'noncore/net/mail') (more/less context) (show whitespace changes)
-rw-r--r--noncore/net/mail/accountview.cpp2
-rw-r--r--noncore/net/mail/imapwrapper.cpp298
-rw-r--r--noncore/net/mail/imapwrapper.h14
-rw-r--r--noncore/net/mail/libmailwrapper/imapwrapper.cpp298
-rw-r--r--noncore/net/mail/libmailwrapper/imapwrapper.h14
-rw-r--r--noncore/net/mail/libmailwrapper/mailwrapper.cpp2
-rw-r--r--noncore/net/mail/libmailwrapper/mailwrapper.h17
-rw-r--r--noncore/net/mail/mailwrapper.cpp2
-rw-r--r--noncore/net/mail/mailwrapper.h17
9 files changed, 423 insertions, 241 deletions
diff --git a/noncore/net/mail/accountview.cpp b/noncore/net/mail/accountview.cpp
index a531976..1bde886 100644
--- a/noncore/net/mail/accountview.cpp
+++ b/noncore/net/mail/accountview.cpp
@@ -63,3 +63,3 @@ QString IMAPfolderItem::fetchBody(const RecMail&aMail)
{
- return imap->getWrapper()->fetchBody(folder->getName(),aMail);
+ return imap->getWrapper()->fetchBody(aMail);
}
diff --git a/noncore/net/mail/imapwrapper.cpp b/noncore/net/mail/imapwrapper.cpp
index 7b78499..1acc036 100644
--- a/noncore/net/mail/imapwrapper.cpp
+++ b/noncore/net/mail/imapwrapper.cpp
@@ -4,3 +4,3 @@
#include "imapwrapper.h"
-
+#include <libetpan/mailimap.h>
@@ -9,5 +9,11 @@ IMAPwrapper::IMAPwrapper( IMAPaccount *a )
account = a;
+ m_imap = 0;
}
-void imap_progress( size_t current, size_t maximum )
+IMAPwrapper::~IMAPwrapper()
+{
+ logout();
+}
+
+void IMAPwrapper::imap_progress( size_t current, size_t maximum )
{
@@ -16,14 +22,9 @@ void imap_progress( size_t current, size_t maximum )
-void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
+void IMAPwrapper::login()
{
- const char *server, *user, *pass, *mb;
+ logout();
+ const char *server, *user, *pass;
uint16_t port;
int err = MAILIMAP_NO_ERROR;
- clist *result;
- clistcell *current;
- mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate;
- mailimap_fetch_type *fetchType;
- mailimap_set *set;
- mb = mailbox.latin1();
server = account->getServer().latin1();
@@ -33,10 +34,5 @@ void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
- mailimap *imap = mailimap_new( 20, &imap_progress );
- if ( imap == NULL ) {
- qDebug("IMAP Memory error");
- return;
- }
-
+ m_imap = mailimap_new( 20, &imap_progress );
/* connect */
- err = mailimap_socket_connect( imap, (char*)server, port );
+ err = mailimap_socket_connect( m_imap, (char*)server, port );
if ( err != MAILIMAP_NO_ERROR &&
@@ -44,4 +40,5 @@ void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) {
- qDebug("error connecting server: %s",imap->response);
- mailimap_free( imap );
+ qDebug("error connecting server: %s",m_imap->response);
+ mailimap_free( m_imap );
+ m_imap = 0;
return;
@@ -50,17 +47,41 @@ void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
/* login */
- err = mailimap_login_simple( imap, (char*)user, (char*)pass );
+ err = mailimap_login_simple( m_imap, (char*)user, (char*)pass );
if ( err != MAILIMAP_NO_ERROR ) {
- qDebug("error logging in imap: %s",imap->response);
- err = mailimap_close( imap );
- mailimap_free( imap );
- return;
+ qDebug("error logging in imap: %s",m_imap->response);
+ err = mailimap_close( m_imap );
+ mailimap_free( m_imap );
+ m_imap = 0;
+ }
}
+void IMAPwrapper::logout()
+{
+ int err = MAILIMAP_NO_ERROR;
+ if (!m_imap) return;
+ err = mailimap_logout( m_imap );
+ err = mailimap_close( m_imap );
+ mailimap_free( m_imap );
+ m_imap = 0;
+}
+
+void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
+{
+ const char *mb;
+ int err = MAILIMAP_NO_ERROR;
+ clist *result;
+ clistcell *current;
+ mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate;
+ mailimap_fetch_type *fetchType;
+ mailimap_set *set;
+
+ mb = mailbox.latin1();
+ login();
+ if (!m_imap) {
+ return;
+ }
/* select mailbox READONLY for operations */
- err = mailimap_examine( imap, (char*)mb);
+ err = mailimap_examine( m_imap, (char*)mb);
if ( err != MAILIMAP_NO_ERROR ) {
- qDebug("error selecting mailbox: %s",imap->response);
- err = mailimap_logout( imap );
- err = mailimap_close( imap );
- mailimap_free( imap );
+ qDebug("error selecting mailbox: %s",m_imap->response);
+ logout();
return;
@@ -68,8 +89,7 @@ void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
- int last = imap->selection_info->exists;
+ int last = m_imap->selection_info->exists;
+
if (last == 0) {
qDebug("mailbox has no mails");
- err = mailimap_logout( imap );
- err = mailimap_close( imap );
- mailimap_free( imap );
+ logout();
return;
@@ -77,3 +97,2 @@ void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
-
result = clist_new();
@@ -91,3 +110,3 @@ void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
- err = mailimap_fetch( imap, set, fetchType, &result );
+ err = mailimap_fetch( m_imap, set, fetchType, &result );
mailimap_set_free( set );
@@ -108,2 +127,3 @@ void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
m->setNumber(i);
+ m->setMbox(mailbox);
target.append(m);
@@ -113,9 +133,6 @@ void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
} else {
- qDebug("Error fetching headers: %s",imap->response);
+ qDebug("Error fetching headers: %s",m_imap->response);
}
-
- err = mailimap_logout( imap );
- err = mailimap_close( imap );
+ logout();
clist_free(result);
- mailimap_free( imap );
}
@@ -124,4 +141,3 @@ QList<IMAPFolder>* IMAPwrapper::listFolders()
{
- const char *server, *user, *pass, *path, *mask;
- uint16_t port;
+ const char *path, *mask;
int err = MAILIMAP_NO_ERROR;
@@ -132,21 +148,4 @@ QList<IMAPFolder>* IMAPwrapper::listFolders()
folders->setAutoDelete( true );
-
- server = account->getServer().latin1();
- port = account->getPort().toUInt();
- user = account->getUser().latin1();
- pass = account->getPassword().latin1();
- path = account->getPrefix().latin1();
-
- mailimap *imap = mailimap_new( 20, &imap_progress );
- if ( imap == NULL ) {
- qDebug("error mailimap_new");
- return folders;
- }
-
- err = mailimap_socket_connect( imap, (char*)server, port );
- if ( err != MAILIMAP_NO_ERROR &&
- err != MAILIMAP_NO_ERROR_AUTHENTICATED &&
- err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) {
- mailimap_free(imap);
- qDebug("error imap_socket_connect: %s",imap->response);
+ login();
+ if (!m_imap) {
return folders;
@@ -154,8 +153,2 @@ QList<IMAPFolder>* IMAPwrapper::listFolders()
- err = mailimap_login_simple( imap, (char*)user, (char*)pass );
- if ( err != MAILIMAP_NO_ERROR ) {
- mailimap_free(imap);
- qDebug("error logging in: %s",imap->response);
- return folders;
- }
/*
@@ -169,3 +162,3 @@ QList<IMAPFolder>* IMAPwrapper::listFolders()
mailimap_mailbox_list *list;
- err = mailimap_list( imap, (char*)"", (char*)mask, &result );
+ err = mailimap_list( m_imap, (char*)"", (char*)mask, &result );
if ( err == MAILIMAP_NO_ERROR ) {
@@ -181,3 +174,3 @@ QList<IMAPFolder>* IMAPwrapper::listFolders()
} else {
- qDebug("error fetching folders: %s",imap->response);
+ qDebug("error fetching folders: %s",m_imap->response);
}
@@ -189,4 +182,6 @@ QList<IMAPFolder>* IMAPwrapper::listFolders()
mask = "*" ;
+ path = account->getPrefix().latin1();
result = clist_new();
- err = mailimap_list( imap, (char*)path, (char*)mask, &result );
+ qDebug(path);
+ err = mailimap_list( m_imap, (char*)path, (char*)mask, &result );
if ( err == MAILIMAP_NO_ERROR ) {
@@ -205,8 +200,5 @@ QList<IMAPFolder>* IMAPwrapper::listFolders()
} else {
- qDebug("error fetching folders");
+ qDebug("error fetching folders %s",m_imap->response);
}
mailimap_list_result_free( result );
- err = mailimap_logout( imap );
- err = mailimap_close( imap );
- mailimap_free( imap );
return folders;
@@ -275,3 +267,2 @@ RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
}
-
cf = cf->next;
@@ -339,7 +330,7 @@ RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
-QString IMAPwrapper::fetchBody(const QString & mailbox,const RecMail&mail)
+#if 1
+QString IMAPwrapper::fetchBody(const RecMail&mail)
{
QString body = "";
- const char *server, *user, *pass, *mb;
- uint16_t port;
+ const char *mb;
int err = MAILIMAP_NO_ERROR;
@@ -351,30 +342,38 @@ QString IMAPwrapper::fetchBody(const QString & mailbox,const RecMail&mail)
- mb = mailbox.latin1();
- server = account->getServer().latin1();
- port = account->getPort().toUInt();
- user = account->getUser().latin1();
- pass = account->getPassword().latin1();
+ mb = mail.getMbox().latin1();
- mailimap *imap = mailimap_new( 20, &imap_progress );
- if ( imap == NULL ) {
- qDebug("IMAP Memory error");
+ login();
+ if (!m_imap) {
return body;
}
-
- /* connect */
- err = mailimap_socket_connect( imap, (char*)server, port );
- if ( err != MAILIMAP_NO_ERROR &&
- err != MAILIMAP_NO_ERROR_AUTHENTICATED &&
- err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) {
- qDebug("error connecting server: %s",imap->response);
- mailimap_free( imap );
+ /* select mailbox READONLY for operations */
+ err = mailimap_examine( m_imap, (char*)mb);
+ if ( err != MAILIMAP_NO_ERROR ) {
+ qDebug("error selecting mailbox: %s",m_imap->response);
+ logout();
return body;
}
+ result = clist_new();
+ /* the range has to start at 1!!! not with 0!!!! */
+ set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
+ fetchAtt = mailimap_fetch_att_new_rfc822_text();
+ fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
+ err = mailimap_fetch( m_imap, set, fetchType, &result );
+ mailimap_set_free( set );
+ mailimap_fetch_type_free( fetchType );
+
+ if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
+ mailimap_msg_att * msg_att;
+ msg_att = (mailimap_msg_att*)current->data;
+ mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->list->first->data;
+
+ if (item->msg_att_static && item->msg_att_static->rfc822_text) {
+ body = item->msg_att_static->rfc822_text;
+ }
+ } else {
+ qDebug("error fetching text: %s",m_imap->response);
+ }
- /* login */
- err = mailimap_login_simple( imap, (char*)user, (char*)pass );
- if ( err != MAILIMAP_NO_ERROR ) {
- qDebug("error logging in imap: %s",imap->response);
- err = mailimap_close( imap );
- mailimap_free( imap );
+ clist_free(result);
+ logout();
return body;
@@ -382,9 +381,26 @@ QString IMAPwrapper::fetchBody(const QString & mailbox,const RecMail&mail)
+#else
+QString IMAPwrapper::fetchBody(const RecMail&mail)
+{
+ QString body = "";
+ const char *mb;
+ int err = MAILIMAP_NO_ERROR;
+ clist *result;
+ clistcell *current;
+ mailimap_fetch_att *fetchAtt;
+ mailimap_fetch_type *fetchType;
+ mailimap_set *set;
+ mailimap_body*body_desc;
+
+ mb = mail.getMbox().latin1();
+
+ login();
+ if (!m_imap) {
+ return body;
+ }
/* select mailbox READONLY for operations */
- err = mailimap_examine( imap, (char*)mb);
+ err = mailimap_examine( m_imap, (char*)mb);
if ( err != MAILIMAP_NO_ERROR ) {
- qDebug("error selecting mailbox: %s",imap->response);
- err = mailimap_logout( imap );
- err = mailimap_close( imap );
- mailimap_free( imap );
+ qDebug("error selecting mailbox: %s",m_imap->response);
+ logout();
return body;
@@ -394,5 +410,5 @@ QString IMAPwrapper::fetchBody(const QString & mailbox,const RecMail&mail)
set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
- fetchAtt = mailimap_fetch_att_new_rfc822_text();
+ fetchAtt = mailimap_fetch_att_new_body();
fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
- err = mailimap_fetch( imap, set, fetchType, &result );
+ err = mailimap_fetch( m_imap, set, fetchType, &result );
mailimap_set_free( set );
@@ -404,17 +420,71 @@ QString IMAPwrapper::fetchBody(const QString & mailbox,const RecMail&mail)
mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->list->first->data;
-
- if (item->msg_att_static && item->msg_att_static->rfc822_text) {
- body = item->msg_att_static->rfc822_text;
+ body_desc = item->msg_att_static->body;
+ if (body_desc->type==MAILIMAP_BODY_1PART) {
+ body = searchBodyText(mail,body_desc->body_1part);
+ } else {
}
+
} else {
- qDebug("error fetching text: %s",imap->response);
+ qDebug("error fetching body: %s",m_imap->response);
}
- err = mailimap_logout( imap );
- err = mailimap_close( imap );
- mailimap_free( imap );
clist_free(result);
+ logout();
+ return body;
+}
+#endif
+QString IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription)
+{
+ QString Body="";
+ if (!mailDescription) {
+ return Body;
+ }
+ switch (mailDescription->type) {
+ case MAILIMAP_BODY_TYPE_1PART_TEXT:
+ return getPlainBody(mail);
+ break;
+ default:
+ break;
+ }
+ return Body;
+}
+
+QString IMAPwrapper::getPlainBody(const RecMail&mail)
+{
+ QString body = "";
+ const char *mb;
+ int err = MAILIMAP_NO_ERROR;
+ clist *result;
+ clistcell *current;
+ mailimap_fetch_att *fetchAtt;
+ mailimap_fetch_type *fetchType;
+ mailimap_set *set;
+
+ mb = mail.getMbox().latin1();
+
+ if (!m_imap) {
return body;
}
+ result = clist_new();
+ /* the range has to start at 1!!! not with 0!!!! */
+ set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
+ fetchAtt = mailimap_fetch_att_new_rfc822_text();
+ fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
+ err = mailimap_fetch( m_imap, set, fetchType, &result );
+ mailimap_set_free( set );
+ mailimap_fetch_type_free( fetchType );
+ if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
+ mailimap_msg_att * msg_att;
+ msg_att = (mailimap_msg_att*)current->data;
+ mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->list->first->data;
+ if (item->msg_att_static && item->msg_att_static->rfc822_text) {
+ body = item->msg_att_static->rfc822_text;
+ }
+ } else {
+ qDebug("error fetching text: %s",m_imap->response);
+ }
+ clist_free(result);
+ return body;
+}
diff --git a/noncore/net/mail/imapwrapper.h b/noncore/net/mail/imapwrapper.h
index 65c36e0..b02d26d 100644
--- a/noncore/net/mail/imapwrapper.h
+++ b/noncore/net/mail/imapwrapper.h
@@ -4,3 +4,5 @@
#include "mailwrapper.h"
-#include <libetpan/mailimap.h>
+
+struct mailimap;
+struct mailimap_body_type_1part;
@@ -12,5 +14,7 @@ public:
IMAPwrapper( IMAPaccount *a );
+ virtual ~IMAPwrapper();
QList<IMAPFolder>* listFolders();
void listMessages(const QString & mailbox,Maillist&target );
- QString fetchBody(const QString & mailbox,const RecMail&mail);
+ QString fetchBody(const RecMail&mail);
+ static void imap_progress( size_t current, size_t maximum );
@@ -18,2 +22,6 @@ protected:
RecMail*parse_list_result(mailimap_msg_att*);
+ void login();
+ void logout();
+ QString searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription);
+ QString getPlainBody(const RecMail&mail);
@@ -21,3 +29,3 @@ private:
IMAPaccount *account;
-
+ mailimap *m_imap;
};
diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.cpp b/noncore/net/mail/libmailwrapper/imapwrapper.cpp
index 7b78499..1acc036 100644
--- a/noncore/net/mail/libmailwrapper/imapwrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/imapwrapper.cpp
@@ -4,3 +4,3 @@
#include "imapwrapper.h"
-
+#include <libetpan/mailimap.h>
@@ -9,5 +9,11 @@ IMAPwrapper::IMAPwrapper( IMAPaccount *a )
account = a;
+ m_imap = 0;
}
-void imap_progress( size_t current, size_t maximum )
+IMAPwrapper::~IMAPwrapper()
+{
+ logout();
+}
+
+void IMAPwrapper::imap_progress( size_t current, size_t maximum )
{
@@ -16,14 +22,9 @@ void imap_progress( size_t current, size_t maximum )
-void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
+void IMAPwrapper::login()
{
- const char *server, *user, *pass, *mb;
+ logout();
+ const char *server, *user, *pass;
uint16_t port;
int err = MAILIMAP_NO_ERROR;
- clist *result;
- clistcell *current;
- mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate;
- mailimap_fetch_type *fetchType;
- mailimap_set *set;
- mb = mailbox.latin1();
server = account->getServer().latin1();
@@ -33,10 +34,5 @@ void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
- mailimap *imap = mailimap_new( 20, &imap_progress );
- if ( imap == NULL ) {
- qDebug("IMAP Memory error");
- return;
- }
-
+ m_imap = mailimap_new( 20, &imap_progress );
/* connect */
- err = mailimap_socket_connect( imap, (char*)server, port );
+ err = mailimap_socket_connect( m_imap, (char*)server, port );
if ( err != MAILIMAP_NO_ERROR &&
@@ -44,4 +40,5 @@ void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) {
- qDebug("error connecting server: %s",imap->response);
- mailimap_free( imap );
+ qDebug("error connecting server: %s",m_imap->response);
+ mailimap_free( m_imap );
+ m_imap = 0;
return;
@@ -50,17 +47,41 @@ void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
/* login */
- err = mailimap_login_simple( imap, (char*)user, (char*)pass );
+ err = mailimap_login_simple( m_imap, (char*)user, (char*)pass );
if ( err != MAILIMAP_NO_ERROR ) {
- qDebug("error logging in imap: %s",imap->response);
- err = mailimap_close( imap );
- mailimap_free( imap );
- return;
+ qDebug("error logging in imap: %s",m_imap->response);
+ err = mailimap_close( m_imap );
+ mailimap_free( m_imap );
+ m_imap = 0;
+ }
}
+void IMAPwrapper::logout()
+{
+ int err = MAILIMAP_NO_ERROR;
+ if (!m_imap) return;
+ err = mailimap_logout( m_imap );
+ err = mailimap_close( m_imap );
+ mailimap_free( m_imap );
+ m_imap = 0;
+}
+
+void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
+{
+ const char *mb;
+ int err = MAILIMAP_NO_ERROR;
+ clist *result;
+ clistcell *current;
+ mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate;
+ mailimap_fetch_type *fetchType;
+ mailimap_set *set;
+
+ mb = mailbox.latin1();
+ login();
+ if (!m_imap) {
+ return;
+ }
/* select mailbox READONLY for operations */
- err = mailimap_examine( imap, (char*)mb);
+ err = mailimap_examine( m_imap, (char*)mb);
if ( err != MAILIMAP_NO_ERROR ) {
- qDebug("error selecting mailbox: %s",imap->response);
- err = mailimap_logout( imap );
- err = mailimap_close( imap );
- mailimap_free( imap );
+ qDebug("error selecting mailbox: %s",m_imap->response);
+ logout();
return;
@@ -68,8 +89,7 @@ void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
- int last = imap->selection_info->exists;
+ int last = m_imap->selection_info->exists;
+
if (last == 0) {
qDebug("mailbox has no mails");
- err = mailimap_logout( imap );
- err = mailimap_close( imap );
- mailimap_free( imap );
+ logout();
return;
@@ -77,3 +97,2 @@ void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
-
result = clist_new();
@@ -91,3 +110,3 @@ void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
- err = mailimap_fetch( imap, set, fetchType, &result );
+ err = mailimap_fetch( m_imap, set, fetchType, &result );
mailimap_set_free( set );
@@ -108,2 +127,3 @@ void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
m->setNumber(i);
+ m->setMbox(mailbox);
target.append(m);
@@ -113,9 +133,6 @@ void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
} else {
- qDebug("Error fetching headers: %s",imap->response);
+ qDebug("Error fetching headers: %s",m_imap->response);
}
-
- err = mailimap_logout( imap );
- err = mailimap_close( imap );
+ logout();
clist_free(result);
- mailimap_free( imap );
}
@@ -124,4 +141,3 @@ QList<IMAPFolder>* IMAPwrapper::listFolders()
{
- const char *server, *user, *pass, *path, *mask;
- uint16_t port;
+ const char *path, *mask;
int err = MAILIMAP_NO_ERROR;
@@ -132,21 +148,4 @@ QList<IMAPFolder>* IMAPwrapper::listFolders()
folders->setAutoDelete( true );
-
- server = account->getServer().latin1();
- port = account->getPort().toUInt();
- user = account->getUser().latin1();
- pass = account->getPassword().latin1();
- path = account->getPrefix().latin1();
-
- mailimap *imap = mailimap_new( 20, &imap_progress );
- if ( imap == NULL ) {
- qDebug("error mailimap_new");
- return folders;
- }
-
- err = mailimap_socket_connect( imap, (char*)server, port );
- if ( err != MAILIMAP_NO_ERROR &&
- err != MAILIMAP_NO_ERROR_AUTHENTICATED &&
- err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) {
- mailimap_free(imap);
- qDebug("error imap_socket_connect: %s",imap->response);
+ login();
+ if (!m_imap) {
return folders;
@@ -154,8 +153,2 @@ QList<IMAPFolder>* IMAPwrapper::listFolders()
- err = mailimap_login_simple( imap, (char*)user, (char*)pass );
- if ( err != MAILIMAP_NO_ERROR ) {
- mailimap_free(imap);
- qDebug("error logging in: %s",imap->response);
- return folders;
- }
/*
@@ -169,3 +162,3 @@ QList<IMAPFolder>* IMAPwrapper::listFolders()
mailimap_mailbox_list *list;
- err = mailimap_list( imap, (char*)"", (char*)mask, &result );
+ err = mailimap_list( m_imap, (char*)"", (char*)mask, &result );
if ( err == MAILIMAP_NO_ERROR ) {
@@ -181,3 +174,3 @@ QList<IMAPFolder>* IMAPwrapper::listFolders()
} else {
- qDebug("error fetching folders: %s",imap->response);
+ qDebug("error fetching folders: %s",m_imap->response);
}
@@ -189,4 +182,6 @@ QList<IMAPFolder>* IMAPwrapper::listFolders()
mask = "*" ;
+ path = account->getPrefix().latin1();
result = clist_new();
- err = mailimap_list( imap, (char*)path, (char*)mask, &result );
+ qDebug(path);
+ err = mailimap_list( m_imap, (char*)path, (char*)mask, &result );
if ( err == MAILIMAP_NO_ERROR ) {
@@ -205,8 +200,5 @@ QList<IMAPFolder>* IMAPwrapper::listFolders()
} else {
- qDebug("error fetching folders");
+ qDebug("error fetching folders %s",m_imap->response);
}
mailimap_list_result_free( result );
- err = mailimap_logout( imap );
- err = mailimap_close( imap );
- mailimap_free( imap );
return folders;
@@ -275,3 +267,2 @@ RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
}
-
cf = cf->next;
@@ -339,7 +330,7 @@ RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
-QString IMAPwrapper::fetchBody(const QString & mailbox,const RecMail&mail)
+#if 1
+QString IMAPwrapper::fetchBody(const RecMail&mail)
{
QString body = "";
- const char *server, *user, *pass, *mb;
- uint16_t port;
+ const char *mb;
int err = MAILIMAP_NO_ERROR;
@@ -351,30 +342,38 @@ QString IMAPwrapper::fetchBody(const QString & mailbox,const RecMail&mail)
- mb = mailbox.latin1();
- server = account->getServer().latin1();
- port = account->getPort().toUInt();
- user = account->getUser().latin1();
- pass = account->getPassword().latin1();
+ mb = mail.getMbox().latin1();
- mailimap *imap = mailimap_new( 20, &imap_progress );
- if ( imap == NULL ) {
- qDebug("IMAP Memory error");
+ login();
+ if (!m_imap) {
return body;
}
-
- /* connect */
- err = mailimap_socket_connect( imap, (char*)server, port );
- if ( err != MAILIMAP_NO_ERROR &&
- err != MAILIMAP_NO_ERROR_AUTHENTICATED &&
- err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) {
- qDebug("error connecting server: %s",imap->response);
- mailimap_free( imap );
+ /* select mailbox READONLY for operations */
+ err = mailimap_examine( m_imap, (char*)mb);
+ if ( err != MAILIMAP_NO_ERROR ) {
+ qDebug("error selecting mailbox: %s",m_imap->response);
+ logout();
return body;
}
+ result = clist_new();
+ /* the range has to start at 1!!! not with 0!!!! */
+ set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
+ fetchAtt = mailimap_fetch_att_new_rfc822_text();
+ fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
+ err = mailimap_fetch( m_imap, set, fetchType, &result );
+ mailimap_set_free( set );
+ mailimap_fetch_type_free( fetchType );
+
+ if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
+ mailimap_msg_att * msg_att;
+ msg_att = (mailimap_msg_att*)current->data;
+ mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->list->first->data;
+
+ if (item->msg_att_static && item->msg_att_static->rfc822_text) {
+ body = item->msg_att_static->rfc822_text;
+ }
+ } else {
+ qDebug("error fetching text: %s",m_imap->response);
+ }
- /* login */
- err = mailimap_login_simple( imap, (char*)user, (char*)pass );
- if ( err != MAILIMAP_NO_ERROR ) {
- qDebug("error logging in imap: %s",imap->response);
- err = mailimap_close( imap );
- mailimap_free( imap );
+ clist_free(result);
+ logout();
return body;
@@ -382,9 +381,26 @@ QString IMAPwrapper::fetchBody(const QString & mailbox,const RecMail&mail)
+#else
+QString IMAPwrapper::fetchBody(const RecMail&mail)
+{
+ QString body = "";
+ const char *mb;
+ int err = MAILIMAP_NO_ERROR;
+ clist *result;
+ clistcell *current;
+ mailimap_fetch_att *fetchAtt;
+ mailimap_fetch_type *fetchType;
+ mailimap_set *set;
+ mailimap_body*body_desc;
+
+ mb = mail.getMbox().latin1();
+
+ login();
+ if (!m_imap) {
+ return body;
+ }
/* select mailbox READONLY for operations */
- err = mailimap_examine( imap, (char*)mb);
+ err = mailimap_examine( m_imap, (char*)mb);
if ( err != MAILIMAP_NO_ERROR ) {
- qDebug("error selecting mailbox: %s",imap->response);
- err = mailimap_logout( imap );
- err = mailimap_close( imap );
- mailimap_free( imap );
+ qDebug("error selecting mailbox: %s",m_imap->response);
+ logout();
return body;
@@ -394,5 +410,5 @@ QString IMAPwrapper::fetchBody(const QString & mailbox,const RecMail&mail)
set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
- fetchAtt = mailimap_fetch_att_new_rfc822_text();
+ fetchAtt = mailimap_fetch_att_new_body();
fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
- err = mailimap_fetch( imap, set, fetchType, &result );
+ err = mailimap_fetch( m_imap, set, fetchType, &result );
mailimap_set_free( set );
@@ -404,17 +420,71 @@ QString IMAPwrapper::fetchBody(const QString & mailbox,const RecMail&mail)
mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->list->first->data;
-
- if (item->msg_att_static && item->msg_att_static->rfc822_text) {
- body = item->msg_att_static->rfc822_text;
+ body_desc = item->msg_att_static->body;
+ if (body_desc->type==MAILIMAP_BODY_1PART) {
+ body = searchBodyText(mail,body_desc->body_1part);
+ } else {
}
+
} else {
- qDebug("error fetching text: %s",imap->response);
+ qDebug("error fetching body: %s",m_imap->response);
}
- err = mailimap_logout( imap );
- err = mailimap_close( imap );
- mailimap_free( imap );
clist_free(result);
+ logout();
+ return body;
+}
+#endif
+QString IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription)
+{
+ QString Body="";
+ if (!mailDescription) {
+ return Body;
+ }
+ switch (mailDescription->type) {
+ case MAILIMAP_BODY_TYPE_1PART_TEXT:
+ return getPlainBody(mail);
+ break;
+ default:
+ break;
+ }
+ return Body;
+}
+
+QString IMAPwrapper::getPlainBody(const RecMail&mail)
+{
+ QString body = "";
+ const char *mb;
+ int err = MAILIMAP_NO_ERROR;
+ clist *result;
+ clistcell *current;
+ mailimap_fetch_att *fetchAtt;
+ mailimap_fetch_type *fetchType;
+ mailimap_set *set;
+
+ mb = mail.getMbox().latin1();
+
+ if (!m_imap) {
return body;
}
+ result = clist_new();
+ /* the range has to start at 1!!! not with 0!!!! */
+ set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
+ fetchAtt = mailimap_fetch_att_new_rfc822_text();
+ fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
+ err = mailimap_fetch( m_imap, set, fetchType, &result );
+ mailimap_set_free( set );
+ mailimap_fetch_type_free( fetchType );
+ if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
+ mailimap_msg_att * msg_att;
+ msg_att = (mailimap_msg_att*)current->data;
+ mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->list->first->data;
+ if (item->msg_att_static && item->msg_att_static->rfc822_text) {
+ body = item->msg_att_static->rfc822_text;
+ }
+ } else {
+ qDebug("error fetching text: %s",m_imap->response);
+ }
+ clist_free(result);
+ return body;
+}
diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.h b/noncore/net/mail/libmailwrapper/imapwrapper.h
index 65c36e0..b02d26d 100644
--- a/noncore/net/mail/libmailwrapper/imapwrapper.h
+++ b/noncore/net/mail/libmailwrapper/imapwrapper.h
@@ -4,3 +4,5 @@
#include "mailwrapper.h"
-#include <libetpan/mailimap.h>
+
+struct mailimap;
+struct mailimap_body_type_1part;
@@ -12,5 +14,7 @@ public:
IMAPwrapper( IMAPaccount *a );
+ virtual ~IMAPwrapper();
QList<IMAPFolder>* listFolders();
void listMessages(const QString & mailbox,Maillist&target );
- QString fetchBody(const QString & mailbox,const RecMail&mail);
+ QString fetchBody(const RecMail&mail);
+ static void imap_progress( size_t current, size_t maximum );
@@ -18,2 +22,6 @@ protected:
RecMail*parse_list_result(mailimap_msg_att*);
+ void login();
+ void logout();
+ QString searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription);
+ QString getPlainBody(const RecMail&mail);
@@ -21,3 +29,3 @@ private:
IMAPaccount *account;
-
+ mailimap *m_imap;
};
diff --git a/noncore/net/mail/libmailwrapper/mailwrapper.cpp b/noncore/net/mail/libmailwrapper/mailwrapper.cpp
index ea9e7b2..7f67cd8 100644
--- a/noncore/net/mail/libmailwrapper/mailwrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/mailwrapper.cpp
@@ -631,3 +631,3 @@ Mail::Mail()
RecMail::RecMail()
- :subject(""),date(""),msg_number(0),msg_flags(7)
+ :subject(""),date(""),mbox(""),msg_number(0),msg_flags(7)
{
diff --git a/noncore/net/mail/libmailwrapper/mailwrapper.h b/noncore/net/mail/libmailwrapper/mailwrapper.h
index 955a8e2..332034f 100644
--- a/noncore/net/mail/libmailwrapper/mailwrapper.h
+++ b/noncore/net/mail/libmailwrapper/mailwrapper.h
@@ -41,2 +41,13 @@ protected:
/* a class to describe mails in a mailbox */
+/* Attention!
+ From programmers point of view it would make sense to
+ store the mail body into this class, too.
+ But: not from the point of view of the device.
+ Mailbodies can be real large. So we request them when
+ needed from the mail-wrapper class direct from the server itself
+ (imap) or from a file-based cache (pop3?)
+ So there is no interface "const QString&body()" but you should
+ make a request to the mailwrapper with this class as parameter to
+ get the body. Same words for the attachments.
+*/
class RecMail
@@ -55,4 +66,6 @@ public:
void setSubject( const QString&s ) { subject = s; }
- void setFlags(const QBitArray&flags){msg_flags = flags;}
+ const QString&getMbox()const{return mbox;}
+ void setMbox(const QString&box){mbox = box;}
const QBitArray&getFlags()const{return msg_flags;}
+ void setFlags(const QBitArray&flags){msg_flags = flags;}
@@ -64,3 +77,3 @@ public:
protected:
- QString subject,date,from;
+ QString subject,date,from,mbox;
int msg_number;
diff --git a/noncore/net/mail/mailwrapper.cpp b/noncore/net/mail/mailwrapper.cpp
index ea9e7b2..7f67cd8 100644
--- a/noncore/net/mail/mailwrapper.cpp
+++ b/noncore/net/mail/mailwrapper.cpp
@@ -631,3 +631,3 @@ Mail::Mail()
RecMail::RecMail()
- :subject(""),date(""),msg_number(0),msg_flags(7)
+ :subject(""),date(""),mbox(""),msg_number(0),msg_flags(7)
{
diff --git a/noncore/net/mail/mailwrapper.h b/noncore/net/mail/mailwrapper.h
index 955a8e2..332034f 100644
--- a/noncore/net/mail/mailwrapper.h
+++ b/noncore/net/mail/mailwrapper.h
@@ -41,2 +41,13 @@ protected:
/* a class to describe mails in a mailbox */
+/* Attention!
+ From programmers point of view it would make sense to
+ store the mail body into this class, too.
+ But: not from the point of view of the device.
+ Mailbodies can be real large. So we request them when
+ needed from the mail-wrapper class direct from the server itself
+ (imap) or from a file-based cache (pop3?)
+ So there is no interface "const QString&body()" but you should
+ make a request to the mailwrapper with this class as parameter to
+ get the body. Same words for the attachments.
+*/
class RecMail
@@ -55,4 +66,6 @@ public:
void setSubject( const QString&s ) { subject = s; }
- void setFlags(const QBitArray&flags){msg_flags = flags;}
+ const QString&getMbox()const{return mbox;}
+ void setMbox(const QString&box){mbox = box;}
const QBitArray&getFlags()const{return msg_flags;}
+ void setFlags(const QBitArray&flags){msg_flags = flags;}
@@ -64,3 +77,3 @@ public:
protected:
- QString subject,date,from;
+ QString subject,date,from,mbox;
int msg_number;