-rw-r--r-- | noncore/net/mail/accountview.cpp | 1 | ||||
-rw-r--r-- | noncore/net/mail/accountview.h | 2 | ||||
-rw-r--r-- | noncore/net/mail/imapwrapper.cpp | 2 | ||||
-rw-r--r-- | noncore/net/mail/imapwrapper.h | 25 | ||||
-rw-r--r-- | noncore/net/mail/libmailwrapper/imapwrapper.cpp | 2 | ||||
-rw-r--r-- | noncore/net/mail/libmailwrapper/imapwrapper.h | 25 | ||||
-rw-r--r-- | noncore/net/mail/libmailwrapper/mailwrapper.h | 19 | ||||
-rw-r--r-- | noncore/net/mail/mail.pro | 3 | ||||
-rw-r--r-- | noncore/net/mail/mailwrapper.h | 19 |
9 files changed, 57 insertions, 41 deletions
diff --git a/noncore/net/mail/accountview.cpp b/noncore/net/mail/accountview.cpp index c6a44ab..a531976 100644 --- a/noncore/net/mail/accountview.cpp +++ b/noncore/net/mail/accountview.cpp @@ -1,110 +1,111 @@ #include "accountview.h" +#include "imapwrapper.h" #include "defines.h" IMAPviewItem::IMAPviewItem( IMAPaccount *a, QListView *parent ) : AccountViewItem( parent ) { account = a; wrapper = new IMAPwrapper( account ); setPixmap( 0, PIXMAP_IMAPFOLDER ); setText( 0, account->getAccountName() ); setOpen( true ); } IMAPviewItem::~IMAPviewItem() { delete wrapper; } IMAPwrapper *IMAPviewItem::getWrapper() { return wrapper; } void IMAPviewItem::refresh(Maillist&) { QList<IMAPFolder> *folders = wrapper->listFolders(); QListViewItem *child = firstChild(); while ( child ) { QListViewItem *tmp = child; child = child->nextSibling(); delete tmp; } IMAPFolder *it; for ( it = folders->first(); it; it = folders->next() ) { (void) new IMAPfolderItem( it, this ); } } IMAPfolderItem::~IMAPfolderItem() { delete folder; } IMAPfolderItem::IMAPfolderItem( IMAPFolder *folderInit, IMAPviewItem *parent ) : AccountViewItem( parent ) { folder = folderInit; imap = parent; setPixmap( 0, PIXMAP_IMAPFOLDER ); setText( 0, folder->getDisplayName() ); } void IMAPfolderItem::refresh(Maillist&target) { imap->getWrapper()->listMessages( folder->getName(),target ); } QString IMAPfolderItem::fetchBody(const RecMail&aMail) { return imap->getWrapper()->fetchBody(folder->getName(),aMail); } AccountView::AccountView( QWidget *parent, const char *name, WFlags flags ) : QListView( parent, name, flags ) { connect( this, SIGNAL( clicked( QListViewItem * ) ), SLOT( refresh( QListViewItem * ) ) ); } void AccountView::populate( QList<Account> list ) { clear(); Account *it; for ( it = list.first(); it; it = list.next() ) { if ( it->getType().compare( "IMAP" ) == 0 ) { IMAPaccount *imap = static_cast<IMAPaccount *>(it); qDebug( "added IMAP " + imap->getAccountName() ); (void) new IMAPviewItem( imap, this ); } } } void AccountView::refresh(QListViewItem *item) { qDebug("AccountView refresh..."); if ( item ) { Maillist headerlist; headerlist.setAutoDelete(true); AccountViewItem *view = static_cast<AccountViewItem *>(item); view->refresh(headerlist); emit refreshMailview(&headerlist); } } void AccountView::refreshAll() { } QString AccountView::fetchBody(const RecMail&aMail) { QString Body; QListViewItem*item = selectedItem (); if (!item) return Body; AccountViewItem *view = static_cast<AccountViewItem *>(item); return view->fetchBody(aMail); } diff --git a/noncore/net/mail/accountview.h b/noncore/net/mail/accountview.h index 14d8efa..2bc8023 100644 --- a/noncore/net/mail/accountview.h +++ b/noncore/net/mail/accountview.h @@ -1,67 +1,69 @@ #ifndef ACCOUNTVIEW_H #define ACCOUNTVIEW_H #include <qlistview.h> #include "settings.h" #include "mailwrapper.h" +class IMAPwrapper; + class AccountViewItem : public QListViewItem { public: AccountViewItem( QListView *parent ) : QListViewItem( parent ) {} AccountViewItem( QListViewItem *parent ) : QListViewItem( parent ) {} virtual void refresh(Maillist&)=0; virtual QString fetchBody(const RecMail&)=0; }; class IMAPviewItem : public AccountViewItem { public: IMAPviewItem( IMAPaccount *a, QListView *parent ); ~IMAPviewItem(); virtual void refresh(Maillist&); virtual QString fetchBody(const RecMail&){return "";} IMAPwrapper *getWrapper(); private: IMAPaccount *account; IMAPwrapper *wrapper; }; class IMAPfolderItem : public AccountViewItem { public: IMAPfolderItem( IMAPFolder *folder, IMAPviewItem *parent ); ~IMAPfolderItem(); virtual void refresh(Maillist&); virtual QString fetchBody(const RecMail&); private: IMAPFolder *folder; IMAPviewItem *imap; }; class AccountView : public QListView { Q_OBJECT public: AccountView( QWidget *parent = 0, const char *name = 0, WFlags flags = 0 ); void populate( QList<Account> list ); QString fetchBody(const RecMail&aMail); public slots: void refreshAll(); void refresh(QListViewItem *item); signals: void refreshMailview(Maillist*); }; #endif diff --git a/noncore/net/mail/imapwrapper.cpp b/noncore/net/mail/imapwrapper.cpp index fc12947..7b78499 100644 --- a/noncore/net/mail/imapwrapper.cpp +++ b/noncore/net/mail/imapwrapper.cpp @@ -1,420 +1,420 @@ #include <stdlib.h> -#include "mailwrapper.h" +#include "imapwrapper.h" IMAPwrapper::IMAPwrapper( IMAPaccount *a ) { account = a; } void imap_progress( size_t current, size_t maximum ) { qDebug( "IMAP: %i of %i", current, maximum ); } void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target ) { const char *server, *user, *pass, *mb; 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(); port = account->getPort().toUInt(); user = account->getUser().latin1(); pass = account->getPassword().latin1(); mailimap *imap = mailimap_new( 20, &imap_progress ); if ( imap == NULL ) { qDebug("IMAP Memory error"); return; } /* 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 ); return; } /* 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 ); return; } /* select mailbox READONLY for operations */ err = mailimap_examine( 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 ); return; } int last = imap->selection_info->exists; if (last == 0) { qDebug("mailbox has no mails"); err = mailimap_logout( imap ); err = mailimap_close( imap ); mailimap_free( imap ); return; } result = clist_new(); /* the range has to start at 1!!! not with 0!!!! */ set = mailimap_set_new_interval( 1, last ); fetchAtt = mailimap_fetch_att_new_envelope(); fetchAttFlags = mailimap_fetch_att_new_flags(); fetchAttDate = mailimap_fetch_att_new_internaldate(); //fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt); fetchType = mailimap_fetch_type_new_fetch_att_list_empty(); mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAtt); mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAttFlags); mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAttDate); err = mailimap_fetch( imap, set, fetchType, &result ); mailimap_set_free( set ); /* cleans up the fetch_att's too! */ mailimap_fetch_type_free( fetchType ); QString date,subject,from; if ( err == MAILIMAP_NO_ERROR ) { current = clist_begin(result); mailimap_msg_att * msg_att; int i = 0; while ( current != 0 ) { ++i; msg_att = (mailimap_msg_att*)current->data; RecMail*m = parse_list_result(msg_att); if (m) { m->setNumber(i); target.append(m); } current = current->next; } } else { qDebug("Error fetching headers: %s",imap->response); } err = mailimap_logout( imap ); err = mailimap_close( imap ); clist_free(result); mailimap_free( imap ); } QList<IMAPFolder>* IMAPwrapper::listFolders() { const char *server, *user, *pass, *path, *mask; uint16_t port; int err = MAILIMAP_NO_ERROR; clist *result; clistcell *current; QList<IMAPFolder> * folders = new QList<IMAPFolder>(); 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); return folders; } 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; } /* * First we have to check for INBOX 'cause it sometimes it's not inside the path. * We must not forget to filter them out in next loop! * it seems like ugly code. and yes - it is ugly code. but the best way. */ QString temp; mask = "INBOX" ; result = clist_new(); mailimap_mailbox_list *list; err = mailimap_list( imap, (char*)"", (char*)mask, &result ); if ( err == MAILIMAP_NO_ERROR ) { current = result->first; for ( int i = result->count; i > 0; i-- ) { list = (mailimap_mailbox_list *) current->data; // it is better use the deep copy mechanism of qt itself // instead of using strdup! temp = list->mb; folders->append( new IMAPFolder(temp)); current = current->next; } } else { qDebug("error fetching folders: %s",imap->response); } mailimap_list_result_free( result ); /* * second stage - get the other then inbox folders */ mask = "*" ; result = clist_new(); err = mailimap_list( imap, (char*)path, (char*)mask, &result ); if ( err == MAILIMAP_NO_ERROR ) { current = result->first; for ( int i = result->count; i > 0; i-- ) { list = (mailimap_mailbox_list *) current->data; // it is better use the deep copy mechanism of qt itself // instead of using strdup! temp = list->mb; current = current->next; if (temp.lower()=="inbox") continue; folders->append(new IMAPFolder(temp)); } } else { qDebug("error fetching folders"); } mailimap_list_result_free( result ); err = mailimap_logout( imap ); err = mailimap_close( imap ); mailimap_free( imap ); return folders; } RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att) { RecMail * m = 0; mailimap_msg_att_item *item=0; bool named_from = false; QString from,date,subject; date = from = subject = ""; clistcell *current,*c,*cf, *current_from = NULL; mailimap_address * current_address = NULL; mailimap_msg_att_dynamic*flist; mailimap_flag_fetch*cflag; QBitArray mFlags(7); if (!m_att) { return m; } #if 0 MAILIMAP_FLAG_KEYWORD, /* keyword flag */ MAILIMAP_FLAG_EXTENSION, /* \extension flag */ #endif c = clist_begin(m_att->list); while ( c ) { current = c; c = c->next; item = (mailimap_msg_att_item*)current->data; if (item->type!=MAILIMAP_MSG_ATT_ITEM_STATIC) { flist = (mailimap_msg_att_dynamic*)item->msg_att_dyn; if (!flist->list) { continue; } cf = flist->list->first; while (cf) { cflag = (mailimap_flag_fetch*)cf->data; if (cflag->type==MAILIMAP_FLAG_FETCH_OTHER && cflag->flag!=0) { switch (cflag->flag->type) { case MAILIMAP_FLAG_ANSWERED: /* \Answered flag */ mFlags.setBit(FLAG_ANSWERED); break; case MAILIMAP_FLAG_FLAGGED: /* \Flagged flag */ mFlags.setBit(FLAG_FLAGGED); break; case MAILIMAP_FLAG_DELETED: /* \Deleted flag */ mFlags.setBit(FLAG_DELETED); break; case MAILIMAP_FLAG_SEEN: /* \Seen flag */ mFlags.setBit(FLAG_SEEN); break; case MAILIMAP_FLAG_DRAFT: /* \Draft flag */ mFlags.setBit(FLAG_DRAFT); break; case MAILIMAP_FLAG_KEYWORD: /* keyword flag */ break; case MAILIMAP_FLAG_EXTENSION: /* \extension flag */ break; default: break; } } else if (cflag->type==MAILIMAP_FLAG_FETCH_RECENT) { mFlags.setBit(FLAG_RECENT); } cf = cf->next; } continue; } if ( item->msg_att_static->type == MAILIMAP_MSG_ATT_RFC822_HEADER ) { qDebug( "header: \n%s", item->msg_att_static->rfc822_header ); } else if (item->msg_att_static->type==MAILIMAP_MSG_ATT_ENVELOPE) { mailimap_envelope * head = item->msg_att_static->env; date = head->date; subject = head->subject; if (head->from!=NULL) current_from = head->from->list->first; while (current_from != NULL) { from = ""; named_from = false; current_address=(mailimap_address*)current_from->data; current_from = current_from->next; if (current_address->personal_name){ from+=QString(current_address->personal_name); from+=" "; named_from = true; } if (named_from && (current_address->mailbox_name || current_address->host_name)) { from+="<"; } if (current_address->mailbox_name) { from+=QString(current_address->mailbox_name); from+="@"; } if (current_address->host_name) { from+=QString(current_address->host_name); } if (named_from && (current_address->mailbox_name || current_address->host_name)) { from+=">"; } } qDebug("header: \nFrom: %s\nSubject: %s\nDate: %s", from.latin1(), subject.latin1(),date.latin1()); m = new RecMail(); m->setSubject(subject); m->setFrom(from); m->setDate(date); } else if (item->msg_att_static->type==MAILIMAP_MSG_ATT_INTERNALDATE) { mailimap_date_time*d = item->msg_att_static->internal_date; QDateTime da(QDate(d->year,d->month,d->day),QTime(d->hour,d->min,d->sec)); qDebug("%i %i %i - %i %i %i",d->year,d->month,d->day,d->hour,d->min,d->sec); qDebug(da.toString()); } else { qDebug("Another type"); } } /* msg is already deleted */ if (mFlags.testBit(FLAG_DELETED) && m) { delete m; m = 0; } if (m) { m->setFlags(mFlags); } return m; } QString IMAPwrapper::fetchBody(const QString & mailbox,const RecMail&mail) { QString body = ""; const char *server, *user, *pass, *mb; uint16_t port; int err = MAILIMAP_NO_ERROR; clist *result; clistcell *current; mailimap_fetch_att *fetchAtt; mailimap_fetch_type *fetchType; mailimap_set *set; mb = mailbox.latin1(); server = account->getServer().latin1(); port = account->getPort().toUInt(); user = account->getUser().latin1(); pass = account->getPassword().latin1(); mailimap *imap = mailimap_new( 20, &imap_progress ); if ( imap == NULL ) { qDebug("IMAP Memory error"); 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 ); return body; } /* 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 ); return body; } /* select mailbox READONLY for operations */ err = mailimap_examine( 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 ); 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( 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",imap->response); } err = mailimap_logout( imap ); err = mailimap_close( imap ); mailimap_free( imap ); clist_free(result); return body; } diff --git a/noncore/net/mail/imapwrapper.h b/noncore/net/mail/imapwrapper.h new file mode 100644 index 0000000..65c36e0 --- a/dev/null +++ b/noncore/net/mail/imapwrapper.h @@ -0,0 +1,25 @@ +#ifndef __IMAPWRAPPER +#define __IMAPWRAPPER + +#include "mailwrapper.h" +#include <libetpan/mailimap.h> + +class IMAPwrapper : public QObject +{ + Q_OBJECT + +public: + IMAPwrapper( IMAPaccount *a ); + QList<IMAPFolder>* listFolders(); + void listMessages(const QString & mailbox,Maillist&target ); + QString fetchBody(const QString & mailbox,const RecMail&mail); + +protected: + RecMail*parse_list_result(mailimap_msg_att*); + +private: + IMAPaccount *account; + +}; + +#endif diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.cpp b/noncore/net/mail/libmailwrapper/imapwrapper.cpp index fc12947..7b78499 100644 --- a/noncore/net/mail/libmailwrapper/imapwrapper.cpp +++ b/noncore/net/mail/libmailwrapper/imapwrapper.cpp @@ -1,420 +1,420 @@ #include <stdlib.h> -#include "mailwrapper.h" +#include "imapwrapper.h" IMAPwrapper::IMAPwrapper( IMAPaccount *a ) { account = a; } void imap_progress( size_t current, size_t maximum ) { qDebug( "IMAP: %i of %i", current, maximum ); } void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target ) { const char *server, *user, *pass, *mb; 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(); port = account->getPort().toUInt(); user = account->getUser().latin1(); pass = account->getPassword().latin1(); mailimap *imap = mailimap_new( 20, &imap_progress ); if ( imap == NULL ) { qDebug("IMAP Memory error"); return; } /* 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 ); return; } /* 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 ); return; } /* select mailbox READONLY for operations */ err = mailimap_examine( 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 ); return; } int last = imap->selection_info->exists; if (last == 0) { qDebug("mailbox has no mails"); err = mailimap_logout( imap ); err = mailimap_close( imap ); mailimap_free( imap ); return; } result = clist_new(); /* the range has to start at 1!!! not with 0!!!! */ set = mailimap_set_new_interval( 1, last ); fetchAtt = mailimap_fetch_att_new_envelope(); fetchAttFlags = mailimap_fetch_att_new_flags(); fetchAttDate = mailimap_fetch_att_new_internaldate(); //fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt); fetchType = mailimap_fetch_type_new_fetch_att_list_empty(); mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAtt); mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAttFlags); mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAttDate); err = mailimap_fetch( imap, set, fetchType, &result ); mailimap_set_free( set ); /* cleans up the fetch_att's too! */ mailimap_fetch_type_free( fetchType ); QString date,subject,from; if ( err == MAILIMAP_NO_ERROR ) { current = clist_begin(result); mailimap_msg_att * msg_att; int i = 0; while ( current != 0 ) { ++i; msg_att = (mailimap_msg_att*)current->data; RecMail*m = parse_list_result(msg_att); if (m) { m->setNumber(i); target.append(m); } current = current->next; } } else { qDebug("Error fetching headers: %s",imap->response); } err = mailimap_logout( imap ); err = mailimap_close( imap ); clist_free(result); mailimap_free( imap ); } QList<IMAPFolder>* IMAPwrapper::listFolders() { const char *server, *user, *pass, *path, *mask; uint16_t port; int err = MAILIMAP_NO_ERROR; clist *result; clistcell *current; QList<IMAPFolder> * folders = new QList<IMAPFolder>(); 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); return folders; } 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; } /* * First we have to check for INBOX 'cause it sometimes it's not inside the path. * We must not forget to filter them out in next loop! * it seems like ugly code. and yes - it is ugly code. but the best way. */ QString temp; mask = "INBOX" ; result = clist_new(); mailimap_mailbox_list *list; err = mailimap_list( imap, (char*)"", (char*)mask, &result ); if ( err == MAILIMAP_NO_ERROR ) { current = result->first; for ( int i = result->count; i > 0; i-- ) { list = (mailimap_mailbox_list *) current->data; // it is better use the deep copy mechanism of qt itself // instead of using strdup! temp = list->mb; folders->append( new IMAPFolder(temp)); current = current->next; } } else { qDebug("error fetching folders: %s",imap->response); } mailimap_list_result_free( result ); /* * second stage - get the other then inbox folders */ mask = "*" ; result = clist_new(); err = mailimap_list( imap, (char*)path, (char*)mask, &result ); if ( err == MAILIMAP_NO_ERROR ) { current = result->first; for ( int i = result->count; i > 0; i-- ) { list = (mailimap_mailbox_list *) current->data; // it is better use the deep copy mechanism of qt itself // instead of using strdup! temp = list->mb; current = current->next; if (temp.lower()=="inbox") continue; folders->append(new IMAPFolder(temp)); } } else { qDebug("error fetching folders"); } mailimap_list_result_free( result ); err = mailimap_logout( imap ); err = mailimap_close( imap ); mailimap_free( imap ); return folders; } RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att) { RecMail * m = 0; mailimap_msg_att_item *item=0; bool named_from = false; QString from,date,subject; date = from = subject = ""; clistcell *current,*c,*cf, *current_from = NULL; mailimap_address * current_address = NULL; mailimap_msg_att_dynamic*flist; mailimap_flag_fetch*cflag; QBitArray mFlags(7); if (!m_att) { return m; } #if 0 MAILIMAP_FLAG_KEYWORD, /* keyword flag */ MAILIMAP_FLAG_EXTENSION, /* \extension flag */ #endif c = clist_begin(m_att->list); while ( c ) { current = c; c = c->next; item = (mailimap_msg_att_item*)current->data; if (item->type!=MAILIMAP_MSG_ATT_ITEM_STATIC) { flist = (mailimap_msg_att_dynamic*)item->msg_att_dyn; if (!flist->list) { continue; } cf = flist->list->first; while (cf) { cflag = (mailimap_flag_fetch*)cf->data; if (cflag->type==MAILIMAP_FLAG_FETCH_OTHER && cflag->flag!=0) { switch (cflag->flag->type) { case MAILIMAP_FLAG_ANSWERED: /* \Answered flag */ mFlags.setBit(FLAG_ANSWERED); break; case MAILIMAP_FLAG_FLAGGED: /* \Flagged flag */ mFlags.setBit(FLAG_FLAGGED); break; case MAILIMAP_FLAG_DELETED: /* \Deleted flag */ mFlags.setBit(FLAG_DELETED); break; case MAILIMAP_FLAG_SEEN: /* \Seen flag */ mFlags.setBit(FLAG_SEEN); break; case MAILIMAP_FLAG_DRAFT: /* \Draft flag */ mFlags.setBit(FLAG_DRAFT); break; case MAILIMAP_FLAG_KEYWORD: /* keyword flag */ break; case MAILIMAP_FLAG_EXTENSION: /* \extension flag */ break; default: break; } } else if (cflag->type==MAILIMAP_FLAG_FETCH_RECENT) { mFlags.setBit(FLAG_RECENT); } cf = cf->next; } continue; } if ( item->msg_att_static->type == MAILIMAP_MSG_ATT_RFC822_HEADER ) { qDebug( "header: \n%s", item->msg_att_static->rfc822_header ); } else if (item->msg_att_static->type==MAILIMAP_MSG_ATT_ENVELOPE) { mailimap_envelope * head = item->msg_att_static->env; date = head->date; subject = head->subject; if (head->from!=NULL) current_from = head->from->list->first; while (current_from != NULL) { from = ""; named_from = false; current_address=(mailimap_address*)current_from->data; current_from = current_from->next; if (current_address->personal_name){ from+=QString(current_address->personal_name); from+=" "; named_from = true; } if (named_from && (current_address->mailbox_name || current_address->host_name)) { from+="<"; } if (current_address->mailbox_name) { from+=QString(current_address->mailbox_name); from+="@"; } if (current_address->host_name) { from+=QString(current_address->host_name); } if (named_from && (current_address->mailbox_name || current_address->host_name)) { from+=">"; } } qDebug("header: \nFrom: %s\nSubject: %s\nDate: %s", from.latin1(), subject.latin1(),date.latin1()); m = new RecMail(); m->setSubject(subject); m->setFrom(from); m->setDate(date); } else if (item->msg_att_static->type==MAILIMAP_MSG_ATT_INTERNALDATE) { mailimap_date_time*d = item->msg_att_static->internal_date; QDateTime da(QDate(d->year,d->month,d->day),QTime(d->hour,d->min,d->sec)); qDebug("%i %i %i - %i %i %i",d->year,d->month,d->day,d->hour,d->min,d->sec); qDebug(da.toString()); } else { qDebug("Another type"); } } /* msg is already deleted */ if (mFlags.testBit(FLAG_DELETED) && m) { delete m; m = 0; } if (m) { m->setFlags(mFlags); } return m; } QString IMAPwrapper::fetchBody(const QString & mailbox,const RecMail&mail) { QString body = ""; const char *server, *user, *pass, *mb; uint16_t port; int err = MAILIMAP_NO_ERROR; clist *result; clistcell *current; mailimap_fetch_att *fetchAtt; mailimap_fetch_type *fetchType; mailimap_set *set; mb = mailbox.latin1(); server = account->getServer().latin1(); port = account->getPort().toUInt(); user = account->getUser().latin1(); pass = account->getPassword().latin1(); mailimap *imap = mailimap_new( 20, &imap_progress ); if ( imap == NULL ) { qDebug("IMAP Memory error"); 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 ); return body; } /* 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 ); return body; } /* select mailbox READONLY for operations */ err = mailimap_examine( 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 ); 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( 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",imap->response); } err = mailimap_logout( imap ); err = mailimap_close( imap ); mailimap_free( imap ); clist_free(result); return body; } diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.h b/noncore/net/mail/libmailwrapper/imapwrapper.h new file mode 100644 index 0000000..65c36e0 --- a/dev/null +++ b/noncore/net/mail/libmailwrapper/imapwrapper.h @@ -0,0 +1,25 @@ +#ifndef __IMAPWRAPPER +#define __IMAPWRAPPER + +#include "mailwrapper.h" +#include <libetpan/mailimap.h> + +class IMAPwrapper : public QObject +{ + Q_OBJECT + +public: + IMAPwrapper( IMAPaccount *a ); + QList<IMAPFolder>* listFolders(); + void listMessages(const QString & mailbox,Maillist&target ); + QString fetchBody(const QString & mailbox,const RecMail&mail); + +protected: + RecMail*parse_list_result(mailimap_msg_att*); + +private: + IMAPaccount *account; + +}; + +#endif diff --git a/noncore/net/mail/libmailwrapper/mailwrapper.h b/noncore/net/mail/libmailwrapper/mailwrapper.h index f45eab7..955a8e2 100644 --- a/noncore/net/mail/libmailwrapper/mailwrapper.h +++ b/noncore/net/mail/libmailwrapper/mailwrapper.h @@ -1,183 +1,164 @@ #ifndef MAILWRAPPER_H #define MAILWRAPPER_H #include <qpe/applnk.h> #include <libetpan/mailmime.h> #include <libetpan/mailimf.h> #include <libetpan/mailsmtp.h> -#include <libetpan/mailimap.h> #include <libetpan/mailstorage.h> #include <libetpan/maildriver.h> #include <qbitarray.h> #include <qdatetime.h> #include "settings.h" class Attachment { public: Attachment( DocLnk lnk ); virtual ~Attachment(){} const QString getFileName()const{ return doc.file(); } const QString getName()const{ return doc.name(); } const QString getMimeType()const{ return doc.type(); } const QPixmap getPixmap()const{ return doc.pixmap(); } const int getSize()const { return size; } DocLnk getDocLnk() { return doc; } protected: DocLnk doc; int size; }; #define FLAG_ANSWERED 0 #define FLAG_FLAGGED 1 #define FLAG_DELETED 2 #define FLAG_SEEN 3 #define FLAG_DRAFT 4 #define FLAG_RECENT 5 /* a class to describe mails in a mailbox */ class RecMail { public: RecMail(); virtual ~RecMail(){} const int getNumber()const{return msg_number;} void setNumber(int number){msg_number=number;} const QString&getDate()const{ return date; } void setDate( const QString&a ) { date = a; } const QString&getFrom()const{ return from; } void setFrom( const QString&a ) { from = a; } const QString&getSubject()const { return subject; } void setSubject( const QString&s ) { subject = s; } void setFlags(const QBitArray&flags){msg_flags = flags;} const QBitArray&getFlags()const{return msg_flags;} #if 0 void setDate(const QString&dstring); void setDate(const QDateTime&date){mDate = date;} QString getDate()const{return mDate.toString();} #endif protected: QString subject,date,from; int msg_number; QBitArray msg_flags; #if 0 QDateTime mDate; #endif }; typedef QList<RecMail> Maillist; class Mail { public: Mail(); /* Possible that this destructor must not be declared virtual * 'cause it seems that it will never have some child classes. * in this case this object will not get a virtual table -> memory and * speed will be a little bit better? */ virtual ~Mail(){} void addAttachment( Attachment *att ) { attList.append( att ); } const QList<Attachment>& getAttachments()const { return attList; } void removeAttachment( Attachment *att ) { attList.remove( att ); } const QString&getName()const { return name; } void setName( QString s ) { name = s; } const QString&getMail()const{ return mail; } void setMail( const QString&s ) { mail = s; } const QString&getTo()const{ return to; } void setTo( const QString&s ) { to = s; } const QString&getCC()const{ return cc; } void setCC( const QString&s ) { cc = s; } const QString&getBCC()const { return bcc; } void setBCC( const QString&s ) { bcc = s; } const QString&getMessage()const { return message; } void setMessage( const QString&s ) { message = s; } const QString&getSubject()const { return subject; } void setSubject( const QString&s ) { subject = s; } const QString&getReply()const{ return reply; } void setReply( const QString&a ) { reply = a; } private: QList<Attachment> attList; QString name, mail, to, cc, bcc, reply, subject, message; }; class Folder : public QObject { Q_OBJECT public: Folder( const QString&init_name ); const QString&getDisplayName()const { return nameDisplay; } const QString&getName()const { return name; } virtual bool may_select()const{return true;}; private: QString nameDisplay, name; }; class IMAPFolder : public Folder { public: IMAPFolder( QString name,bool select=true ) : Folder( name ),m_MaySelect(select) {} virtual bool may_select()const{return m_MaySelect;} private: bool m_MaySelect; }; class MailWrapper : public QObject { Q_OBJECT public: MailWrapper( Settings *s ); void sendMail( Mail mail ); private: mailimf_mailbox *newMailbox(const QString&name,const QString&mail ); mailimf_address_list *parseAddresses(const QString&addr ); mailimf_fields *createImfFields( Mail *mail ); mailmime *buildTxtPart( QString str ); mailmime *buildFilePart( QString filename, QString mimetype ); void addFileParts( mailmime *message, QList<Attachment> files ); mailmime *createMimeMail( Mail *mail ); void smtpSend( mailmime *mail ); mailimf_field *getField( mailimf_fields *fields, int type ); clist *createRcptList( mailimf_fields *fields ); char *getFrom( mailmime *mail ); SMTPaccount *getAccount( QString from ); void writeToFile( QString file, mailmime *mail ); void readFromFile( QString file, char **data, size_t *size ); static QString mailsmtpError( int err ); static QString getTmpFile(); Settings *settings; }; -class IMAPwrapper : public QObject -{ - Q_OBJECT - -public: - IMAPwrapper( IMAPaccount *a ); - QList<IMAPFolder>* listFolders(); - void listMessages(const QString & mailbox,Maillist&target ); - QString fetchBody(const QString & mailbox,const RecMail&mail); - -protected: - RecMail*parse_list_result(mailimap_msg_att*); - -private: - IMAPaccount *account; - -}; - #endif diff --git a/noncore/net/mail/mail.pro b/noncore/net/mail/mail.pro index 46a476d..2142cdc 100644 --- a/noncore/net/mail/mail.pro +++ b/noncore/net/mail/mail.pro @@ -1,39 +1,40 @@ CONFIG += qt warn_on debug quick-app HEADERS = defines.h \ logindialog.h \ settings.h \ editaccounts.h \ mailwrapper.h \ composemail.h \ accountview.h \ mainwindow.h \ - opiemail.h + opiemail.h \ + imapwrapper.h SOURCES = main.cpp \ opiemail.cpp \ mainwindow.cpp \ accountview.cpp \ composemail.cpp \ mailwrapper.cpp \ imapwrapper.cpp \ addresspicker.cpp \ editaccounts.cpp \ logindialog.cpp \ settings.cpp INTERFACES = editaccountsui.ui \ selectmailtypeui.ui \ imapconfigui.ui \ pop3configui.ui \ nntpconfigui.ui \ smtpconfigui.ui \ addresspickerui.ui \ logindialogui.ui \ composemailui.ui INCLUDEPATH += $(OPIEDIR)/include LIBS += -lqpe -lopie -letpan -lssl -lcrypto -ldb TARGET = opiemail include ( $(OPIEDIR)/include.pro ) diff --git a/noncore/net/mail/mailwrapper.h b/noncore/net/mail/mailwrapper.h index f45eab7..955a8e2 100644 --- a/noncore/net/mail/mailwrapper.h +++ b/noncore/net/mail/mailwrapper.h @@ -1,183 +1,164 @@ #ifndef MAILWRAPPER_H #define MAILWRAPPER_H #include <qpe/applnk.h> #include <libetpan/mailmime.h> #include <libetpan/mailimf.h> #include <libetpan/mailsmtp.h> -#include <libetpan/mailimap.h> #include <libetpan/mailstorage.h> #include <libetpan/maildriver.h> #include <qbitarray.h> #include <qdatetime.h> #include "settings.h" class Attachment { public: Attachment( DocLnk lnk ); virtual ~Attachment(){} const QString getFileName()const{ return doc.file(); } const QString getName()const{ return doc.name(); } const QString getMimeType()const{ return doc.type(); } const QPixmap getPixmap()const{ return doc.pixmap(); } const int getSize()const { return size; } DocLnk getDocLnk() { return doc; } protected: DocLnk doc; int size; }; #define FLAG_ANSWERED 0 #define FLAG_FLAGGED 1 #define FLAG_DELETED 2 #define FLAG_SEEN 3 #define FLAG_DRAFT 4 #define FLAG_RECENT 5 /* a class to describe mails in a mailbox */ class RecMail { public: RecMail(); virtual ~RecMail(){} const int getNumber()const{return msg_number;} void setNumber(int number){msg_number=number;} const QString&getDate()const{ return date; } void setDate( const QString&a ) { date = a; } const QString&getFrom()const{ return from; } void setFrom( const QString&a ) { from = a; } const QString&getSubject()const { return subject; } void setSubject( const QString&s ) { subject = s; } void setFlags(const QBitArray&flags){msg_flags = flags;} const QBitArray&getFlags()const{return msg_flags;} #if 0 void setDate(const QString&dstring); void setDate(const QDateTime&date){mDate = date;} QString getDate()const{return mDate.toString();} #endif protected: QString subject,date,from; int msg_number; QBitArray msg_flags; #if 0 QDateTime mDate; #endif }; typedef QList<RecMail> Maillist; class Mail { public: Mail(); /* Possible that this destructor must not be declared virtual * 'cause it seems that it will never have some child classes. * in this case this object will not get a virtual table -> memory and * speed will be a little bit better? */ virtual ~Mail(){} void addAttachment( Attachment *att ) { attList.append( att ); } const QList<Attachment>& getAttachments()const { return attList; } void removeAttachment( Attachment *att ) { attList.remove( att ); } const QString&getName()const { return name; } void setName( QString s ) { name = s; } const QString&getMail()const{ return mail; } void setMail( const QString&s ) { mail = s; } const QString&getTo()const{ return to; } void setTo( const QString&s ) { to = s; } const QString&getCC()const{ return cc; } void setCC( const QString&s ) { cc = s; } const QString&getBCC()const { return bcc; } void setBCC( const QString&s ) { bcc = s; } const QString&getMessage()const { return message; } void setMessage( const QString&s ) { message = s; } const QString&getSubject()const { return subject; } void setSubject( const QString&s ) { subject = s; } const QString&getReply()const{ return reply; } void setReply( const QString&a ) { reply = a; } private: QList<Attachment> attList; QString name, mail, to, cc, bcc, reply, subject, message; }; class Folder : public QObject { Q_OBJECT public: Folder( const QString&init_name ); const QString&getDisplayName()const { return nameDisplay; } const QString&getName()const { return name; } virtual bool may_select()const{return true;}; private: QString nameDisplay, name; }; class IMAPFolder : public Folder { public: IMAPFolder( QString name,bool select=true ) : Folder( name ),m_MaySelect(select) {} virtual bool may_select()const{return m_MaySelect;} private: bool m_MaySelect; }; class MailWrapper : public QObject { Q_OBJECT public: MailWrapper( Settings *s ); void sendMail( Mail mail ); private: mailimf_mailbox *newMailbox(const QString&name,const QString&mail ); mailimf_address_list *parseAddresses(const QString&addr ); mailimf_fields *createImfFields( Mail *mail ); mailmime *buildTxtPart( QString str ); mailmime *buildFilePart( QString filename, QString mimetype ); void addFileParts( mailmime *message, QList<Attachment> files ); mailmime *createMimeMail( Mail *mail ); void smtpSend( mailmime *mail ); mailimf_field *getField( mailimf_fields *fields, int type ); clist *createRcptList( mailimf_fields *fields ); char *getFrom( mailmime *mail ); SMTPaccount *getAccount( QString from ); void writeToFile( QString file, mailmime *mail ); void readFromFile( QString file, char **data, size_t *size ); static QString mailsmtpError( int err ); static QString getTmpFile(); Settings *settings; }; -class IMAPwrapper : public QObject -{ - Q_OBJECT - -public: - IMAPwrapper( IMAPaccount *a ); - QList<IMAPFolder>* listFolders(); - void listMessages(const QString & mailbox,Maillist&target ); - QString fetchBody(const QString & mailbox,const RecMail&mail); - -protected: - RecMail*parse_list_result(mailimap_msg_att*); - -private: - IMAPaccount *account; - -}; - #endif |